A股投资者必备:三大数据源对比,哪种最适合实时行情与回测?

TickDB Research ·

A股投资者必备:三大数据源对比,哪种最适合实时行情与回测?

image.png

做一个自选股看板,和回测一套跨越数年的策略,看起来都需要“股票数据”,真正需要解决的问题却差得很远。

看板关心最新价格什么时候到、断线后能不能恢复;回测关心历史数据是否完整、复权口径是否一致,以及当时究竟能知道哪些信息。如果只比较“有没有实时行情”“能不能下载 K 线”,很容易选到能跑示例、却不适合自己任务的接口。

本文选择 AKShare、Tushare Pro、TickDB 三种接入方案,比较范围限定为 A 股行情与价格策略回测。它们并非同一种产品形态:AKShare 是数据接口工具库,Tushare Pro 和 TickDB 提供数据服务。这里的“三大”仅指本次选取的三个对象,不代表市场份额或行业排名。

先给出选择方向:学习采集、验证小规模原型,可以从 AKShare 开始;以历史数据批量入库和回测为主,优先考察 Tushare Pro;明确需要 WebSocket 持续行情推送,可以重点验证 TickDB。这些是按接口形态作出的试接建议,最终选择还要通过数据覆盖与运行测试。

一、把“实时”拆开,才能比较得公平

“现在能查到一个价格”与“持续接收价格变化”,对应不同的数据消费方式。

快照查询是客户端发起请求,服务端返回当前状态。需要定时刷新时,由程序安排下一次请求。持续推送是在建立连接并订阅后,由服务端陆续发送消息,客户端负责处理消息、监测连接和恢复订阅。

还有第三种容易混淆的数据:正在形成的 K 线。上午查询到的当日最高价和成交量,只描述查询时刻之前的状态,不是当天的最终结果。

因此,实时选型要问的是“更新如何抵达应用”,回测选型要问的是“这一条记录在策略决策时是否已经确定”。REST 或 WebSocket 只描述接入方式,不能直接证明行情延迟、完整性或成交可执行性。

image.png

图 1:实时观察与历史回测需要不同的数据处理路径。此图为建议设计示意,不是任一供应商的系统架构。

二、三种方案,各自适合从哪里开始

AKShare:适合先把采集和分析流程搭起来

以东财接口为例,stock_zh_a_spot_em 获取沪深京 A 股行情快照,stock_zh_a_hist 提供日频历史行情及复权选项。需要分钟数据时,要单独核对接口范围:stock_zh_a_hist_min_em 的 1 分钟数据仅覆盖近 5 个交易日,且不复权。这是该接口的限制,不能外推成整个 AKShare 的统一历史深度。AKShare 股票接口文档

对入门项目,我更建议先用少量股票完成“读取、保存、画图、重跑”的闭环。真正值得验证的是:程序隔天还能否重跑、接口变化后能否定位问题、已经保存的数据能否继续使用。

把工具库作为数据入口时,也要保留具体上游和接口名称。两个都通过同一工具库返回的 DataFrame,不一定具有相同的单位、时间含义或更新节奏。

Tushare Pro:适合围绕明确的数据接口建立研究库

Tushare 的 daily 提供未复权日线;官方说明其在交易日收盘后入库,停牌期间不提供记录。adj_factor 则提供复权因子,两者可以分别保存,便于研究中核对复权过程。日线文档、复权因子文档

如果任务是多年分钟回测,stk_mins 值得优先验证:文档列出 1、5、15、30、60 分钟周期,注明可提供超过 10 年的历史分钟数据,但需要单独开权限。这个描述不等于每只股票都有完整十年记录;上市时间、目标时间段和实际返回覆盖仍要逐项检查。历史分钟文档

同时,不应把 Tushare 简化为“只有盘后数据”。rt_k 已提供实时日线,包含当日最新状态,也需要单独申请相应权限。它适不适合你的盘中看板,要按该接口的实际更新与调用条件判断。实时日线文档

这种入口适合把研究需求拆成明确的数据表,再安排增量更新。选择前先列出必需接口及权限,避免拿到日线后,才发现分钟或其他配套数据需要另外开通。

TickDB:需要持续推送时,重点验证订阅与恢复

TickDB 的 A 股全量行情文档明确提供 WebSocket 订阅:先分批发送快照,再推送发生变化的行情。该能力要求 A 股全量或企业版权限,并需要在握手时成功协商 permessage-deflate 压缩,不能从“能连接 WebSocket”直接推断“能订阅全市场”。A 股全量行情文档

