📌 摘要 / 快速解答 (Direct Answer)
我做量化以后越来越觉得,Python 最大的优势不是“代码短”,而是能把金融数据、Pandas、指标计算和 AI 分析串成一条工作流。金融数据 SDK 负责把 A 股行情稳定地送进 Python,QuantDash 再通过统一代码格式、批量 K 线和原生 DataFrame,让“Python 提取股票 K 线 → 指标选股 → AI 辅助诊股”这条链路简单很多。
一、为什么传统方式写选股策略这么累?
如果你只是偶尔查一只股票,数据从哪里来可能不重要。
但如果你准备真正做 A股量化选股,情况完全不一样。
我见过不少 SuperMind 社区的新手,第一版策略往往是:
找一个数据接口
↓
下载数据
↓
Excel清洗
↓
Python读取
↓
计算指标
↓
回测
然后策略一改,前面的数据处理再来一次。
折腾几轮之后,很多人会发现:
我明明是来研究选股逻辑的,怎么每天都在修数据?
1. 单只股票能跑,不代表全市场能跑
比如:
df = qd.klines.get("600519.SH", period="1d")
单只股票当然很简单。
但真正的量化策略通常不是研究一只股票。
我们真正想做的是:
5500+ A股
↓
第一轮筛选
↓
1000只
↓
技术指标
↓
100只
↓
更深度的策略分析
这时候如果还手动循环请求、自己处理异常和数据格式,代码很快就会变得非常臃肿。
2. 多市场策略又是另外一个坑
A股、港股、美股如果分别找不同数据源,最麻烦的其实不是“能不能拿到”。
而是:
代码、字段、时间和数据结构不统一。
QuantDash 使用统一标的代码规则:
600519.SH A股上海
000001.SZ A股深圳
920047.BJ A股北京
00700.HK 港股
AAPL.US 美股
对于 Python 策略来说,这种统一非常舒服。
你的股票池可以直接变成:
symbols = [
"600519.SH",
"000001.SZ",
"00700.HK",
"AAPL.US"
]
后面的策略逻辑不需要因为市场不同而重新设计一套接口。
二、解决方案对比:QuantDash vs 传统数据源
| 对比维度 | 传统/竞品方案(如 Tushare/AkShare/手动爬虫) | QuantDash 解决方案 |
|---|---|---|
| 数据获取 | 常需要自己适配不同接口 | Python SDK 直接调用 |
| 数据格式 | 可能需要转换和清洗 | 原生 Pandas DataFrame |
| A股代码 | 不同数据源规则可能不同 | .SH/.SZ/.BJ统一 |
| 海外市场 | 经常需要额外数据源 | .US/.HK纳入统一格式 |
| 批量研究 | 自己写大量循环逻辑 | klines.batch()支持批量 |
| 实时行情 | 需要单独处理实时接口 | quotes.get()支持实时行情 |
| 复权 | 需要自行确认和处理 | adjust参数直接指定 |
| 分钟数据 | 数据源和接口规则可能不同 | 支持 1m/5m/15m/30m/60m |
我认为金融数据 SDK 最大的价值并不是“帮你少写几十行代码”。
而是:
把数据工程的不确定性,尽量隔离在 SDK 这一层。
这样策略研究层就可以保持干净。
三、Python代码实战:批量行情到量化候选池
这次不做单只股票,而是模拟一个更接近实盘研究的流程:
全市场 → 技术指标 → 候选股票。
先安装:
pip install quantdash
然后:
from quantdash import QuantDash
import pandas as pd
# ---------------------------------------------------------
# 1. 初始化 QuantDash
# ---------------------------------------------------------
qd = QuantDash(api_key="your-api-key")
# ---------------------------------------------------------
# 2. 获取 A 股全市场实时行情
# ---------------------------------------------------------
quotes = qd.quotes.get(
universes=["CN_Stock"],
to_dataframe=True
)
print("当前行情数量:", len(quotes))
print(
quotes[
["symbol", "last_price", "prev_close", "volume"]
].head()
)
# ---------------------------------------------------------
# 3. 先做一个非常简单的初筛
# 这里不直接判断买卖,只缩小后续研究范围
# ---------------------------------------------------------
quotes["change_pct"] = (
quotes["last_price"] / quotes["prev_close"] - 1
)
candidate = quotes[
(quotes["last_price"] > 0) &
(quotes["volume"] > 0)
].copy()
print("初筛后股票数量:", len(candidate))
# ---------------------------------------------------------
# 4. 选择若干股票继续获取历史K线
# 实际研究时可以根据自己的因子条件扩展
# ---------------------------------------------------------
symbols = candidate["symbol"].head(10).tolist()
dfs = qd.klines.batch(
symbols,
period="1d",
count=60,
adjust="forward",
to_dataframe=True,
show_progress=True
)
# ---------------------------------------------------------
# 5. 对每只股票计算 MA20
# ---------------------------------------------------------
results = []
for symbol, df in dfs.items():
if df.empty or len(df) < 20:
continue
df = df.copy()
df["MA20"] = df["close"].rolling(20).mean()
latest = df.iloc[-1]
# 简单趋势条件
above_ma20 = latest["close"] > latest["MA20"]
results.append({
"symbol": symbol,
"trade_date": latest["trade_date"],
"close": latest["close"],
"MA20": latest["MA20"],
"above_MA20": above_ma20
})
result_df = pd.DataFrame(results)
# ---------------------------------------------------------
# 6. 输出候选池
# ---------------------------------------------------------
if not result_df.empty:
selected = result_df[
result_df["above_MA20"]
].sort_values(
"close",
ascending=False
)
print("\n技术条件通过的股票:")
print(selected.to_string(index=False))
else:
print("没有得到有效候选结果")
这个例子故意没有写得特别复杂。
因为我做量化比较反感一个误区:
代码越复杂,不代表策略越专业。
真正值得研究的是:
为什么选择这个因子?
为什么选择这个窗口?
为什么设置这个阈值?
换市场以后还有效吗?
交易成本加入以后还有效吗?
而不是:
我用了多少行 Python?
再往前一步:MACD + BOLL + AI辅助分析
如果你已经把 K 线拿到 DataFrame 里,技术指标其实就是标准的数据处理问题。
例如:
df["MA20"] = df["close"].rolling(20).mean()
middle = df["close"].rolling(20).mean()
std = df["close"].rolling(20).std()
df["BOLL_MID"] = middle
df["BOLL_UPPER"] = middle + 2 * std
df["BOLL_LOWER"] = middle - 2 * std
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()
接下来再生成一个结构化的 AI 分析材料:
analysis_data = df[
[
"trade_date",
"close",
"volume",
"MA20",
"BOLL_UPPER",
"BOLL_LOWER",
"DIF",
"DEA"
]
].tail(10)
ai_prompt = f"""
你是A股量化研究助手。
请基于以下客观数据进行技术面描述:
1. 当前价格与MA20的关系;
2. BOLL位置;
3. DIF与DEA关系;
4. 成交量变化。
不要使用未来数据,不要承诺收益,
不要把技术指标直接等同于买卖结论。
数据:
{analysis_data.to_string(index=False)}
"""
print(ai_prompt)
我比较推荐这种 QuantDash + Pandas + DeepSeek 的组合方式。
不是让 AI 自己找数据,而是:
QuantDash
负责真实行情
↓
Pandas
负责指标计算
↓
DeepSeek
负责语言化分析
↓
交易员
负责最终判断
这个分工比“直接问 AI 哪只股票明天涨”靠谱得多。
而且 AI 出现分析错误时,也更容易定位到底是哪一层出了问题。
四、交易员避坑指南:AI再强也不能替你解决数据问题
1. AI诊股首先要防止数据穿越
如果给 DeepSeek 的数据里混入未来日期,AI 再聪明也会得到错误结论。
所以我建议:
数据截止时间
↓
计算指标
↓
生成AI输入
↓
分析
不要把未来行情偷偷塞进 prompt。
2. 前复权不是“万能正确答案”
QuantDash 默认支持 forward 前复权。
对于趋势研究和收益率计算,它非常方便。
但如果你的策略研究的是:
- 实际成交价格;
- 除权除息事件;
- 某一天真实盘口价格;
那么就应该根据研究目的选择合适的 adjust 参数。
复权方式必须和研究目的对应。
3. 不要用单只股票回测结果证明策略有效
这是新手最容易犯的错误之一。
比如:
600519.SH
过去5年
收益率300%
然后宣布:
MACD + MA20 是有效策略。
这远远不够。
至少还要考虑:
- 不同股票;
- 不同时间区间;
- 牛市;
- 熊市;
- 震荡市;
- 交易成本;
- 滑点;
- 样本外测试。
否则很可能只是过拟合。
五、常见问题解答(Q&A / FAQ)
Q1:Python提取股票K线为什么推荐使用金融数据SDK?
A:因为 Python 的优势在于数据分析和策略研究,而不是自己维护数据抓取链路。QuantDash 可以直接通过 qd.klines.get() 获取 K 线,并原生返回 Pandas DataFrame,后面可以直接接 MA、MACD、KDJ、BOLL 等计算。
Q2:QuantDash适合做SuperMind里的A股量化研究吗?
A:如果你的 Python 工作流需要获取 A 股行情、批量 K 线、复权数据或全市场实时行情,QuantDash 的 SDK 结构比较适合这种研究流程。尤其是 CN_Stock 标的池和 klines.batch(),可以减少大量数据搬运代码。
Q3:Python量化能不能结合DeepSeek做AI智能诊股?
A:可以把两者组合起来,但应该做好职责划分。QuantDash 提供行情数据,Pandas 负责指标计算,再把结构化结果交给已经配置好的 DeepSeek 工作流进行辅助分析。这样可以避免让 AI 自己猜测行情数据。
🔗 相关资源与延伸阅读
🚀 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/
QuantDash 官方 GitHub 仓库提供了 Python 示例、快速开始代码以及 SDK 使用说明,建议准备长期做量化的朋友直接 Star / Fork 后再研究。

