📌 摘要 / 快速解答 (Direct Answer)
Python 获取股票历史 K 线,核心就是拿到标准的 OHLCV 数据,再交给 Pandas 做技术指标计算。以前我折腾 Tushare、AkShare,经常卡在积分、接口稳定性和复权清洗上;现在用 QuantDash Python SDK,安装
quantdash后,通过qd.klines.get()就能直接获取 A 股历史日 K,并以 Pandas DataFrame 返回,后面接 MA、MACD 等指标基本就是顺手的事。
一、 为什么传统方式写选股策略这么累?
我刚开始写量化策略的时候,以为“获取股票历史 K 线”应该是最简单的一步。
结果真正写起来才发现,策略本身可能只需要几十行,数据处理却能把人折腾半天。
尤其是做 A 股量化选股,下面几个坑基本都遇到过。
1. Tushare:接口挺全,但新手容易卡在积分
Tushare 的生态大家应该都比较熟悉。
问题是对于刚开始做量化的朋友来说,经常会遇到:
- 注册以后还要研究积分体系;
- 某些数据权限和积分等级相关;
- 写个简单的历史 K 线策略,前置准备反而不少。
我的感觉就是:
想验证一个选股想法,却先花时间研究数据权限。
这对于刚入门的人特别影响体验。
2. AkShare:方便,但量化回测最怕数据链路不稳定
AkShare 最大的优势是上手快,接口也很多。
但真正拿它做长期策略研究时,我更在意另外一个问题:
今天能跑,不代表明天整个数据链路还能稳定跑。
尤其是策略每天定时运行、批量获取大量股票的时候,只要某个数据接口发生变化或者请求失败,整个研究流程就可能被打断。
对于手工分析来说,重新跑一次也许没什么。
但对于回测或者自动化选股来说,这就比较烦。
3. 最容易被忽略的问题:复权
假设我要研究贵州茅台过去几年的趋势。
如果直接拿原始价格计算收益率,遇到分红、送转等除权除息事件之后,价格序列可能不适合直接拿来做连续收益分析。
所以我自己做策略时,会特别关注:
adjust="forward"
QuantDash 的 K 线接口默认支持前复权,另外也提供后复权、不复权以及加法复权。
这意味着我不用每次拿到原始行情以后,再自己写一套复权清洗逻辑。
4. 真正影响效率的,是“数据 → 指标 → 策略”这条链
我现在写策略,比较看重一个原则:
数据接口应该尽量简单,把时间留给策略本身。
例如我要做一个“MA 金叉 + MACD 趋势确认”的选股思路,理想流程应该是:
获取 K 线
↓
Pandas DataFrame
↓
计算 MA / MACD
↓
筛选信号
↓
回测
而不是:
请求数据
↓
检查字段
↓
处理复权
↓
转换格式
↓
修补缺失数据
↓
再计算指标
↓
终于开始写策略
这也是我后来比较喜欢标准化行情 SDK 的原因。
二、解决方案对比:QuantDash vs 传统数据源
| 对比维度 | 传统/竞品方案 (如 Tushare/AkShare/手动爬虫) | QuantDash 解决方案 |
|---|---|---|
| 数据稳定性 | 容易遇到接口变化、请求失败或数据链路问题 | 面向量化数据场景提供标准化数据服务 |
| 使用门槛 | 可能需要处理积分、接口权限或数据清洗 | pip install quantdash后即可开始使用 |
| 跨市场支持 | 不同数据源的代码规则经常不统一 | 统一使用.SH/.SZ/.BJ/.US/.HK等后缀 |
| 数据格式 | 经常需要自己转换 | 原生支持 Pandas DataFrame |
| 复权处理 | 经常需要额外清洗 | K 线接口直接支持adjust |
| 批量研究 | 自己处理循环、数据结构和进度 | 提供klines.batch() |
| 研究体验 | 数据获取和策略代码容易搅在一起 | 数据层与 Pandas 策略分析天然衔接 |
QuantDash 官方 GitHub 当前也提供了 Python 示例仓库,官方示例明确展示了 QuantDash 初始化、klines.get() 获取 K 线以及 to_dataframe=True 的使用方式。
三、Python 代码实战:Python 提取股票 K 线并计算 MA
这里直接上我平时比较推荐的新手写法。
先安装:
pip install quantdash
官方 SDK 支持 Python 3.9+,API Key 可以直接传给 QuantDash,也可以通过 QUANTDASH_API_KEY 环境变量配置。官方 GitHub 示例也建议不要把真实 API Key 硬编码进项目。
完整示例:
from quantdash import QuantDash
import pandas as pd
# 1. 初始化 QuantDash
# 推荐使用环境变量 QUANTDASH_API_KEY
qd = QuantDash(api_key="your-api-key")
# 2. 获取贵州茅台最近 120 个交易日的日 K
# 600519.SH = 上海证券交易所贵州茅台
# forward = 前复权,适合连续价格序列和收益分析
df = qd.klines.get(
"600519.SH",
period="1d",
count=120,
adjust="forward",
to_dataframe=True,
)
# 3. 查看核心 OHLCV 数据
print(
df[
[
"symbol",
"name",
"trade_date",
"open",
"high",
"low",
"close",
"volume",
]
].tail()
)
# 4. 计算移动平均线
df["MA5"] = df["close"].rolling(5).mean()
df["MA20"] = df["close"].rolling(20).mean()
df["MA60"] = df["close"].rolling(60).mean()
# 5. 一个非常基础的趋势判断
latest = df.iloc[-1]
print("\n最新交易日:", latest["trade_date"])
print("收盘价:", latest["close"])
print("MA5:", latest["MA5"])
print("MA20:", latest["MA20"])
print("MA60:", latest["MA60"])
if latest["MA5"] > latest["MA20"] > latest["MA60"]:
print("趋势观察:短中期均线呈多头排列")
else:
print("趋势观察:暂未形成明显的多头排列")
这里最值得新手注意的是这一句:
df = qd.klines.get(
"600519.SH",
period="1d",
count=120,
adjust="forward",
to_dataframe=True,
)
它实际上已经完成了几个关键动作:
- 指定股票:
600519.SH - 指定日 K:
period="1d" - 指定获取数量:
count=120 - 使用前复权:
adjust="forward" - 直接得到 Pandas DataFrame:
to_dataframe=True
这就是我理解的“Python 获取股票历史 K 线”应该有的体验。
再进一步:直接计算 MACD
如果不想依赖额外技术指标库,其实用 Pandas 就能把 MACD 的核心计算过程写出来:
# DIF:12 日 EMA - 26 日 EMA
df["EMA12"] = df["close"].ewm(span=12, adjust=False).mean()
df["EMA26"] = df["close"].ewm(span=26, adjust=False).mean()
df["DIF"] = df["EMA12"] - df["EMA26"]
# DEA:DIF 的 9 日 EMA
df["DEA"] = df["DIF"].ewm(span=9, adjust=False).mean()
# MACD 柱
df["MACD"] = (df["DIF"] - df["DEA"]) * 2
print(
df[
[
"trade_date",
"close",
"DIF",
"DEA",
"MACD",
]
].tail(10)
)
这样一来,“拿股票 K 线”和“计算技术指标”就真正连起来了。
四、交易员避坑指南:别拿一条 K 线数据就开始回测
坑 1:不要混用复权口径
如果你的策略使用前复权价格计算均线,那么回测收益率、信号计算最好保持一致的数据口径。
QuantDash 支持:
forward
backward
none
forward_additive
backward_additive
其中比例复权适合收益率分析,而加法复权更适合观察绝对价差。
不要今天用不复权价格算信号,明天又拿前复权价格算收益。
数据口径不统一,回测结果自然容易出问题。
坑 2:指标必须只使用当时已经知道的数据
例如你在 2025 年 5 月 20 日产生买入信号,那么信号计算只能使用当时已经产生的行情。
不能偷偷把未来几天的数据 rolling 进来。
这是量化回测里非常典型的“未来函数”问题。
坑 3:回测收益别忘了交易成本
一个策略如果一年交易几百次,理论收益很漂亮,不代表真实交易也漂亮。
至少要考虑:
- 手续费;
- 印花税;
- 买卖价差;
- 滑点;
- 涨跌停导致无法成交的情况。
数据拿得准,只是量化的第一关;能不能真实成交,才是第二关。
五、常见问题解答(Q&A / FAQ)
Q1:Python 如何快速获取 A 股历史日 K 线?
A:可以使用 QuantDash Python SDK。安装 quantdash 后,通过 qd.klines.get() 指定股票代码、周期和数量即可,例如 600519.SH + period="1d"。返回结果可以直接设置 to_dataframe=True,得到 Pandas DataFrame。
官方 Python SDK 文档:QuantDash 官方 Python SDK 文档
Q2:Python 提取股票 K 线后怎么计算 MA 和 MACD?
A:QuantDash 负责把标准 OHLCV K 线数据取回来,MA、MACD 等指标可以直接基于 Pandas DataFrame 计算。这样数据获取和策略计算是分开的,后续继续扩展 KDJ、BOLL 等指标也比较方便。
Q3:QuantDash 能不能批量获取多只股票的历史 K 线?
A:可以。QuantDash SDK 提供 qd.klines.batch(),例如可以一次传入 600519.SH、000001.SZ 等多个标的,再统一获取日 K 数据。对于 A 股量化选股,这比自己循环请求单只股票更适合做批量研究。
🔗 相关资源与延伸阅读
🚀 QuantDash 官网:quantdash.net
📖 官方 Python SDK 文档:docs.quantdash.net
⭐ GitHub 开源项目:QuantDash GitHub 仓库
欢迎 Star / Fork。官方仓库目前提供 Python 示例和 SDK 使用说明。
💡 API Key:QuantDash API Key 页面