历史侧,K 线查询支持 A 股及不复权、前复权、后复权。但文档同时提醒:最后一根可能仍在形成;免费版不能指定起止时间查询。因此,能返回最近一段 K 线,并不等于已经满足按指定区间回测的要求。K 线查询文档

对于实时应用,推送入口的价值在于可以按消息驱动更新。工程代价也很具体:重连后要重新订阅,恢复快照要正确覆盖本地状态,恢复期间要让应用知道数据尚未追平。官方最佳实践同样要求重连后恢复订阅。WebSocket 连接管理

三、把选型结果写成“条件”,而不是总分榜

你的主要任务建议先验证的方案决定能否采用的条件
学习采集、少量股票原型AKShare所选接口覆盖目标区间,重跑与异常处理可接受
历史日线研究、多年分钟回测Tushare Pro已具备对应权限,历史覆盖、单位和复权口径验收通过
持续行情看板、消息驱动告警TickDB订阅权限匹配规模,更新时效和断线恢复达到要求

这张表给的是试接起点。它不表示 AKShare 不能做回测、Tushare 不能做实时,或 TickDB 在历史数据方面天然更好。本次没有进行三家同条件延迟测试,也没有足够证据给出“最快”“最稳”或“最低成本”的排名。

成本也要按完成任务的总投入计算:所需接口权限、调用与订阅容量、首次历史回补、日常维护,都会影响最终选择。只比较一个套餐数字,容易漏掉最费时间的部分。

四、回测前,先拦住三个常见的数据错误

1. 同名字段不代表同一单位

一个很实际的例子是 Tushare 自身的接口差异:daily 的成交量单位为手、成交额为千元;rt_k 与 stk_mins 的对应单位则为股、元。适配规则必须绑定到具体接口,而不能只写一个“Tushare 转换函数”。日线字段、实时日线字段、分钟字段

下面用模拟数字演示成交额归一化,不调用任何线上服务:

from decimal import Decimal

def amount_yuan(value, unit):
    scales = {"元": Decimal("1"), "千元": Decimal("1000")}
    if unit not in scales:
        raise ValueError("成交额单位未确认")
    amount = Decimal(str(value))
    if not amount.is_finite() or amount < 0:
        raise ValueError("成交额必须是有限非负数")
    return amount * scales[unit]

# 两条模拟记录描述相同成交额,不是供应商实测结果。
assert amount_yuan("1234.5", "千元") == amount_yuan("1234500", "元")

如果直接把两个原始 amount 字段拼起来,同一笔规模会相差 1000 倍。策略中的成交额筛选、流动性门槛就会被单位错误改变。价格精度、成交量和时区,也应在入库前采用同样的显式规则。

2. 图上的复权价格,不应直接当作成交价格

复权序列有助于处理公司行动带来的价格不连续,但必须保存采用的口径、计算依据和获取时间。TickDB 文档明确提醒复权历史可能随公司行动或数据更新而调整,并提供单独的复权因子接口。K 线说明、复权因子说明

一个更便于复现的组织方式是:保存原始价格,保留因子版本,再生成研究所需的复权序列。用于指标计算的价格,与用于模拟下单成交、处理现金分红和持仓变化的价格及事件,要分清职责。

是否存在未来信息,也需要检查策略如何使用这些数据,不能仅凭“用了前复权”四个字作判断。尤其是绝对价格阈值、历史财务筛选和指数成分筛选,应确认所用信息在当时是否已经可得。

3. “有一根 K 线”不等于“这根 K 线可以用了”

以 10:03 查询一根 10:00—10:05 的 K 线为例,它还会继续变化。若把之后才确定的最高价或收盘价拿去决定 10:03 的交易,回测就提前看到了未来。

处理时不要简单地“每次删掉最后一行”。休市后查询时,最后一行可能已经完整。应依据市场交易时段、时间戳对应的是周期起点还是终点、数据源更新状态,确认记录是否已经可用于当前决策。

建议给入库记录保留数据来源、原始代码、市场时间、接收时间、周期、单位和复权口径。缺失值与确认的零值分开保存;缺了一天时,先区分休市、停牌、尚未上市和采集失败,再决定是否补数。

image.png

图 2:先统一口径并保存版本,再进入策略回放。此图为数据准备方法示意,不代表回测收益或供应商质量结论。

五、用一个小样本,把“适合”变成可验证的结论

正式接入前,可以给三个候选方案使用同一份验收任务:挑选一只交易活跃股票、一只包含停牌区间的股票,以及一只覆盖除权除息事件的股票。行情类项目增加盘中连续观察;回测类项目覆盖普通交易日与事件前后区间。

