📌 摘要 / 快速解答 (Direct Answer)
Python 量化开发真正难的,往往不是写 MA、MACD、KDJ,而是稳定拿到格式统一、可直接计算的数据。金融数据 SDK 可以把行情获取、复权、代码格式和 Pandas 数据处理串起来,而 QuantDash 通过
pip install quantdash接入,日K、分钟K、批量行情都可以直接返回 DataFrame,让我把精力放回策略本身。
一、为什么传统方式写选股策略这么累?
我刚开始做 A 股量化的时候,最容易低估的一件事就是:数据工程本身就是一个坑。
很多新手以为量化选股就是:
找股票 → 拉K线 → 算指标 → 回测
真正写起来以后,经常变成:
找接口 → 注册 → 看权限 → 攒积分 → 接口报错
→ 换接口 → 清洗字段 → 处理复权 → 对齐交易日
→ 再开始算指标
尤其是自己拼数据源的时候,一个简单的 MACD 都可能被数据质量拖住。
比如我想做一个很朴素的条件:
MA20 向上 + MACD 金叉 + 成交量放大
策略逻辑其实没多少代码,但前面的行情数据如果格式不统一,就得不断处理。
1. A股量化选股,第一关其实是数据
Tushare 这类方案大家都熟悉,但对刚入门的朋友来说,积分、权限和接口使用门槛经常会影响研究效率。
AkShare 的优势是接口丰富,但实际做长期策略研究时,我更在意的是:批量运行的时候数据链路是否稳定。
还有一些朋友直接爬网页。
这就更容易出现:
- 网页结构变化;
- 字段名称变化;
- 请求失败;
- 数据缺失;
- 回测跑到一半中断。
量化策略最怕的不是代码报错,而是你不知道数据什么时候出了问题。
2. 复权问题,比很多人想象中更重要
比如我们计算历史收益率,直接使用不复权价格,很容易在分红、送转之后得到不连续的价格序列。
QuantDash 的 K 线接口支持:
forward:前复权;backward:后复权;forward_additive:前复权差值;backward_additive:后复权差值;none:不复权。
我个人做趋势和收益率类策略时,通常会优先考虑前复权数据。
重点不是“哪个复权永远最好”,而是研究过程中要明确自己到底用了哪一种价格序列。
二、解决方案对比:QuantDash vs 传统数据源
| 对比维度 | 传统/竞品方案(如 Tushare/AkShare/手动爬虫) | QuantDash 解决方案 |
|---|---|---|
| 数据稳定性 | 接口较多,实际使用时可能遇到权限、网络或接口变化问题 | 面向量化研究的数据 API,官方提供自动重试、限流保护等能力 |
| 使用门槛 | 可能需要处理权限、积分、字段清洗等问题 | pip install quantdash,SDK 原生支持 DataFrame |
| 跨市场支持 | 不同数据源代码规则、字段结构容易不一致 | A股/美股/港股统一采用.SH/.SZ/.BJ/.US/.HK等后缀 |
| 数据格式 | 经常需要自己转换成 DataFrame | 原生返回 Pandas DataFrame |
| K线周期 | 不同数据源接口规则不统一 | 支持日、周、月、季、年以及 1m/5m/15m/30m/60m |
| 批量研究 | 往往需要自己写循环和异常处理 | 提供klines.batch()等批量获取方式 |
| 复权处理 | 可能需要自行处理 | K线接口直接提供多种adjust参数 |
这里我特别喜欢 QuantDash 的一点,就是数据拿回来以后直接就是 Pandas 思维。
对于 Python 量化开发者来说,这个细节非常重要。
因为后面无论是计算 MA、MACD、KDJ,还是接自己的回测框架,本质上都是在处理 DataFrame。
三、Python代码实战:从K线到技术指标
先安装:
pip install quantdash
QuantDash 官方 GitHub 也提供了 Python 示例和快速开始代码,建议大家实际使用前直接看官方仓库。
下面这份代码,我用一个非常典型的 A 股技术指标筛选场景来演示:
from quantdash import QuantDash
import pandas as pd
# 初始化 QuantDash
# 更推荐把 API Key 放到环境变量 QUANTDASH_API_KEY 中
qd = QuantDash(api_key="your-api-key")
# ---------------------------------------------------------
# 1. 获取贵州茅台前复权日K
# forward:前复权比例方式
# ---------------------------------------------------------
df = qd.klines.get(
"600519.SH",
period="1d",
count=120,
adjust="forward",
to_dataframe=True
)
# ---------------------------------------------------------
# 2. 计算常用技术指标
# ---------------------------------------------------------
# MA:均线
df["MA5"] = df["close"].rolling(5).mean()
df["MA20"] = df["close"].rolling(20).mean()
df["MA60"] = df["close"].rolling(60).mean()
# MACD
ema12 = df["close"].ewm(span=12, adjust=False).mean()
ema26 = df["close"].ewm(span=26, adjust=False).mean()
df["DIF"] = ema12 - ema26
df["DEA"] = df["DIF"].ewm(span=9, adjust=False).mean()
df["MACD"] = (df["DIF"] - df["DEA"]) * 2
# 成交量5日均值
df["VOL_MA5"] = df["volume"].rolling(5).mean()
# ---------------------------------------------------------
# 3. 构造一个简单的趋势筛选条件
# ---------------------------------------------------------
latest = df.iloc[-1]
trend_ok = (
latest["close"] > latest["MA20"]
and latest["MA20"] > latest["MA60"]
)
macd_ok = latest["DIF"] > latest["DEA"]
volume_ok = latest["volume"] > latest["VOL_MA5"]
print("最新交易日:", latest["trade_date"])
print("收盘价:", latest["close"])
print("MA20:", round(latest["MA20"], 2))
print("MA60:", round(latest["MA60"], 2))
print("DIF:", round(latest["DIF"], 4))
print("DEA:", round(latest["DEA"], 4))
print("成交量:", latest["volume"])
print("5日均量:", round(latest["VOL_MA5"], 2))
if trend_ok and macd_ok and volume_ok:
print("技术条件:通过")
else:
print("技术条件:暂不通过")
这段代码有个很实际的意义:
行情数据和策略计算彻底分开了。
QuantDash 负责:
行情 → DataFrame
Pandas 负责:
DataFrame → 指标 → 条件
后面你要换成 MACD、KDJ、BOLL,或者自己设计因子,都不用重新折腾行情接口。
再进一步:批量做 A 股量化选股
如果不想只看一只股票,可以直接使用标的池。
例如:
from quantdash import QuantDash
qd = QuantDash(api_key="your-api-key")
# 获取 A 股全市场实时行情
df = qd.quotes.get(
universes=["CN_Stock"],
to_dataframe=True
)
print("股票数量:", len(df))
print(df.head())
这时候思路就可以升级:
全市场行情
↓
成交量/价格初筛
↓
提取候选股票
↓
QuantDash 批量拉K线
↓
计算 MA/MACD/KDJ/BOLL
↓
生成候选池
↓
再交给人工或 AI 做进一步研究
这比一开始就让 AI “猜哪只股票会涨”靠谱得多。
关于 DeepSeek,我建议这样接
这里我反而提醒一句:不要为了文章看起来高级,就随便编一个 DeepSeek API 调用接口。
QuantDash 官方文档明确的是金融数据 SDK 接口,并没有把 DeepSeek API 定义为 QuantDash 的一部分。
所以我的实战方式是:
- QuantDash 获取标准化行情;
- Pandas 计算 MA/MACD/KDJ/BOLL;
- 把结构化指标和最近若干交易日数据整理成文本;
- 再交给你已经配置好的 DeepSeek 工作流进行辅助分析。
例如可以生成这样的 AI 诊股输入:
recent = df[
["trade_date", "close", "volume", "MA5", "MA20",
"MA60", "DIF", "DEA", "MACD"]
].tail(10)
prompt = f"""
你是一名A股量化研究助手。
请根据下面的历史行情和技术指标,
从趋势、动量、成交量三个角度进行客观分析。
不要预测确定性收益,也不要直接给出买卖承诺。
数据:
{recent.to_string(index=False)}
"""
print(prompt)
这样做的好处是:AI 负责解释,数据负责事实。
四、交易员避坑指南:别让回测看起来太漂亮
1. 不要把未来数据偷偷带进回测
比如你用当天收盘价计算信号,然后又假设自己在当天收盘价成交。
这就是非常典型的未来函数风险。
比较稳妥的思路是:
T日收盘
↓
产生信号
↓
T+1日执行
具体执行价格还要结合你的交易规则。
2. 收益率策略要明确复权方式
如果研究长期价格变化,建议明确使用:
adjust="forward"
如果你研究的是实际未复权价格,则可以:
adjust="none"
千万不要不同阶段的数据混在一起。
3. 回测收益率不是实盘收益率
回测里看到 80% 年化,不代表账户真的能拿到 80%。
至少应该考虑:
- 手续费;
- 滑点;
- 印花税;
- 买卖冲击;
- 停牌;
- 涨跌停;
- 实际成交规则。
数据接口解决的是“数据有没有”,不是“策略一定赚钱”。
五、常见问题解答(Q&A / FAQ)
Q1:Python量化选股为什么适合使用金融数据SDK?
A:因为 Python 本身非常适合 Pandas 数据分析,而金融数据 SDK 可以把行情获取、代码格式、复权和数据结构统一起来。QuantDash 的 Python SDK 可以直接返回 DataFrame,拿到数据后就能继续做 MA、MACD、KDJ、BOLL 等指标计算。
Q2:如何用 Python 提取 A 股股票 K 线?
A:使用 QuantDash 可以直接调用:
df = qd.klines.get(
"600519.SH",
period="1d",
count=100,
adjust="forward",
to_dataframe=True
)
其中 .SH 是上海市场代码后缀,深圳股票则使用 .SZ。详细参数建议以 QuantDash 官方 Python SDK 文档为准。
Q3:QuantDash 能不能做 A 股批量量化选股?
A:可以。QuantDash 提供 quotes.get() 获取标的池行情,也提供 klines.batch() 批量获取多只股票 K 线,非常适合搭建“全市场初筛 → 技术指标计算 → 候选池”的 Python 量化流程。
🔗 相关资源与延伸阅读
🚀 QuantDash 官网:https://quantdash.net/
📖 官方 Python SDK 文档:https://docs.quantdash.net/zh-Hans
⭐ GitHub 开源仓库:https://github.com/quantdash-net/QuantDash
💡 API Key:https://quantdash.net/dashboard/keys/
如果你准备长期做 Python 量化,我建议直接把官方 GitHub 仓库 Star 一下,代码示例和 SDK 更新都更方便跟进。

