本节摘要:数据工程把交易所与信息商吐出的原始数据,变成回测引擎可以安全消费的成品原料。复权、对齐、缺失处理、幸存者偏差修复,任何一步出错,下游的每一个回测结论都会失真——而且失真得毫无声息。本节是第二章流水线的第一站:假设再漂亮,也要先过这道闸门。
想象你入职第一天,前任留给你一个研究目录:几只股票的日频价格文件、一个说明文档,以及一句"数据都处理过了"。你跑通了第一版回测,净值漂亮得让人想立刻申请上线。慢着——你最该做的是先问三个问题:价格是复权的吗?退市的股票在不在样本里?你读到的每一行数据,时间戳属于交易日还是公告日?这三个问题里任何一个答错,你手里那条净值曲线都是艺术品而非证据。数据工程所以排在流水线最前面,因为它决定后面所有环节的"真"字。
复权与价格断层。分红送转会造成价格跳空:除权日当天,未复权价格可能直接掉去百分之十几,策略会被这个"假暴跌"吓出一堆虚假信号。前复权保证最近的价格与行情软件一致,后复权保证历史持有收益计算正确——回测通常用后复权或动态复权,展示才用前复权。多标的对比时,复权基准不一致会制造出根本不存在的相对强弱。
时间对齐与时区。跨市场策略要把两地的交易时段对齐:同一"天"在不同市场的起止时刻不同,收盘价之间隔着的往往不是零秒,而是几个小时的行情空窗。对齐错误在回测里表现为"用还没发生的价格做决策",也就是向前看偏差——它几乎总能显著美化净值。
缺失与异常。停牌、数据源故障、错价(如小数点错位造成的"跳楼价")都需要明确的处理协议:是剔除、前值填充还是插值?协议要写成文档并贯穿全流程。最危险的不是缺失本身,而是不一致——同一份数据里有的股票被填充、有的被剔除,横向比较因子时就会引入结构性偏误。
幸存者偏差。只用"今天还活着"的标的回测历史,等于让退市股集体消失。指数成分要用历史时点的成分名单,股票池要包含已退市标的。这个偏差对选股类策略的影响是系统性的:它会凭空抬高动量与低估值因子的历史表现。
数据管道的工程形态,是把检查固化成代码而非习惯。下面这份伪码骨架,展示了入库前逐项校验的思路:
对每只标的的数据文件: 1. 检查日期连续性: 停牌日是否在停牌名单内, 未预期的缺口要报警 2. 检查价格合法性: 最低价 <= 开盘价/收盘价 <= 最高价, 价格大于零 3. 检查成交量: 成交量为零但最高最低价不同的行, 标记待查 4. 校验复权因子: 除权日的跳空幅度与公告的分红送转比例对账 5. 与第二数据源抽样比对: 随机抽取若干交易日交叉验证 全部通过 → 写入研究库并记录版本号; 任一失败 → 进入人工复核队列
版本号常被忽略,但它极其关键:三个月后你复跑回测,若数据已被修正过,结果对不上旧报告,没有版本记录就说不清谁对谁错。

把数据做扎实不只是防错。高质量的研究库本身就是策略想法的源泉:当你可以一键拉出任意标的在任意历史时点的干净快照,"某个因子在特定市场状态下是否失效"这类问题从几天的手工活变成几分钟的查询。数据管道的成熟度,直接决定策略迭代的节奏——这是团队之间真实的竞争力差距,虽然它从不出现在路演材料里。
看一个真实感很强的数据事故如何发生。某团队回测一只常年分红的龙头股,策略是简单的价格突破。回测净值出众,但交易日志里有个怪象:所有开仓几乎都堆在每年的六七月。排查后发现,该股分红除权日恰在七月——未复权的价格在除权日"跳空低开"若干个百分点,突破了策略的入场阈值,被当成暴跌后反弹的机会买入。复权修正后重跑,这些交易全部消失,策略的真实表现平淡无奇。这个事故的完整价值在于它的三层启示:第一层,数据的错误不会被报错暴露,只会被"结果异常"暴露——交易日志的时间聚集性就是异常信号;第二层,修复必须回到原始层——用公告的分红方案核对除权日前后的价格断层,确认复权因子的正确性,而不是简单地换个复权方式试到"结果变好"为止;第三层,事故要沉淀为管道规则——此后所有标的入库时都自动执行"除权日断层与公告对账"检查。一次事故,三层沉淀,这正是数据工程的成长方式。
问:团队起步阶段,自建数据管道还是采购现成的研究库? 起步阶段采购现成库是对的选择——自建管道的隐性成本极高,而学习价值主要来自使用而非搭建。但采购不等于免责:入库前仍要做抽样对账,把"供应商数据可信"变成一个被检验过的命题而非假设。规模上来之后再考虑把最关键的几类数据自建冗余。
问:数据清洗会不会把真实行情也洗掉? 会,这正是要有协议的原因。极端行情(如历史性的跌停日)看起来像异常值,删掉它等于删掉了压力测试最重要的样本。清洗协议的核心原则是:只修确定无疑的错误(错价、重复、时间倒流),保留一切可能是真实的极端——拿不准的标记而不是删除。
问:基本面数据也要做时点处理吗? 必须做,而且是最容易出事的一类。财报数据的"报告期"与"公告日"相差数周甚至数月,用报告期对齐回测等于提前偷看。正确做法是用公告日作为可用时点,并保留历史上被修正过的旧值——用今天的修正值回测当年,同样是一种未来函数。
⚠️ 常见坑:把"行情软件导出的前复权价格"直接用于长周期回测。前复权会随每次除权整体改写历史价格,隔几个月复跑,同一份策略的回测结果就对不上了。
下一站把假设变成代码:策略构建与回测的完整规则。