跑得准:300% 的假收益与真的 IC

14 阅读 1264 字 · 约 5 分钟

能跑阶段结束时,循环转起来了,数字和手工核算一致。进入跑得准,目标从「能转」变成「结果可信」:数据对、口径对、因子有效。第一件事,是回测报告里冒出来的 +300% 收益——它完全是假的。

为什么样本要扩到 50 只

跑得准要做因子 IC 验证——因子值和未来收益的相关性。这是截面概念:每个交易日,把当日所有股票的因子值横着比。能跑阶段的 5 只样本算不了截面相关——相关性在 5 个点上没有意义。所以第一步是把样本扩到 50 只:未退市、非 ST、上市满 60 天,按最近交易日总市值取前 50。选样逻辑写成一个脚本,结果固化进配置,可以复现。

300% 的假收益

样本扩大后,回测报告里出现两列刺眼的数字:某票 +313%、另一票 +425%。追下去发现不是行情暴涨,是回测本身的 bug。

第一版回测的账户口径是:用真实价格撮合,持仓股数固定。这个口径在除权日会出事——股票 10 送 10,价格当天腰斩,但回测里的持仓股数没变,权益凭空缩水一半;反过来,配股之类的场景就出现「假」暴涨。规则对每只股票都跑,碰到送转日就产生一次假的巨额收益或亏损。

修法是整个账户换成后复权口径:成交用后复权价、市值用后复权价、权益 = 现金 + 持仓 × 后复权价。后复权价在除权日是连续的,权益不再假跳变。代价也有:费用按后复权金额计算,比例费率不变,但最低佣金 5 元的阈值在放大后的价格尺度下轻微失真——对大盘股几乎不触发,可接受,记进决策。

这个 bug 的教训:回测的价格口径必须自洽。真实价撮合看起来「贴近实际」,但除权日会咬人;后复权口径牺牲一点直觉,换来权益连续。

校验补全 + 真实拒单

跑得准把数据校验补完整了:交易日历完整性(bar 里不能有非法交易日)、停牌事件与 bar 对账(区间内 71 天停牌记录,其中 7 天有 bar 行且标记一致)。

还补上了能跑阶段缺的真实场景:50 只样本里,某票信号日的次日一字涨停,买单被拒;某票信号后恰逢停牌(吸收合并),交易挂起。合成数据自测过的逻辑,在真实数据里各自触发了一次。

IC:动量是真的

因子 IC 验证是本阶段的核心。口径:T 日因子值,对应 T+N 日收益,每日横截面算 Spearman 相关,再对时间求均值。动量 20 日因子在 50 只样本上的结果:

未来 5 日 IC +0.019(t=1.84)、10 日 +0.035(t=3.26)、20 日 +0.038(t=3.66),正 IC 天数占比 55%~57%。

10 日和 20 日窗口显著为正——短期动量在 A 股有效,方向与文献一致。这个结果不是孤证:策略层的信号跟踪也印证了,双均线买入信号后 5/10/20 日的平均收益是 +0.6%/+1.3%/+2.4%,胜率 52%~55%。因子、策略、回测三层各自独立计算,方向一致,可信度就上来了。

结果

7692 项自动断言全过,50 只样本 41 正 9 负。最好的一只 +1323%——这次是真的:光模块龙头的三年行情,后复权涨幅 44 倍,策略全仓单票吃到了其中一部分。

跑得准的产出,除了「数字可以直接用」,还有两条方法论:价格口径必须自洽——假跳变是回测里最隐蔽的错;因子验证要落在可解释的方向上——IC 显著且与文献一致,才敢信。