验收不只看“请求成功”,还要留下可以复查的记录:

  • 历史覆盖:列出预期交易日期与实际日期的差集,并解释缺口;不能用两份数据行数相同来代替日期核对。
  • 字段一致性:先统一单位、复权和时段范围,再比较价格与量额差异;不同口径的差异不能直接判为数据错误。
  • 实时状态:同时记录源时间与本地接收时间。只有源时间语义相同、机器时钟同步时,二者之差才有比较意义;否则只能报告本地观察到的更新间隔。
  • 恢复能力:主动断开连接或暂停采集,观察恢复后能否补齐应用需要的状态;只恢复最新快照,不代表已经找回丢失的逐笔事件。
  • 可重复性:用保存的原始数据、转换规则和版本信息再跑一次,确认差异能够定位到输入或处理步骤。

如果目前只想把一个研究想法跑起来,先选容易接入且范围满足要求的入口;如果要做长期回测,把历史覆盖与可复现性放在前面;如果要做持续运行的盘中系统,把更新语义与故障恢复放在前面。

实时行情解决“现在发生了什么”,回测数据还要回答“当时能知道什么”。 三种方案都应该围绕这两个问题验收。先确定任务,再核对具体接口,通常比先找一个“全能数据源”更容易做出可靠选择。

官方资料参考

文中涉及的接口功能、数据单位、历史范围与权限条件,参考以下公开官方文档;各项说明对应的资料如下。

相关文章

用 TickDB 做一个三地股票行情面板:从行情接口到可交互页面

用 TickDB 做一个三地股票行情面板:从行情接口到可交互页面 把 A 股、美股、港股的几只自选股放在一张页面里,左边看报价,右边点开走势,再加上搜索和排序——这是接入行情 API 后,一个很适合动手做的小应用。 这次我们用 TickDB 搭了一个本地行情面板:Python 提供服务端接口,原生 JavaScript 渲染页面,不需要前端构建工具。它能展示六只样本股的行情快照,按市场筛选、…

TickDB Research ·

A股美股港股行情看板Demo三天、上线三个月:拆解7个返工点

同一张行情表,寒武纪的成交额自己算是5,414万元,接口给的是54.20亿元,差了100倍,原因只是一个单位。行情看板三天就能接通,上线后的返工,几乎都来自界面上说不清“自己是什么”的数字。 本文依据上交所、港交所的一手文件,加上10月12日盘中对7类资产的实测,给你四样东西: 一张“价格身份证”:每个数字上线前要答的5个问题 7个返工点逐条拆:钱在哪里算错、为什么会错 一份可以直接发给数据…

TickDB Research ·

拆解美股夜盘数据5个口径:12月6日起美股进入23小时交易

同一只苹果股票,同一个周六中午,三个“最新价”,1万股持仓估值差出 9,500 美元。12月6日起,美股将进入近23小时交易:夜盘数据的5个口径不说清,日K线、收益率、风控和对账都会悄悄算错。 本文依据纳斯达克、SEC、DTCC、FINRA 等一手文件,加上30只美股(含9只中概股)的实测数据,给你四样东西: 一张“北京时间 × 美股夜盘”全景图(含11月1日夏令时切换前后) 5个口径逐条拆…

TickDB Research ·

港股数据源选型:踩一个回测就假(富途/IBKR/TickDB)

回测里某个港股策略表现稳定,实盘跑了一个月,收益差了将近一半。 不是完全对不上,是那种“差异不大但一直在”的偏差。团队排查了三周——策略逻辑、滑点模型、手续费、执行延迟,全部查过。最后发现问题在数据层:数据源返回的港股代码是“700”,而团队数据库里存的是“00700”。两个格式查出来的数据,部分重叠,部分不重叠。回测用的样本,比实际可交易的样本少了一批。 这不是某个操作失误,是港股数据接入…

TickDB Research ·

A股休市10天,港股跌了,美联储还要开会,APEC即将落地深圳——8号开盘,你盘清楚了几件事?

后天开盘。10月8日,A股恢复交易。你手里的A股仓位,价格停在9月30日;但如果你同时持有港股、美股、QDII,这10天它们一直在动——港股10月2日就开盘了,美股全程正常交易。 这篇文章要说的不是“A股休市了”。有仓位的人都知道A股休市。它要说的是: 同一段时间里,你的三个市场仓位在动,你的信息却只跟得上一个。 核心概念是 信息时态差 ——港股和美股的信息是连续的,每天有K线;A股的信息是…

TickDB Research ·