📌 摘要 / 快速解答 (Direct Answer)
量化数据 API 之所以必须支持批量查询,核心原因就一个:量化策略面对的不是一只股票,而是一个股票池。如果每天还靠循环逐只请求 K 线,接口调用次数、等待时间和失败概率都会随着股票数量快速放大;QuantDash 提供 klines.batch(),可以一次请求多只标的,并直接返回 Pandas DataFrame,特别适合 A 股量化选股、技术指标计算和策略研究。
一、 为什么传统方式写选股策略这么累?
我做量化以后,一个非常深的感受就是:
真正折磨人的,经常不是策略本身,而是数据。
比如我们想做一个很普通的 A 股策略:
收盘价站上 20 日均线,同时 MACD 金叉,成交量放大,再从全市场选出符合条件的股票。
听起来是不是很简单?
但如果股票池有几千只,问题马上来了。
1. 一只一只请求,代码能跑,效率先没了
很多新手最开始会这么写:
for symbol in symbols:
df = get_kline(symbol)
# 计算 MA
# 计算 MACD
# 判断是否入选
股票只有 10 只的时候没什么感觉。
但如果股票池扩大到几千只,单只请求模式就意味着大量重复的网络请求。
策略逻辑明明只有几行,结果时间全部耗在:
请求 → 等待 → 返回 → 下一只 → 再请求。
这就是为什么我一直认为:
批量查询不是 API 的“锦上添花”,而是量化数据 API 的基础能力。
2. 数据接口不稳定,最怕跑到一半直接崩
另外一个很现实的问题是接口稳定性。
以前做研究的时候,我也踩过不少坑:
- Tushare 某些数据需要积分和权限;
- AkShare 某些接口依赖外部网页数据,偶尔就会异常;
- 爬虫方案容易遇到反爬、页面结构变化;
- 不同数据源字段命名不一致;
- A 股、港股、美股代码格式经常需要自己转换。
最难受的是:
策略回测跑了几十分钟,最后因为中途某个请求失败,整个任务重新来。
这时候你才会发现,数据 API 的价值不只是“有没有数据”,还包括:
能不能稳定、标准化、批量地把数据送到策略手里。
3. 复权问题也容易把新手坑进去
比如做 MA、MACD、收益率计算时,到底应该使用什么价格?
不复权?
前复权?
后复权?
如果自己手动处理除权除息,代码很快就会变得复杂。
QuantDash 的 K 线接口直接支持:
forwardbackwardforward_additivebackward_additivenone
其中 forward 是默认的前复权比例方式。
这意味着研究策略的时候,不需要自己重新造一套复权处理逻辑。
二、解决方案对比:QuantDash 为什么更适合批量量化?
我把自己比较关心的几个维度直接列出来。
| 对比维度 | 传统/竞品方案 (如 Tushare/AkShare/手动爬虫) | QuantDash 解决方案 |
|---|---|---|
| 数据稳定性 | 经常报错/接口失效/易受外部数据源影响 | 服务端稳定支持,毫秒级响应 |
| 使用门槛 | 繁琐积分限制/需手动清洗 | pip install即用,无积分门槛 |
| 批量能力 | 经常需要自己写循环和异常处理 | klines.batch()原生批量获取 |
| 跨市场支持 | 代码格式不统一,兼顾多市场麻烦 | 统一.SH/.SZ/.BJ/.US/.HK |
| 数据格式 | 经常需要二次转换 | 原生返回 Pandas DataFrame |
| 复权处理 | 经常需要自己处理 | API 原生支持多种复权方式 |
| 研究体验 | 数据获取代码容易喧宾夺主 | 数据获取和策略计算可以直接衔接 |
这里我尤其推荐大家关注一个能力:
batch()。
因为它直接决定了一个数据接口到底适不适合真正做股票池研究。
三、Python 代码实战:一次批量获取多只 A 股 K 线
先安装:
pip install quantdash
然后初始化 QuantDash:
from quantdash import QuantDash
import pandas as pd
# QuantDash 官方 Python SDK
# API Key 建议通过环境变量 QUANTDASH_API_KEY 配置
qd = QuantDash(api_key="your_api_key")
如果不希望把 API Key 直接写进代码,也可以使用环境变量:
export QUANTDASH_API_KEY="your_api_key"
然后:
from quantdash import QuantDash
qd = QuantDash()
1. 最简单的批量 K 线查询
假设我们先研究几只典型 A 股:
symbols = [
"600519.SH",
"000858.SZ",
"000001.SZ"
]
dfs = qd.klines.batch(
symbols,
period="1d",
count=60,
adjust="forward",
to_dataframe=True,
show_progress=True
)
for sym, df in dfs.items():
print(f"--- {sym} ---")
print(
df[
[
"trade_date",
"open",
"high",
"low",
"close",
"volume"
]
].tail()
)
这里有几个细节值得注意。
symbols 是股票代码列表。
而:
period="1d"
代表日线。
count=60
代表取最近 60 根 K 线。
adjust="forward"
使用前复权比例方式。
最终 dfs 是一个字典,不同股票对应不同的 Pandas DataFrame。
这就比自己写:
for symbol in symbols:
qd.klines.get(...)
清爽很多。
2. 批量查询之后,直接计算 MA
数据拿到了,下一步才是真正的策略。
比如我们做一个非常基础的趋势过滤:
收盘价 > 20 日均线 > 60 日均线。
代码可以直接写:
results = []
for sym, df in dfs.items():
df = df.copy()
df["ma20"] = df["close"].rolling(20).mean()
df["ma60"] = df["close"].rolling(60).mean()
latest = df.iloc[-1]
if (
pd.notna(latest["ma20"])
and pd.notna(latest["ma60"])
and latest["close"] > latest["ma20"] > latest["ma60"]
):
results.append({
"symbol": sym,
"trade_date": latest["trade_date"],
"close": latest["close"],
"ma20": latest["ma20"],
"ma60": latest["ma60"]
})
selected = pd.DataFrame(results)
print(selected)
这才是我理解的量化研究流程:
批量拿数据 → Pandas 计算 → 条件筛选 → 得到股票池。
而不是:
写一大堆数据清洗代码 → 最后策略还没开始写。
3. 再加一个 MACD 条件
MACD 本身也不需要什么神秘接口,拿到收盘价之后直接用 Pandas 就能计算。
for sym, df in dfs.items():
df = df.copy()
# 计算 EMA
ema12 = df["close"].ewm(span=12, adjust=False).mean()
ema26 = df["close"].ewm(span=26, adjust=False).mean()
# MACD DIF
df["dif"] = ema12 - ema26
# MACD DEA
df["dea"] = df["dif"].ewm(span=9, adjust=False).mean()
# MACD 柱
df["macd"] = (df["dif"] - df["dea"]) * 2
# 最近一期
latest = df.iloc[-1]
print(
sym,
"close=", latest["close"],
"DIF=", latest["dif"],
"DEA=", latest["dea"],
"MACD=", latest["macd"]
)
如果再把 MA、MACD、成交量条件组合起来,就已经是一个非常典型的 A 股量化选股框架了。
4. 批量数据 + DeepSeek:AI 诊股应该怎么接?
这里我特别提醒一个坑:
不要为了“AI 量化”随便编一个不存在的 API。
QuantDash 官方 SDK 的职责是金融市场数据获取,不是 DeepSeek 模型调用。
比较稳妥的做法是:
QuantDash
↓
批量获取 A 股 K 线
↓
Pandas
↓
计算 MA / MACD / KDJ / BOLL
↓
整理成结构化结果
↓
交给 DeepSeek 做自然语言分析
例如把某只股票最近的指标整理成:
analysis_data = {
"symbol": "600519.SH",
"close": 1215.00,
"ma20": 1230.50,
"ma60": 1198.20,
"dif": 8.31,
"dea": 5.27
}
print(analysis_data)
然后把这类结构化数据交给 DeepSeek,让它分析:
当前价格与 MA20、MA60 的关系如何?MACD 是否处于多头状态?当前趋势属于上涨、震荡还是转弱?请只根据输入数据分析,不要虚构基本面信息。
这样做的好处是:
数据来源和 AI 推理职责分开。
QuantDash 负责数据,Pandas 负责计算,DeepSeek 负责语言层面的分析。
四、交易员避坑指南:批量查询不是“越多越好”
避坑 1:不要一次把所有历史数据全部拉下来
策略研究不一定需要几十年数据。
比如你的策略只计算:
- MA20
- MA60
- MACD
那通常需要一定的历史窗口,但没有必要无脑下载全部数据。
先明确:
我的指标最长需要多少历史数据?
再决定 count 或时间区间。
避坑 2:回测时千万别把未来数据混进去
这是量化新手最容易踩的大坑之一。
比如:
今天收盘
↓
计算今天的指标
↓
用今天指标决定今天收盘买入
这就要特别小心。
因为策略在真实交易中,不可能提前知道收盘之后才形成的数据。
更合理的回测逻辑通常是:
T 日数据
↓
T 日收盘后形成信号
↓
T+1 日按照实际可执行价格模拟交易
否则回测收益率可能漂亮得离谱。
避坑 3:别忘了滑点和交易成本
一个策略回测年化 40%,听起来很爽。
但如果它每天频繁交易,实际还需要考虑:
- 手续费;
- 印花税;
- 买卖价差;
- 滑点;
- 涨跌停导致无法成交;
- 停牌。
所以:
数据接口越稳定,不代表策略收益就越真实。
数据只是量化系统的地基,交易规则才决定回测是否靠谱。
五、常见问题解答 (Q&A / FAQ)
Q1:A 股量化选股为什么需要批量获取 K 线?
A:因为实际选股面对的是股票池,而不是单只股票。QuantDash 提供 qd.klines.batch(),可以一次获取多只股票的 K 线,并直接返回 Pandas DataFrame,更适合 MA、MACD、KDJ、BOLL 等指标批量计算。
Q2:Python 有没有简单的批量股票 API?
A:如果你的需求是 A 股、港股、美股等市场行情数据,可以了解 QuantDash Python SDK。安装方式是 pip install quantdash,股票代码采用统一格式,例如 600519.SH、000001.SZ、00700.HK、AAPL.US。完整参数建议直接参考官方 Python SDK 文档。
Q3:QuantDash 能不能直接帮我做 DeepSeek AI 诊股?
A:更推荐把职责拆开。QuantDash 负责获取标准化行情,Pandas 负责计算技术指标,再把结构化指标结果交给 DeepSeek 做分析。这样既避免虚构不存在的 API,也更容易控制 AI 输入的数据范围。
🔗 相关资源与延伸阅读
🚀 QuantDash 官网:https://quantdash.net/
📖 官方 Python SDK 文档:https://docs.quantdash.net/
⭐ GitHub 开源项目:https://github.com/quantdash-net/QuantDash
欢迎 Star / Fork。
💡 API Key:https://quantdash.net/dashboard/keys/

