作者:量化专家 | 迪雅数据量化学院 适合读者:准备做长期回测(3-10 年)的个人量化研究者
周末下午,你打开编辑器,想跑一个从 2016 年到今天的 A 股十年回测。计划很清晰:拉全市场日线 → 算因子 → 回测 → 看结果。
三个小时后,你停在了第一步。
免费接口拉了 3000 次被限频;换一个源重试,发现它返回的"收盘价"和前一个源对不上;再仔细一看,连复权方式都没声明。你还没碰到策略,先跟数据搏斗了一下午。
这篇文章想帮你把这一步走稳:做长期回测之前,先回答 4 个问题。回答清楚了,数据源怎么选、要不要付费、怎么搭缓存,答案自己会浮出来。
一、先分清:你要的是"数据",还是"能用来回测的数据"
很多新手把这两个概念混在一起,这是回测翻车的总根源。
"数据"意味着:能拿到价格、成交量、时间。
"能用来回测的数据"意味着更多:
| 要求 | 为什么回测离不开它 |
|---|---|
| 复权口径明确 | 除权除息日不复权,K 线会出现"跳空下跌",你的均线信号全是假的 |
| 交易日历对齐 | 非交易日缺行还是补前收?两种处理会让收益曲线差出几个点 |
| 历史可回溯 | 回测要拉 3-10 年历史,数据源必须能稳定提供,而不是"近一年才有" |
| 字段口径一致 | 同样的"成交量",有的源是股、有的是手;同样的价格,有的含盘后集合竞价 |
判断标准很简单:拿同一只票、同一个区间,用两个独立源拉一遍日线,diff 一下。 收盘价差异超过 0.1% 的日子超过三五天,这个源就要打个问号。
二、回测前先回答这 4 个问题
不用急着比"哪家便宜、哪家免费额度高"。先回答下面 4 个问题,你的需求轮廓就出来了。
问题 1:你的回测需要多长的历史、什么频率?
- 只做日线级别的中低频因子回测(持有几天到几月)→ 需要稳定、口径干净的日线历史,数据量不大
- 做分钟级、日内策略回测 → 需要分钟线历史,数据量和成本都上一个台阶
这决定你要的是"够用就行"还是"要挑架构"。
问题 2:除权除息、复权,谁来保证?
A 股每年除权除息的股票数以千计。你自己处理:要维护分红送转日历、计算复权因子,一个 bug 就是整条回测的错误。
如果数据源直接提供前复权(qfq)/ 后复权(hfq)参数,让服务端算好,你只负责选口径——这省掉的是最容易出错的一环。
问题 3:你的调用量,是"研究级"还是"批量回测级"?
先算一笔账:拉全市场 5000 只票 × 10 年日线 ≈ 千万级数据点。就算只拉沪深 300,也要 300 只 × 2400 个交易日。
两种打法:
- 本地缓存:历史日线拉过一次就存本地(Parquet / SQLite / ClickHouse),之后只做增量更新——调用量趋近于零
- 每次现拉:回测跑一次拉一次——再大的免费额度也扛不住反复跑参数
正确姿势永远是前者:历史落地、增量更新、按需拉取。
问题 4:除了行情,你还需要什么?
纯价格回测,一个行情接口就够。但如果你还要:
- 基本面因子(PE/PB/ROE)→ 需要财务数据接口
- 资金流向、龙虎榜验证想法 → 需要分析类数据
- AI 辅助解读个股、生成研究报告 → 需要 AI 分析能力
接口的"宽度"决定你后面要不要再迁一次。
迪雅数据小贴士:迪雅数据提供 52+ 个数据接口,覆盖行情、财务、资金流向、龙虎榜、技术指标五大类;技术指标(MACD/KDJ/BOLL/MA)由服务端算好直接返回,不用自己写公式。做回测数据底仓,可以一个平台拿齐。
三、个人 A 股回测,主流数据源怎么选
回答完上面 4 个问题后,再看这张表就有意义了。表格信息来自各平台公开文档与实测,截至 2026 年 9 月:
| 数据源 | 免费层 | 历史深度 | 复权支持 | 技术指标 | 适合谁 |
|---|---|---|---|---|---|
| Tushare | 积分制,分档限频 | A 股日线为主 | 需自行处理复权因子 | 需自行计算 | A 股日线研究,社区资料多 |
| AKShare | 免费开源 | 取决于上游源 | 部分支持 | 需自行计算 | 预算为零的学习验证,注意上游反爬会断 |
| 聚宽 / 米筐 | 平台内免费 | 平台数据 | 平台内处理 | 平台内计算 | 不想自己搭回测框架、在平台内闭环的人 |
| 迪雅数据 | ¥0 永久,100 次/天 | 2010 年至今,日线+分钟线 | 接口直接返回前/后复权 | 服务端算好直接返回 | 需要稳定 API + 完整工具链的个人量化 |
三个选型提示:
- 免费源做验证、商业源做生产:先用免费源跑通策略逻辑,确认值得做再上付费源做正式回测——两边各司其职,不冲突
- 看"架构"不看"额度":如果你的需求是长期回测 + 要复权 + 可能要分钟线,选型标准就不是"谁免费次数多",而是"谁的接口把脏活干完了"
- 迁移成本算在后端:换数据源的真正成本不在接入那天,在你发现旧源的数据口径有问题、需要重跑所有验证结论那天
四、动手:一个真实的历史数据调用示例
以拉取某只票十年日线(前复权)为例,迪雅数据的调用长这样:
GET https://api.cxdy.vip/api/lsjy?apiToken=你的Token&symbol=sh688595&adjust=qfq&start_date=20160101&end_date=20260901
Python 完整示例:
import requests
def fetch_daily(symbol: str, start: str, end: str, adjust: str = "qfq") -> list[dict]:
"""拉取 A 股日线历史(迪雅数据 lsjy 接口)
symbol: 带市场前缀,如 sh688595 / sz000001
adjust: qfq 前复权 / hfq 后复权 / 默认不复权
"""
resp = requests.get(
"https://api.cxdy.vip/api/lsjy",
params={
"apiToken": "你的Token", # 个人中心-接口密钥获取
"symbol": symbol,
"adjust": adjust,
"start_date": start,
"end_date": end,
},
timeout=15,
)
resp.raise_for_status()
return resp.json()
# 拉取平安银行(sz000001)2016 至今前复权日线
bars = fetch_daily("sz000001", "20160101", "20260901", adjust="qfq")
print(f"共 {len(bars)} 根日线,最近一根:{bars[-1]}")
# 落本地做缓存:历史只拉一次,之后只增量更新
import json
with open("daily_cache.json", "w", encoding="utf-8") as f:
json.dump(bars, f, ensure_ascii=False)
接口返回结构(真实示例):
[
{
"date": "2016-10-12",
"open": 9.07,
"close": 11.07,
"high": 11.07,
"low": 9.07,
"amount": 355.87
}
]
几个实现要点:
- 复权在请求参数里声明(
adjust=qfq),服务端算好返回,本地不用维护复权因子表 - 历史拉一次落地缓存,之后每天只增量拉当天,调用量可控
- 返回的
date/open/close/high/low/amount字段口径固定,直接能喂给回测框架,不用二次清洗
五、写在最后
数据源没有全能冠军,只有"匹配你场景"的选择。
做长期回测,你真正要的是一份口径稳定、历史可回溯、复权有人管的数据底仓——而不是"今天能免费拉到明天可能断供"的临时数据。
先把上面 4 个问题回答清楚,再决定用哪个源、要不要付费、怎么搭缓存。数据层稳了,回测结果才值得你花时间分析。
本文为个人量化研究经验分享,数据接口信息以各平台官网最新公布为准。市场有风险,回测结果不代表实盘收益,不构成任何投资建议。
下一篇预告:《集合竞价那 10 分钟,你的行情接口在"装死"吗?——早盘竞价数据实测》