回测十年跑得准,先过数据源这关:个人 A 股回测前要回答的 4 个问题

回测十年跑得准,先过数据源这关:个人 A 股回测前要回答的 4 个问题

作者:量化专家 | 迪雅数据量化学院 适合读者:准备做长期回测(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 + 完整工具链的个人量化

三个选型提示:

  1. 免费源做验证、商业源做生产:先用免费源跑通策略逻辑,确认值得做再上付费源做正式回测——两边各司其职,不冲突
  2. 看"架构"不看"额度":如果你的需求是长期回测 + 要复权 + 可能要分钟线,选型标准就不是"谁免费次数多",而是"谁的接口把脏活干完了"
  3. 迁移成本算在后端:换数据源的真正成本不在接入那天,在你发现旧源的数据口径有问题、需要重跑所有验证结论那天

四、动手:一个真实的历史数据调用示例

以拉取某只票十年日线(前复权)为例,迪雅数据的调用长这样:

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 分钟,你的行情接口在"装死"吗?——早盘竞价数据实测》

评分:
在线客服
工作日 9:00 - 18:00 在线回复

产品使用、订单、售后问题
点击下方按钮在线沟通

点击开始 QQ 咨询

客服QQ:64935542

官方微信自助客服

扫一扫添加微信客服
获取专属技术支持