当天买入的股票,当天不能卖出,要等到下一个交易日才能卖。 这条规则对回测的影响是:你不可能在知道今天收盘价的同时,还按今天的价格完成交易。
真实的时间顺序是:
如果回测代码写成这样,就是作弊:
问题在于:close[i] 要到 i 日收盘才存在,而 ret[i] 正是
从 i−1 日收盘到 i 日收盘的涨跌。你等于用「当天的结果」去决定「当天的仓位」。
正确写法是把信号和收益错开一天:
不是理论上的小问题。以本站做过的对照为例:同一套择时规则,
| 写法 | 年化收益 | 说明 |
|---|---|---|
| 错误写法(当日信号当日生效) | 50.9% | 引入了未来函数 |
| 正确写法(T+1 口径) | 36.2% | 本站公开口径 |
差了 14.7 个百分点。而且这种错误在净值曲线上看不出来—— 曲线一样平滑漂亮,只是每年凭空多赚十几个点。 如果你看到一个回测的年化收益高得离谱,第一个该怀疑的就是这个。
「在最低点买入、最高点卖出」是最经典的作弊。除非你有明确的盘中触发条件, 否则成交价只能用开盘价或收盘价。
比如用「过去 10 年的平均波动率」去标准化今天的信号——这个平均值里包含了今天之后的数据。 正确做法是只用截至今天为止的数据算滚动统计量。
用今天沪深300 的成分股去回测十年前,会引入幸存者偏差—— 当年被剔除的差公司不在名单里,等于提前剔除了输家。
年报的数据是 12 月 31 日的,但你要到次年 4 月才看得到。 如果用报告期对齐,等于提前几个月知道了业绩。
本站所有策略的回测结果都按 T+1 口径计算,交易成本按单边 5bp 计提, 区间写在面板顶部。这两个假设会明显压低收益数字——但它们是真实可执行的。
一个诚实的 36% 比一个作弊的 50% 有用得多。
取决于策略的换手率和信号类型。日内反转类、高频轮动类策略受影响最大;低频择时策略(比如按月调仓)受影响相对小,但仍然存在一天的执行延迟。正确的做法是在回测里如实建模,而不是忽略它。
指回测样本里只包含「活到今天的」标的,而已经退市、被并购、被剔除的标的没算进去,导致结果系统性偏好。用当前的指数成分股回测历史是最常见的踩坑方式。
几个常用检验:样本外测试(留出一段数据完全不参与调参)、参数敏感性(参数微调后结果是否崩塌)、随机对照(与随机策略比较)、分年度表现(是否只在某几年赚钱)。四条里能过三条以上,才值得进一步研究。