「回测年化 30%,实盘 -5%」的第一嫌疑人永远不是策略,而是数据清洗。本篇四节对应四种最贵的清洗错误:缺失值处理不当(假收益)、异常值放任(假信号)、幸存者偏差(假基准)、前视偏差(假未来)。最后给出 PIT 数据库的最小设计——它是根治「时点错乱」的工程方案。
缺失值:先问「为什么缺失」,再问「怎么填」
缺失不是缺陷而是信息:停牌导致的行情缺失意味着「不可交易」;财报缺失可能意味着「尚未披露」(正常)或「永久缺失」(退市)。决策树:
- 行情缺失(停牌):不能
fillna(0)(等于假设停牌日免费平仓)。标准做法:价格 ffill 沿用、收益置 NaN、回测引擎在收益为 NaN 时禁止调仓——停牌股既不能买也不能卖,持仓冻结到复牌。复牌日要用后复权价差计算真实跨停牌收益; - 财务数据缺失:区分「未到披露期」(正常,用最近一期已知值)与「未披露/延期」(信号:质量警示因子可用「披露延迟天数」);新三板与部分小盘股长期缺数据,直接纳入会污染因子;
- 分析师数据缺失(无覆盖):不是 0 而是缺失——「0 个分析师预测」与「预测为 0」是完全不同的两回事,pandas 的 NaN 语义恰好正确,别手贱 fillna。
填空的通用守则:任何填充操作之前,先统计缺失率与缺失的时间分布(缺失集中在某段时间 = 数据源事故,不是市场现象)。
异常值:是错误,还是真实的市场?
清洗的第一原则:先怀疑数据错误,再接受极端真实。
- 明确的错误:价格 = 0 或负数、成交量 = 负、收盘价偏离 ±50% 而无除权记录、2020-02-03 之外的「全线跌停」日——修复或置 NaN;
- 真实的极端:2020-02-03(疫情后开盘 A 股 3000+ 只跌停)、2024-02 小微盘连环跌停、WTI 负油价。这些必须保留——它们正是策略尾部风险的真实样本。把极端日「平滑掉」的回测,等于把压力测试的答案提前销毁;
- 判断工具:对照除权除息表(跳空是否有公司行动解释)、对照公告(停牌?重大事项?)、对照多数据源(另一家数据商同日同价吗)。
因子层面的 winsorize(如 ±3MAD 截尾)是另一件事:它是统计稳健性处理(防止一个异常值主导回归),发生在因子计算阶段;而数据层的异常值处理发生在因子之前。两层不要混淆——数据层修复错误,因子层控制影响。
幸存者偏差:你的股票池里有没有死人
只回测「今天还存在」的股票,等于只研究「活到决赛的选手」:退市股(往往是跌得最惨的)、长期 ST、被合并的标的全部缺席。A 股退市率历史上不高但 2020 年后显著上升,影响在小盘策略里尤其致命——小市值策略天然超配「即将退市」的股票,不含退市股的小市值回测是量化界最经典的自我欺骗。
工程解法:用「当时在市」的动态股票池——每个月的回测截面,股票池 = 截面日所有上市交易的股票(含后来退市的),需要数据商提供完整的历史成分与退市记录。检验自己的数据:随便挑一只知名退市股(如乐视网),查它的历史日线与财报能否完整取到——取不到,你的回测全部打折(见数据来源 的采购检验项)。
基金研究的同款陷阱:只统计现存基金 = 把所有清盘基金(多数业绩差)开除出样本,行业平均收益被系统性高估。
前视偏差的三种形态
- 数据前视:用报告期而非公告日对齐财报(最常见);用当日收盘价决定当日买入;用前复权缓存的旧版本;
- 参数前视:用全样本优化的参数「回测」同一样本(见过拟合 );
- 流程前视:股票池用今天的指数成分回测十年前;行业分类用最新申万映射回历史(申万 2021 年大改版,行业因子因此漂移,见行业分类变更 )。
自检问题清单:在回测的每一天 t,这段代码读取的每一个字段,其「可知时间」是否都 ≤ t 的决策时点? 能对每个字段答出「是」并指出字段来源,才算过关。
PIT 数据库:把「时点」做成工程
PIT(point-in-time)数据库的核心设计:每条记录带生效区间,而非只带报告期。
| |
查询接口只有一个语义:get(code, metric, asof=t) 返回 t 时刻市场真实可见的最新值。三条实现纪律:
- 永不覆盖,只追加:修正公告追加新行并带 announce_date,旧值保留(必要时标 deprecated);
- 回填即造假:发现历史数据缺失时「按现在的认知补上」会让 PIT 退化成普通数据库——缺失就缺失,留空;
- 行情、财报、行业、股本全部 PIT 化:股本变动(送转)、行业变更(申万改版)同样有时点问题。
个人研究的最小 PIT 方案:tushare 的财报公告日字段 + 一张自维护的「生效区间表」,配合 asof 查询函数——半天工作量,换来基本面因子的第一道诚信保险(更完整方案见因子存储与版本管理
)。
关联阅读:数据类型 的每类数据陷阱是本篇的输入;公司行动处理 是 A 股落地细节;回测偏差大全 展示这些错误在回测层的最终形态。