回测最容易算错的三类日子:停牌、一字板、除权除息怎么处理

回测里出错概率最高的是停牌日、一字板日和除权除息日:停牌日的价格是停在那里的旧价,一字板在回测里能成交但实盘排不进队,除权除息日的跳空会被当成下跌。这三类日子都不报错,只会让净值曲线悄悄变好。本文给出识别条件、处理口径,以及本站实测踩到的一个让单笔收益恒大于等于零的公式漏洞。

更新于 2026-08-01

同一份日线数据、同一套买卖规则,只把停牌日、一字板日、除权除息日这三类交易日的处理方式换一遍,回测净值曲线可以从上扬变成下滑。麻烦在于它们都不报错:K 线还在,字段齐全,程序跑得通,但那一天的价格不代表你能成交的价格。停牌日的收盘价是停牌前留下的;一字板的收盘价确实成交过,只是成交的不是你;除权除息日的开盘价和前一天的收盘价根本不在同一个标尺上。

三类日子的对照

日子类型数据里的样子回测里会怎么错处理方向
停牌日部分数据源直接缺这一天,部分用停牌前价格补齐,成交量为 0 或缺失拿补齐价当成交价,或把停牌期当成"持有但零波动"按成交量与停牌标志识别,信号顺延到复牌后首个有成交的交易日,并记录顺延天数
一字涨停开=高=低=收,等于当日涨幅上限参考价,成交量远低于近期水平撮合直接按收盘价或开盘价成交,凭空买到排不上队的筹码命中即标记为不可成交,该信号作废或顺延
一字跌停同上,方向相反认为止损单能在跌停价出掉,低估回撤卖出侧同样拦截,顺延到真能成交那天
除权除息日不复权数据上出现向下跳空,幅度接近每股现金分红或送转比例把除息缺口算成当日亏损用复权价算收益率,并与分红送转事件表核对
三类特殊交易日在回测里的表现与处理方向

停牌:先定义清楚哪一天算"下一个交易日"

停牌的第一个问题不是价格,是日历。策略说"信号日之后第一个交易日买入",这个"第一个交易日"指的是交易所日历上的下一天,还是这只票下一次真正开盘的那天?停牌期间两者会分叉。不写清楚,代码就会按交易所日历取到一根被前值补齐的 K 线,用当天根本不存在的价格成交。三种处理各有代价。

  • 作废:信号之后首个交易日停牌就丢弃该信号。最保守,代价是系统性删掉"停牌前有异动"这一类样本,本身带选择性。
  • 顺延:等复牌后第一个有成交量的交易日按开盘价成交,同时把顺延天数写进交易记录。我们现在用这一种,但它隐含了"回测时点就知道这票会复牌"的假设。
  • 设上限:顺延超过阈值直接作废。上交所对筹划发行股份购买资产的短期停牌规定停牌时间不超过 10 个交易日(来源见文末),可以拿它当参考量级;超过这个量级多半是重组、重整一类事件,复牌后常见连续无量涨跌停,顺延成交价不可信。

一字板:回测里能成交,实盘排不进

