做量化这些年,我在取数这件事上踩过的坑,比策略回测亏掉的钱还多。刚开始写策略时觉得行情数据嘛,随便找个股票api接口拉下来就能用,后来才发现,数据源选得对不对,直接决定策略回测可不可信,实盘跑起来稳不稳。市面上叫得上名字的接口我基本都试过一轮,从免费社区库到带积分门槛的专业数据服务,从一次性拉全量到增量订阅,这篇就把我的真实体验和最终落地的方案一次聊透,给正在数据地基上挣扎的量化人一个参考。
1. 量化人为什么总在取数这个不起眼的环节上翻车
很多刚开始接触股票api接口的人会觉得,取数不就是写个循环调接口、然后把返回的JSON存下来吗?哪有那么多讲究。实际做下来你会发现,取数模块往往是整个量化项目里最难维护的部分,而且它一旦出错,你根本察觉不到——策略不会报错,回测照样能跑完,只是结果悄悄就偏了。
1.1 行情数据是量化的地基,地基歪了整栋楼都歪
我早期用某个免费数据源跑一个双均线策略,日线级别,逻辑很简单,回测年化做到30%多,回撤也不大。当时还挺高兴,后来换了一个权威数据源做交叉验证,同样的策略代码、同样的参数,年化直接跌到12%。我当时第一反应是策略代码里有bug,查了半天没查出问题,最后把两根K线拉到一起比对才发现,两个数据源的复权方式根本不一样:一个用的是前复权,另一个接口返回的是未复权数据,但字段名上没有任何明显提示。
这就是量化数据最坑的地方:数据口径错了,策略不会报错,只会给你一个看起来很有逻辑的错误结果。等到你拿着这个错误结果去配参数、做资金管理,所有后续决策都建立在一堆不可靠的K线上,那已经不是“量化”了,是在掷骰子。所以我后来一直跟团队里的人说,数据源选型是量化项目里优先级最高的事,没有之一。
1.2 “能拉到数据”和“能放心用数据”之间隔着十万八千里
衡量一个股票api接口合不合格,不能只看能不能拉数据,得从几个维度综合看:
- 字段完整度:除了开高低收成交量,有没有复权因子、停牌状态、涨跌停标识、股本变动这些衍生字段。很多策略需要这些信息做状态过滤,缺一个字段就得自己拼凑,拼凑就容易出错。
- 更新及时性:收盘后多久能取到当日数据。有的数据源要到晚上八九点才更新完,你想盘后快速复盘、跑一遍信号就很被动。
- 限频和配额:分钟级数据、全市场批量拉取时,限频松紧直接决定你的脚本要跑多久。有些接口单次只能返回几百条记录,拉全市场几千只股票的日线得循环几百次,慢到怀疑人生。
- 长期稳定性:接口会不会突然改字段名、改返回结构、或者干脆停服。这决定了你的数据采集脚本要不要经常跟着改。
- 历史数据深度:能不能拉到1990年开市以来的数据,还是只能拿最近几年的。做长周期因子回测时,历史深度不够等于白搭。
这五个维度里面,最容易忽略的是最后一个。很多人策略只回测最近两三年,觉得历史深不深无所谓。但等你开始做牛熊周期对比、做长周期均值回归因子时,发现自己手上的数据只有三年,那种挫败感真的很强。
1.3 这篇文章适合谁看
如果你属于下面的某一种情况,这篇实测复盘应该能帮你省下不少时间:
- 刚开始学量化,不知道该用哪个数据源,正在各种论坛里翻评测。
- 已经写了取数脚本,也跑通了回测,但总觉得结果不太可信,想换数据源交叉验证。
- 策略从回测走向模拟盘或者实盘,发现行情推送、交易接口和数据接口之间衔接得很别扭,想找一个整体方案。
我讲的不是那种“把所有接口全部买到手,数据全堆在硬盘里”的土豪玩法,而是一个普通量化开发者怎么用有限的预算和精力,搭一套能让自己睡个好觉的数据基础设施。
2. 选股票api接口之前,先对着自己的策略问三件事
市面上股票api接口真的很多,每个都有自己的一套说法。但如果一上来就挨个注册、挨个试,效率很低,而且很容易被各种宣传话术带偏。我在踩了一轮坑之后总结出一个经验:先别急着看接口文档,先回去看自己的策略到底需要什么,带着需求清单去选型,才是最快最准的路。
2.1 你的回测和实盘,能不能用同一套数据口径
这是我最先想清楚的问题。很多人的回测是拿历史K线跑,到了实盘阶段又用另一套行情源,这两套源的数据口径很可能不一致。最典型的就是复权问题:回测里用了前复权数据,但实盘的行情是不复权的,你基于前复权算出来的指标阈值,在实盘的不复权K线上往往会失灵。涨停、跌停、停牌这些状态在回测数据里如果不做标记,会导致策略在实盘不断买入停牌股或者涨停板上排队,回测收益很漂亮,实盘却买不进去。
所以我选择接口时的第一条硬性标准就是:它能不能提供未复权原始数据,同时附上完整的复权因子。我宁可自己实现复权计算,也不想被动接受一个说不清口径的黑盒数据。后不后悔这个决定?一点都不后悔。虽然自己算复权多写了几十行代码,但它让我在回测和实盘之间有了一个精确可控的转换层,不再需要猜数据源到底做了什么。
2.2 你的策略交易频率,决定了你需要什么粒度的数据
做中长线的人,日线数据基本够用;做日内或者高频的,至少要分钟级,甚至tick级。不同数据粒度对接口的要求完全是两个量级。
日线数据大部分免费接口都能给得很齐全,数据量也不大,一次性全量拉完也才几百MB。但分钟级数据就完全是另一个故事了。一支股票一天就有240根一分钟K线,全市场五千多支股票,一年就是数亿条记录。再加上分钟级接口普遍有更严格的限频,拉全市场一天的分钟数据可能要连续跑好几个小时。
我个人策略主要以日线和60分钟线为主,很少做tick级别。所以在选型时,我对接口的最低要求就是能稳定拉取全市场的60分钟K线,并且不会动不动触发限频需要等很久。如果你的策略需要tick数据,那免费接口基本不用考虑了,得直接上商业数据服务,成本会高很多,这个要提前有心理准备。
2.3 除了行情,你的策略还要用到哪些非行情数据
很多策略不只是看K线,还需要财务数据、北向资金、龙虎榜、融资融券、板块成分股这些信息。这些数据的获取难度和行情K线完全不一样。K线好歹还有几个免费接口可以稳定提供,财务数据这种结构化程度高、更新频率不固定的数据,反而是各家数据服务商拉开差距的地方。
我在选择数据源时,会把“除了K线之外,我还需要什么数据”列一张清单,然后逐个去对照接口的能力。
| 数据类型 | 使用场景 | 数据频率 | 接口能力要求 |
|---|---|---|---|
| 日K线 | 绝大多数策略 | 每日 | 免费接口基本够用 |
| 分钟K线 | 日内/波段策略 | 每日 | 需要留意限频 |
| 财务三表 | 基本面选股 | 定期/公告 | 需要结构化完整 |
| 复权因子/股本 | 数据预处理 | 低频 | 很多接口会遗漏 |
| 涨跌停/停牌 | 状态过滤 | 每日 | 需要非标准字段 |
| 板块/概念成分 | 行业轮动 | 低频更新 | 不同源差异大 |
做完这张清单你会发现,很多接口并不是没有行情能力,而是覆盖面不全。比如有些免费接口K线拉得很顺,但财务数据结构化程度低,或者压根不提供板块数据。等到你的策略需要往这些方向扩展时,就会发现又要新接一个数据源,然后面临不同源之间的数据对齐问题,那才是真正让人头大的开始。
3. 实测记录:几个主流股票数据接口的真实使用体验
接下来说说我实际用过的几款接口。为了不给任何一家做广告,我就用它们的产品类型来代称,重点讲体验和适合场景。任何工具都有它最舒服的位置,关键是你要知道它适合干什么、不适合干什么。
3.1 极简免费型:适合回测初筛,但别指望更多
先说一个很适合起步阶段的接口——Baostock。它是免费的,不需要注册token,直接pip安装就能用。覆盖A股日线、周线、月线、分钟线,历史数据很全,而且更新时间基本到当天收盘后。它的一大优点是比较“规矩”,数据返回结构稳定,字段命名也比较规整,做回测初筛很省心。
但它的短板也很明显:没有实时行情,也没有tick数据。这意味着如果你做的是需要盘中决策或者高频交易的策略,它完全胜任不了。另外,它的财务数据覆盖面比较窄,更新也不够及时,像资产负债表、利润表这种详细数据就别指望着用它拿全。
我最开始就是用Baostock把整套研究流程跑通的。当时写了一个简单的数据层,每天收盘后自动增量拉数据、存到本地SQLite,然后所有策略研究都从这个库里读数据。它让我在零成本的情况下建立起了完整的数据处理管线,这份经验后来换到其他数据源时帮了大忙。
3.2 老牌积分制专业数据服务:字段齐全,但你需要学会做减法
接下来是Tushare Pro,算是国内量化圈用得非常广的老牌数据服务了。它的优势是数据覆盖面很广,行情、财务、宏观、另类数据都有,且历史数据深度和完整性相对好。它的使用方式是注册获取token,部分核心接口需要达到一定的积分要求才能调用。
实测下来,Tushare Pro做中低频策略、基本面因子研究很舒服,财务数据质量比免费开源库好不少。而且它提供了相对规范的日线行情和复权因子,可以让你自己实现复权逻辑。缺点呢?第一,经常要关心积分和调用频次配额的问题,尤其是你一口气需要拉全市场几千支股票时,限频会让你很难受,得写重试、退避、分批拉取的逻辑。第二,字段虽然全,但也很庞杂,文档经常翻半天找不到想要的那个字段说明。
它的定位我总结下来就是:数据全面、结构可靠,适合有一定工程能力的人去做二次加工。如果你刚入门,一上来就上这个,可能会被各种限频和字段规则劝退。
3.3 大而全的开源聚合库:临时救场很好用,但不能当数据底座
Akshare也是很多人推荐过的开源库,它最大的特点就是“什么都想接”,不只有股票数据,还有期货、外汇、基金、宏观、甚至各种电商和社交数据。接口数量非常庞大,数据源来自各大公开网站,基本你能想到的公开数据它都有对应接口。
但它的问题恰恰也出在这个“大而全”上。因为数据源是公开网站,网站改版、加验证码、接口变更都会直接影响它的可用性。我用它的时候经常遇到今天能跑通的接口,过几天突然返回空数据,或者某个字段类型悄悄变了。它更像一个“数据杂货铺”,适合你临时需要某个冷门数据时上去翻翻,不适合作为你每天都要稳定拉取的核心数据底座。
不过它仍然有一个我无法割舍的价值:当你需要验证一个数据源的数据、或者找一个冷门宏观指标的时候,Akshare往往是最快能给你答案的地方。我现在的做法是把它放在“补充来源”的位置,不参与主数据的每日调度,用到时才拉一次,拉了之后存到本地,避免被它后续变化影响。
3.4 平台型SDK顺带说一句
除了上面几类,我还试过一些量化平台提供的Python SDK,这类接口数据质量普遍不错,尤其是分钟数据的稳定性和准确性让人放心。但代价是它们往往绑定特定平台,有些数据只能在平台内使用,或者需要开通特定权限。
测试之后的感受是:这类SDK适合你干脆把策略直接部署在那个平台上,使用它的一站式环境。如果你像我一样,习惯把自己写的回测框架和策略代码都放在自己的环境里,那绑定平台的数据源就会觉得有点像穿了件不合身的衣服,表面光鲜,各种难受。
3.5 “调通了”不等于“能用了”,接口验收要做的几件事
我建议每个数据源在正式进入你的选型池之前,先做一整套“验收动作”,而不是只在Notebook里调几个样例就下结论:
- 全市场拉取测试:别只测一支股票,要按你的真实场景做全市场批量拉取,记录总耗时、失败率、重试次数。
- 数据完整性检查:把拉下来的K线按“交易日历”对齐,看有没有缺日期、缺记录的情况。停牌股、新上市的股票尤其容易在数据里制造缺口。
- 复权正确性验证:用复权因子自己算一遍前复权价格,拉一段你熟悉的股票K线人工核验除权除息当天的价格跳空是否符合预期。
- 字段漂移监控:每隔一段时间对比一下数据结构是否变化,防止字段名、单位、类型悄悄改变。
- 不同数据源交叉验证:同一支股票同一天的K线,拿两个源的数据做对比,看开高低收、成交量是否有系统性偏差。
做完这几步,你才敢把这个数据源真正接入到你的量化流程里。很多朋友问我为什么策略回测结果总是不稳定,我第一反应就是先问问他们的数据有没有做过交叉验证。数据不交叉验证,策略结果就永远只能停留在“玄学”阶段。
4. 一套回测数据对不上的深夜排查,暴露了真正差距
光说泛泛的接口评价可能还不够,我把一次真实的数据排查过程放出来,你看了就知道接口选型背后的水有多深。
4.1 现象:同一套策略,两个数据源的回测结果南辕北辙
去年做一个基于均线突破的中低频策略,先用免费接口跑出来的年化是22%,最大回撤15%。后来我想做交叉验证,把同一份策略代码切到另一个专业数据源的数据上,结果年化变成了9%,最大回撤扩大到28%。策略逻辑一模一样,参数一模一样,唯一变化的就是K线来源。
最让我抓狂的是,打开两个数据源看同一支股票最近一年的日线,肉眼根本看不出区别,收盘价也就差个一分钱两分钱。怎么汇总到策略层面,结果能差这么多?策略代码我一行行检查了三遍,没问题。那问题一定在数据本身,但在哪里呢?
4.2 排查过程:从除权除息开始,一路查到复权因子
我最后是用二分定位法缩小范围的。先只取十支股票,两个源各跑一遍,还有差异;再取一支股票,跑一遍,差异依然存在。说明不是股票池分散化的问题,是单支股票的K线数据有问题。
然后我拉出这支股票在最近一次除权除息日前后几天的K线做对比,发现差异出现了——有除权除息的日子,两个源的日K数据有一条会跳空,另一条不跳空。再往深挖,其中一个数据源在“未复权”的接口里返回的数据其实做了某种隐式处理,把除权当天的价格做了调整,但它文档里的说明很含糊,字段名跟官方标准对不上。
另一个数据源返回的虽然是标准的未复权数据,但它的复权因子在某些历史时点有偏差。这个偏差在当根K线上只影响一点点价格,可一旦你的策略用到了连续多日的涨跌幅计算,这些“一点点”就会通过复利效应被放大,最终体现在收益曲线上就是两位数的差距。
4.3 修复方案:干脆不用别人的“复权结果”,全部自己算
那次排查之后,我把整个数据处理逻辑重构了。现在我的原则是:
- 所有历史K线都存未复权原始数据,保留开高低收、成交量、成交额,不做任何换算。
- 复权因子单独存储、单独管理,每一个因子都记录它的生效日期和来源。从我信任度最高的数据源拉取,并做完整性校验。
- 前复权、后复权、涨跌幅计算全部在本地由代码统一实现,任何策略模块需要复权数据时都走同一个计算函数,不允许每个策略各算各的。
这么做的好处是:我不再被某个数据源的“复权口径”绑架。回测和实盘之间,我只需要确认我拉到的实时行情用的是和未复权历史数据一致的口径,就能保证整个链条是自洽的。
那次深夜排查也让我彻底明白了一件事:好的数据接口不在于给你多少“处理好的数据”,而在于愿不愿意给你最底层的原始数据和足够的元数据,把加工逻辑交还给你。从此以后,我的选型表里多了一条硬指标:“是否提供独立的复权因子”,很多花里胡哨的接口直接在这一条上就出局了。
5. 我最终落地的省心取数组合与本地数据规范
经过那么多接口的反复来回,我目前跑量化数据已经趋于稳定。省心的关键不是找到一个“终极完美接口”,而是把几类接口放在合适的位置,再利用统一的本地存储和调度把它们组装起来。
5.1 我的“省心”组合是这样的
| 数据需求 | 当前方案 | 理由 |
|---|---|---|
| 历史日K线 | Baostock | 免费、稳定、未复权原始数据完整 |
| 复权因子与股本数据 | Tushare Pro | 数据规范,适合自建复权计算 |
| 财务与北向资金等 | Tushare Pro | 覆盖面广,适合做基本面因子 |
| 冷门补充数据 | AkShare | 接口多,临时取数很方便 |
| 分钟级K线 | 按需从已验证的源拉取 | 满足策略频率,不做全市场堆积 |
这套组合的核心思路很简单:高频率、长期依赖的数据用最稳的源;中等频率的数据用可查证、可追溯的源;低频补充数据用最灵活的源。每个接口只做它最擅长的事,避免为了一个数据点把整个流程绑在一个脆弱的数据管线上面。
5.2 本地存储与增量更新规范
数据源只是上游,真正让我觉得“省心”的,是搭好了本地数据仓库之后的效果。我目前的目录结构按“市场/数据类型/周期”来组织,每类数据单独存放。日线数据用Parquet格式按年分文件,增量更新时按日期追加,避免每次全量拉取浪费配额。
增量更新脚本挂在每日收盘后的定时任务里,流程是:
- 从数据源拉取当日增量数据,先不覆盖本地旧文件,写入临时目录。
- 对临时数据做完整性检查:交易日数量是否符合预期、成交量是否大于0、价格是否有异常跳空。
- 校验通过后,再合并进正式数据目录。
- 每晚固定时间对所有数据文件做一次交叉源抽检,随机抽取若干股票比对两套数据源的开高低收,偏差超过阈值就告警。
这样处理之后,我基本告别了“跑回测前花两小时手拉数据”的日子。每天去检查数据更新情况已经变成了一个纯粹的可选动作,而不是一个必做动作。
5.3 数据校验与异常兜底,日常工作中最容易被忽略
数据仓库最怕的不是缺数据,而是数据错了但看起来很正常。一个小小的数值错误嵌在几千条K线里,模型不会主动告诉你这里有问题,直到某一天某个因子的回测结果突然发疯。所以我现在宁可每天多花几分钟做校验,也不愿在出问题时花一晚上追溯。
我自己在用的几个土办法,效果很实在:
- 极值检查:每只股票的日收益率超过±20%就告警(新股上市首日等特殊情况另说)。
- 成交量突降检查:当天成交量为0或比前5日均量低90%以上,标记为“疑似停牌或数据异常”,人工确认。
- 日期连续性检查:核对交易日历,看是否存在缺失交易日。很多时候数据源漏更新,不是接口报错,而是静默返回空。
这些检查逻辑用Python写起来也就一百来行,却帮我挡掉了至少三次灾难性的数据事故。有一次就是靠成交量突降检查发现某源在更新时静默丢了三百多支股票当天数据,要是没发现,基于这个数据跑出来的选股结果全都会是错的。
6. 给还在地基阶段挣扎的量化人的几句大实话
最后这部分不谈技术选型,聊一些我在数据这条路上趟出来的体会,希望能帮刚开始的人少走一点弯路。
6.1 起步阶段,免费方案完全够用,别急着付费
很多人一开始就想是不是得花钱买专业数据才能做好量化。我的回答是:除非你要做tick级高频,或者你的策略已经经过长期实盘验证、资金规模大到需要靠降低数据延迟来提升收益,否则免费方案的数据质量完全足够支撑你跑通策略研究和模拟盘验证。
一开始就追求“最贵最全”的数据服务,反而容易陷入“数据搬家”的泥潭。你有大把数据却不知道怎么处理,每天光更新、清洗、对齐就把时间耗光了,真正用在做策略上的精力少得可怜。先用免费方案把一整套研究和回测流程跑通,等你有明确的增量数据需求时再去扩容,这个节奏从容很多。
6.2 懂行情数据的人,才算真正入了量化的门
我见过不少新人啃了几个月机器学习,上来就想用LSTM预测股价,结果连最基本的“前复权数据不能直接用未复权价格做计算”都没意识到。做量化,模型的数学能力是锦上添花,数据基本功才是雪中送炭。
把下面几个知识点吃透,比多学十个算法都管用:
- 前复权、后复权、未复权之间的换算关系,以及各自的适用场景。
- 除权除息对K线的价格跳空影响,以及复权因子怎么产生。
- 停牌股票在K线上的表现,以及回测时该如何跳过这些停牌期。
- 涨跌停状态下数据该怎么处理——很多回测结果过于乐观,就是因为策略在涨跌停板上“假装成交”了。
这些数据基本功一旦建立起来,你再看各种数据接口的文档,关注点就会完全不同。别人关心哪个接口返回快,你关心它有没有给你够用的字段来还原真实交易环境。这种差异,在长期实盘里会被迅速放大。
6.3 警惕数据接口焦虑,深耕一套方案比不停迁移更有价值
说实话,量化社区每天都在涌出新的数据接口和工具,很容易让人产生一种“是不是我用的这个不够好、是不是还有更厉害的我没用上”的焦虑。我现在对这种心态有了比较强的免疫力,因为实验得越多越明白,真正限制策略产出的往往不是数据接口本身,而是你有没有把一套数据方案用透、把清洗和校验做扎实、把策略逻辑和数据口径对齐。
我的建议是,用两周时间选定一套方案,然后用三个月时间把它打磨到极致,直到你对它每个数据文件的更新节奏、每个字段的变动习惯都烂熟于胸。这时候哪怕真出现接口停服或者字段变更的情况,你也能很快发现并提出替代方案。没有这种“人机合一”的熟悉度,随便换哪个高级接口,你都会觉得不好用。
我看过太多人一年换了好几个数据源,硬盘里存了十几个不同格式的数据集,结果没有一份数据被严格验证过,这其实不是在搭数据平台,是在给自己埋雷。找数据接口的方式和做策略训练很像:拿住一套逻辑,把它做实做透,比三天两头追新要靠谱得多。