量化的第一道坎:从哪拿到干净的行情数据,又该怎么防坑
我见过不少刚入门的人,兴冲冲地学完Python、看完几本量化的书,信心满满地开始写第一个策略。逻辑想得挺清楚,代码也敲得像模像样,回测一跑,年化收益漂亮得吓人,兴奋得当晚就想拿真金白银试试。结果一深挖才发现,问题根本不出在策略逻辑上,而是喂给模型的数据本身就是错的——复权算错了,退市的股票压根没出现在样本里,财务数据的发布日期和实际可获取日期对不上。这些坑不解决,后面写得再精妙的策略,得出的结论都是空中楼阁。数据是整个量化流程的地基,地基歪一寸,楼建到十层就能歪出一米。这篇文章想把这道最容易被忽视、却又最要命的坎,讲清楚。
常见数据来源
先说说数据一般从哪儿来,这样你至少知道自己手上这份数据”出身”如何,靠不靠谱。
第一类是券商提供的行情接口。如果你在券商开了户,大概率能通过它的交易系统或者API拿到实时和历史的行情数据,这类数据的好处是和你实际下单的市场是同一套体系,时间戳、代码规则都能直接对上,不容易出现”数据来源和交易环境不一致”的低级错误。缺点是不同券商提供的历史数据长度、频率、字段完整度参差不齐,有的只给你近几年的日线,更细粒度的分钟线或者更早的历史数据可能需要额外申请甚至额外付费。
第二类是交易所官方发布的数据。交易所本身会公开一些基础行情和公告信息,这是最权威的一手来源,尤其是涉及除权除息、停复牌这类公司行为的信息,交易所公告是最终的核对标准。但交易所直接提供的数据接口往往不是为普通量化研究者设计的,格式不友好、历史深度有限,大多数人不会直接拿交易所原始数据做研究,而是拿它来做校验——当你怀疑某个数据点不对劲的时候,回去查交易所公告,这才是最靠谱的验证方式。
第三类是第三方数据服务商。市面上有不少专门做金融数据清洗和整理的机构,它们把交易所、上市公司、行业协会等分散的原始数据抓取、清洗、结构化之后打包提供,通常包含历史行情、财务数据、公司行为、行业分类等多个维度,做量化研究的人用得最多的往往是这类服务。这类数据的好处是省心,坏处是你没法完全验证它清洗逻辑背后的每一个细节,得对它的历史声誉和数据质量口碑做一番功课,不是随便找一家用起来就行的。
第四类是开源的数据获取工具和公开数据集。近些年有不少开源社区维护的工具,可以帮你从公开渠道抓取行情、财务等数据,再加上一些公开发布的研究数据集,对预算有限的新手来说是个不错的起点。这类数据的优点是免费、透明、可以自己核对抓取逻辑,缺点是数据完整性和更新及时性通常比不上专业的商业服务,尤其在处理复杂的公司行为(比如换股合并、分红除息)时,容易出细节上的纰漏,需要你自己多留一个心眼去核实。
这几类来源没有绝对的高低之分,更多时候是互相印证——用一类数据做主力,用另一类数据做交叉校验,才是更稳妥的做法。单一数据源哪怕再权威,也架不住偶尔出个bug或者遗漏。
“干净”意味着什么
聊完了从哪拿,再聊聊”干净”这个词到底指什么,很多人对这个词的理解太模糊了,以为只要数据没有明显的乱码或者缺失就算干净,其实远不止如此。
第一层是准确,数字本身要和真实发生的交易一致,不能有录入错误、单位错误(比如把股价的分和元搞混)、代码对应错误(把两只股票的历史数据张冠李戴)。这类错误看起来低级,但在海量数据处理里其实防不胜防,尤其是跨数据源合并的时候,代码规则稍有差异就可能对错行。
第二层是完整,该有的时间段不能有莫名其妙的空洞,该有的股票不能无故缺失。数据缺失有时候是纯粹的采集问题,有时候则暗藏着更深的坑——比如整个板块因为某种原因被数据商悄悄下架处理,而你压根不知道。
第三层是正确的复权处理,这是新手最容易栽跟头的地方,下一节会专门展开讲。
第四层是时间对齐,不同来源的数据,时间戳的记录标准可能不一样——有的按交易时间记录,有的按结算时间记录,财务数据更是有”报告期”和”实际公告发布日期”两套时间体系。如果你在回测里不小心用了”报告期”当作数据可获取的时间点,就会犯下一个非常隐蔽的错误:让模型提前看到了当时根本还没公布的信息,这在业内叫前视偏差,是回测虚高最常见的元凶之一,回测与过拟合里对这类回测陷阱有更完整的讨论。
几个必须注意的坑
说几个新手最容易踩、也最容易被忽视的具体问题。
前复权和后复权搞混。 股票分红送股之后,价格会出现一个人为的”跳空”,如果不做处理,历史价格曲线就会失真。复权就是把这种人为跳空修匀,让价格曲线看起来连续。但复权分前复权和后复权两种算法,前复权是以当前价格为基准往回调整历史价格,后复权是以历史某个基准点往后调整。这两种算法算出来的绝对价格数字完全不同,如果你在计算收益率、判断均线支撑压力位的时候,不小心把两种复权方式的数据混用,算出来的结果会出现莫名其妙的偏差,却很难第一时间意识到问题出在这里。
除权除息处理不到位。 复权的前提是你得先准确抓到每一次除权除息的时间和比例,如果数据源本身对某次分红或者送股的记录有误,或者干脆漏掉了一次除权,那复权算出来的价格从那个时间点之后就全错了,而且这种错误是”传染”的——一次算错,后面所有依赖它的计算都跟着错。
停牌与退市股票缺失,也就是幸存者偏差。 这大概是最隐蔽也最要命的一个坑。很多现成的数据集,只保留了”现在还在交易”的股票的完整历史,那些已经退市、被并购、被摘牌的股票,历史数据要么残缺不全,要么干脆被整体剔除。如果你拿这样的数据去回测一个选股策略,相当于你的样本里从一开始就只包含了”活下来的赢家”,那些当年因为经营不善、财务造假、被强制退市而消失的公司,压根没有机会出现在你的统计里拖后腿。这样算出来的策略表现,天然就会比真实世界乐观得多。
节假日与交易日历没对齐。 不同市场的节假日安排不一样,同一个市场里不同年份的停牌安排也可能有临时调整。如果你在合并多个数据源、或者对齐不同市场数据的时候,用了一份过时或者不准确的交易日历,时间序列就会出现”错位”——某一天的数据实际上对应的是别的日子,这种错位在数据量小的时候很容易被忽略,但一旦规模上去,足以让整个回测的时间基准全部乱套。
数据决定上限
有一句话我很认同:策略的下限由风控决定,但策略的上限,很大程度上由数据的质量决定。再精妙的因子逻辑、再复杂的模型架构,建立在有偏差的数据之上,得出的所有结论都要打一个大大的问号。反过来,哪怕策略逻辑朴素得像小学数学,只要数据干净、时间对齐准确、复权处理无误,至少你能相信自己看到的回测结果没有被数据本身的瑕疵扭曲。很多人愿意花大量时间打磨策略参数,却不愿意花一天时间去核对数据质量,这个优先级顺序其实是反的——数据没搞干净之前,任何策略优化都是在错误的地基上精雕细琢。
[!pitfall] 用一份剔除了退市股票的数据去回测选股策略,相当于只统计了”活下来的赢家”,结果必然虚高。这不是危言耸听,而是量化圈里被反复验证过的教训:很多历史上看起来”稳赚不赔”的选股因子,一旦把当年退市、被ST、被摘牌的股票重新纳入样本,收益立刻大幅缩水甚至转负。幸存者偏差不会在回测报告里明确提醒你”我在这里”,它只会安安静静地把你的收益率往上抬一截,直到你拿真金白银去验证的时候才会显形。
小结
量化投资的每一步都建立在数据之上,而数据这道坎,恰恰是最容易被新手跳过、却最不该被跳过的一步。常见的数据来源各有优劣,没有哪一种能单独兜底,互相校验才是稳妥的做法;“干净”这个词背后是准确、完整、正确复权、时间对齐这几层要求,缺一不可;而复权混用、除权除息处理不到位、幸存者偏差、交易日历没对齐,是新手最常踩、也最容易被忽视的几个具体的坑。花时间把数据这一关过扎实,远比急着去调策略参数更划算——这是量化这条路上,性价比最高的一份”笨功夫”。想继续系统学习量化这条主线的内容,可以回到L5 量化投资看看还有哪些内容值得补。
本文仅为投资教育科普,不构成任何投资建议。量化策略的历史回测表现不代表未来收益,数据质量问题可能导致回测结果与实盘表现存在显著差异,投资有风险,决策需谨慎。