涨跌幅限制是一字板存在的前提。沪深主板日常交易涨跌幅为 10%,科创板与创业板放宽到 20%,北交所为 30%;全面注册制下主板、创业板、科创板的新股上市后前 5 个交易日均不设涨跌幅限制。另有一条时间线要注意:主板风险警示股票(ST/*ST)原本是 5%,三所 2026 年 4 月 24 日修订交易规则、自 2026 年 7 月 6 日起统一调整为 10%,跨这个日期的长周期回测必须分段套用当期规则,否则就是拿今天的规则去卡历史 K 线——那也是一种未来函数(来源见文末)。当买盘把价格顶到上限并封住全天,开高低收四个值收敛成同一个数,成交量往往只有平日的零头,那点成交是极少数早排上队的委托吃到的。撮合函数如果只写一句取收盘价,就等于假设你也在那批人里面。

  • 识别条件是四值相等,且该价格等于按前收盘价与涨跌幅比例算出的上限。不同板块比例不同,要按所属板块分别算,不能全市场一刀切 10%。
  • 加一条成交量或换手率显著低于近期水平的条件。只用价格判断会把少数低波动的票误判成一字板。
  • 这里有个取舍:涨停不等于一字板。盘中打开过的涨停当天有真实成交,把所有涨停日一律剔除会连可交易的样本一起删掉,让策略看起来比实际更差。我们只拦一字板,普通涨停保留但打标记。实盘一字板的真实成交概率取决于封单量、撤单节奏和报单速度,需要逐笔委托数据才能估计,本站没做过这层验证,具体数值未核实。

除权除息:跳空不是跌,复权也不是算一次就定了

除权除息参考价的算法是:(前收盘价 − 现金红利 + 配股价 × 流通股份变动比例) ÷ (1 + 流通股份变动比例),除权除息日它会显示在行情的"前收盘价"位置,当天涨跌幅按它计算(来源见文末)。不复权数据上这一天会出现一个向下跳空,用它算日收益率,就是把分红当成了亏损。

换成复权数据也不是一劳永逸。前复权因子从当前时点往回推,每发生一次分红送转就要重算全部历史价格,所以同一段前复权数据半年后再取,数值不一样,昨天的回测今天复现不了;送转比例高的老票一路往回折算,甚至能算出负价格。我们把回测口径固定在后复权上,前复权只用来画图给人看。另外两个数据源如果只在除权日对不上、其余日子都能对齐,那多半不是行情错了,而是复权基准日不同,这条可以直接当校验规则用。

我们自己踩的坑:换了收益公式之后,单笔收益恒大于等于零

把单笔收益公式从"次日开盘买入 → 次日收盘卖出"改成"信号日收盘买入 → 次日(最高价 + 收盘价)/2 卖出"之后,回测曲线立刻好看了一截。查下来是买卖两端解析到了同一根 K 线:当日期对齐出问题、或者次日恰好停牌被前值补齐时,买入价取了这根 K 线的收盘价,卖出价取了同一根的(最高 + 收盘)/2,而最高价按定义不低于收盘价,这笔交易的收益就恒大于等于 0。它不抛异常也不产生空值,只是让净值单调变好。现在撮合函数里有一条硬性断言:买入 K 线的日期必须严格早于卖出 K 线的日期,违反就抛错中断整个回测,不允许静默跳过。

口径本身能差多少,我们量过。2026 年 7 月 30 日那批信号次日全部低开,按"次日开盘 → 次日收盘"算平均 +0.56%,按"信号日收盘 → 次日(最高 + 收盘)/2"算平均 −0.28%,差 0.84 个百分点,而且正负翻面。差额来自被前一种口径丢掉的隔夜跳空。两种口径都说得通,但必须在跑之前定死,并写进报告。

数据清洗自查清单

  1. 1逐日检查成交量是否为 0 或缺失,标记停牌日,并看一眼每只票的停牌天数分布。
  2. 2按各板块自己的涨跌幅比例算当日上下限,标记四值相等且触限的 K 线,撮合时置为不可成交。
  3. 3撮合函数断言买入 K 线日期严格早于卖出 K 线日期,违反即中断,不要用 try 吞掉。
  4. 4收益率一律用后复权价算;落库存原始未复权价加复权因子,因子快照带取数日期戳,报告里写明用的是哪一天的因子。
  5. 5同一策略至少跑两种买卖口径,差值超过预设阈值就先查数据,不要先调参数。
  6. 6统计剔除不可成交日之后剩下的样本量和收益贡献。如果大部分收益来自被剔除的那些日子,说明策略依赖的是买不到的行情。

适用边界

以上只解决"这一天能不能成交",不解决滑点、冲击成本和委托排队顺序。涨停封单里的成交概率、大额委托对价格的推动,都要逐笔或盘口数据才能估,本站没有做这一层。另外这些规则以 A 股现行制度为前提,涨跌幅比例、停复牌要求会随交易所规则修订变化,跨年度的长周期回测需要按当期规则分段处理;用今天的比例去卡五年前的 K 线,同样是一种未来函数。

参考来源

  • [上海证券交易所:上市公司股票停复牌规则(PDF)](https://www.sse.com.cn/lawandrules/regulations/csrcannoun/c/10117071/files/0fd388b1dd74481399208fed0cee4108.pdf) 与 [上市公司自律监管指引第 4 号——停复牌(第三方转载,以上交所官网原文为准)](http://www.tzyhj.cn/rule/11/shzqjysssgszljgzyd4h-tfp2025n3yxd.html) — 停牌事由、停牌期限,含短期停牌不超过 10 个交易日的规定
  • [上交所修订发布《上海证券交易所交易规则》](https://www.sse.com.cn/aboutus/mediacenter/hotandd/c/c_20260424_10816474.shtml) 与 [主板风险警示股票涨跌幅比例调整征求意见](https://www.sse.com.cn/aboutus/mediacenter/hotandd/c/c_20250627_10783267.shtml) — 主板涨跌幅比例
  • [天风证券投教:科创板股票交易规则必知](http://edu.tfzq.com/index/article/?id=18221) — 科创板 20% 涨跌幅、新股上市前 5 个交易日不设限
  • [上交所投教热线问答:关于除权除息](https://www.cls.cn/detail/1306861) — 除权除息参考价计算公式
  • 口径差异 0.84 个百分点、同一根 K 线致收益恒大于等于零、前复权历史随分红重算等结论,均来自本站自有回测系统的实测记录,非公开数据。

相关笔记