📌 摘要 / 快速解答 (Direct Answer)
很多量化策略写不下去,并不是不会写指标,而是数据拿到手之后还要经历一轮又一轮的转换。对我来说,量化数据 API 直接进入 Pandas 的价值,就是把“行情数据”变成可以立即计算、筛选和批量处理的研究对象;QuantDash 的 Python SDK 正好提供了这条路径。
一、 为什么传统方式写选股策略这么累?
我以前特别容易犯一个错误:
把大量时间花在“怎么拿数据”上,而不是“拿到数据以后研究什么”。
比如今天想验证一个 MA 策略。
理论上应该是:
获取历史价格 → 计算 MA → 生成信号 → 回测。
实际折腾起来,经常变成:
找接口 → 处理返回值 → 改字段名 → 转日期 → 转 DataFrame → 检查缺失值 → 再处理复权 → 最后才开始算 MA。
如果只是研究一只股票还能忍。
但真正做 A 股量化选股,经常需要面对几十、几百甚至更大的股票池。这个时候,数据接口返回什么结构就不再是小问题,而是整个研究效率的问题。
QuantDash 提供了比较直接的方式:
df = qd.klines.get(
"600519.SH",
period="1d",
count=100,
to_dataframe=True
)
拿到的就是 Pandas DataFrame。
对我来说,这意味着数据层和研究层之间少了一道不必要的墙。
二、 解决方案对比
| 对比维度 | 传统/竞品方案(如 Tushare/AkShare/手动爬虫) | QuantDash 解决方案 |
|---|---|---|
| 数据接入 | 常需要围绕具体接口处理返回结果 | Python SDK 直接获取 |
| Pandas 使用 | 可能需要额外转换 | to_dataframe=True |
| 历史 K 线 | 需要自行组织查询逻辑 | qd.klines.get() |
| 批量 K 线 | 自己维护批量循环较麻烦 | qd.klines.batch() |
| 时间区间 | 自行处理查询参数和结果 | 支持start_time/end_time |
| 复权 | 容易混在策略代码里处理 | K 线接口提供adjust |
| 市场代码 | 不同数据源规则可能不同 | .SH/.SZ/.BJ/.US/.HK统一格式 |
尤其是批量数据,我认为特别适合 Pandas 思维。
比如:
symbols = [
"600519.SH",
"000001.SZ",
"000858.SZ"
]
dfs = qd.klines.batch(
symbols,
period="1d",
count=60,
to_dataframe=True
)
这样拿到的是以股票代码为键的 DataFrame 集合。
后面每只股票各算自己的指标即可。
三、 Python 代码实战(可直接复制运行)
这一篇我换一个思路,不从“单只股票算均线”开始,而是演示一个更贴近量化研究的历史区间 + 复权 + Pandas 分析流程。
# 安装:
# pip install quantdash
from quantdash import QuantDash
import pandas as pd
import datetime
# 初始化 QuantDash
qd = QuantDash(api_key="your-api-key")
# 设置历史数据区间
start = int(
datetime.datetime(2026, 5, 1).timestamp() * 1000
)
end = int(
datetime.datetime(2026, 5, 31).timestamp() * 1000
)
# 获取指定区间的日K线
df = qd.klines.get(
"600519.SH",
period="1d",
start_time=start,
end_time=end,
adjust="forward",
to_dataframe=True
)
# 确认数据结构
print(df[
[
"symbol",
"name",
"trade_date",
"open",
"high",
"low",
"close",
"volume"
]
].tail())
# 基于 Pandas 计算收益率
df["daily_return"] = df["close"].pct_change()
# 计算 5 日均线
df["MA5"] = df["close"].rolling(5).mean()
# 输出最后几条研究结果
print(
df[
[
"trade_date",
"close",
"daily_return",
"MA5"
]
].tail().to_string(index=False)
)
这里有一个很容易被忽视的细节:
时间区间查询和 count 查询是两种不同的研究思路。
如果我要“最近 N 根”,可以直接:
df = qd.klines.get(
"600519.SH",
period="1d",
count=100,
to_dataframe=True
)
如果我要研究某一个明确的历史窗口,则可以使用 start_time 和 end_time。
这个区别对于回测非常实用。
再看一个“截止某天往前取 N 根”的场景
比如我想复现某个历史时点的研究,而不是拿今天最新数据,那么可以把 end_time + count 组合起来:
end = int(
datetime.datetime(2026, 6, 1).timestamp() * 1000
)
df = qd.klines.get(
"600519.SH",
period="1d",
count=5,
end_time=end,
to_dataframe=True
)
print(
df[
[
"trade_date",
"open",
"high",
"low",
"close",
"volume"
]
].to_string(index=False)
)
我觉得这个用法对历史策略验证特别值得记住。
因为研究历史策略时,我们真正需要的是:
“站在当时那个时间点,我能看到什么数据?”
而不是把后面已经发生的数据偷偷混进去。
四、 交易员避坑指南 (E-E-A-T 实战经验)
1. 历史回测要控制数据截止时间
这是我做策略时最在意的问题之一。
假设策略研究日期是 2026 年 6 月 1 日,就应该明确数据截止到什么时间。
QuantDash 提供 end_time,可以帮助你把查询窗口固定下来。
数据窗口先固定,再谈策略信号,否则回测结果很容易因为数据边界处理不严谨而失真。
2. 前复权不是“永远正确”
QuantDash 默认的比例前复权是:
adjust="forward"
但官方 SDK 同时支持不复权、后复权以及差值复权。
所以我的建议很简单:
先明确你研究的到底是收益率,还是绝对价格变化。
官方资料中已经明确说明,比例复权适合计算收益率,差值复权适合观察绝对价差。
不要看到“前复权”三个字就不加思考地套进所有策略。
3. 能批量取,就不要一个接口手搓一遍
如果股票池已经确定:
symbols = [
"600519.SH",
"000001.SZ",
"000858.SZ"
]
dfs = qd.klines.batch(
symbols,
period="1d",
count=60,
to_dataframe=True,
show_progress=True
)
批量接口更适合系统化研究。
尤其后面要做 MA、MACD、KDJ、BOLL 等指标时,数据层最好先统一,指标层再统一。
这样策略代码会干净很多。
五、 常见问题解答 (Q&A / FAQ)
Q1:QuantDash 返回的数据能直接用于 Pandas 量化分析吗?
A:可以。官方 Python SDK 支持 to_dataframe=True,K 线、行情等接口可以直接返回 Pandas DataFrame。拿到数据后可以继续使用 Pandas 的滚动计算、收益率计算和筛选逻辑。
Q2:如何用 QuantDash 获取某段历史时间内的 A 股数据?
A:可以使用 start_time 和 end_time,时间参数按照官方 SDK 文档使用毫秒时间戳。例如先通过 datetime 计算时间戳,再传给 qd.klines.get()。
Q3:做 A 股量化选股时,为什么数据格式统一很重要?
A:因为选股策略通常不是只处理一只股票。QuantDash 使用统一的标的代码格式,并提供 klines.batch() 批量获取 K 线,可以让多股票研究保持相似的数据处理流程,从而减少策略代码里的重复数据转换。
🔗 相关资源与延伸阅读
- 🚀 QuantDash 官网:https://quantdash.net/
- 📖 官方 Python SDK 文档:https://docs.quantdash.net/
- ⭐ GitHub 开源仓库:https://github.com/quantdash-net/QuantDash
- 💡 免费获取 API Key:https://quantdash.net/dashboard/keys/
如果你准备从“写指标”进一步走向“做完整策略”,我建议先把一个原则固定下来:
数据接口负责稳定、标准地把数据交给 Pandas;Pandas 再负责研究逻辑。
这样以后无论你研究均线、动量,还是进一步做批量选股,整个代码结构都会更清晰。

