A 股回测,复权因子应该怎么用?

A 股回测的复权因子与四轨设计

复权因子,是调整股价的换算系数。 它用来处理分红、送转等权益事件带来的价格口径变化,让不同日期的价格能够放在同一尺度下比较。

在量化回测中,复权既影响策略怎样判断行情,也关系到成交、账户收益和报告展示。要把这些环节处理正确,需要先弄清楚复权究竟调整了什么。

一、为什么需要复权?

假设持有一只股票 100 股,每股 10 元,股票市值是 1,000 元。

公司实施每 10 股送 10 股,持股数量变成 200 股。假设除权后的股价恰好为 5 元,股票市值仍是 1,000 元。

这里只是一个忽略税费和市场波动的简化例子。但它说明了一件事:股价从 10 元变成 5 元,不代表这笔持仓亏了一半。 每股对应的权益和持股数量一起发生了变化。

如果把这两个原始价格直接连起来,图上却会出现一次下跌 50% 的跳变。计算均线、动量或区间收益时,也会把这次变化算进去。

复权就是为了解决这种比较口径不一致的问题。它根据权益事件调整价格,剔除机械除权的影响,同时保留实际的市场涨跌。

复权因子怎样起作用?

本文采用连乘法解释。把除权前的累计复权因子设为 1,送股后变为 2,那么:

除权前:10 元 × 1 = 10 元
除权后: 5 元 × 2 = 10 元

经过换算,两天的价格就处在同一尺度下。这里的因子来自权益事件及相应的除权调整,不能看到股价下跌,就拿前后收盘价之比去“修平”行情。

实际数据中的累计因子会包含此前权益事件的调整;相邻日期累计因子的比值,表示这两天之间的调整倍数。如果数据源已经提供累计因子,使用时就不应再对它做一次累乘。

为什么又分前复权和后复权?

价格调整需要选择一个基准。

前复权以选定末日的价格为基准,调整此前的价格;后复权以固定的历史价格为基准,调整此后的价格。

继续看上面的送股例子,只考虑除权前后这两天:

时点 原始价格 前复权价格 后复权价格
除权前 10 元 5 元 10 元
除权后 5 元 5 元 10 元

两种方式都消除了机械跳变,区别在于保留哪一端的价格尺度。

图2:原始价格、前复权与后复权走势对比

用 P(t) 表示某天的原始价格,F(t) 表示固定基准下的累计因子,T 表示选定末日,则:

后复权价 = P(t) × F(t)
前复权价 = P(t) × F(t) / F(T)

使用复权数据时,需要先确认计算方法和价格基准,避免混用不同口径的因子与行情。

还要注意:前复权中,基准日的价格与原始价格一致,此前价格已经被调整,不能把它们当成当年的真实成交价。

二、量化回测为什么必须处理复权?

回测需要根据历史行情生成信号,再模拟交易和资产变化。权益事件会同时影响这几个环节。

首先是策略信号。在送股例子中,如果策略直接用原始收盘价计算跌幅,可能因为那次机械的“下跌 50%”触发止损。均线、动量等指标也可能受到干扰。

其次是成交模拟。复权价格用于统一历史比较的尺度,却不一定是当时市场上的报价。如果拿它计算买入股数、成交金额和手续费,资金约束就可能失真。

还有账户收益。送股后,账户里的股份需要增加;现金分红时,需要记录应收股息和现金到账。只调整行情,账户里的资产不会自动变化。

最后是结果展示。如果报告使用前复权 K 线,却把真实成交价直接画上去,买卖标记就可能落在错误的位置。

这些问题说明,回测必须处理权益事件及其影响。至于使用哪种价格口径,要由具体用途决定。

三、复权四轨怎么设计?

可以把信号计算、模拟成交、账户核算和报告展示分为四条轨,各自使用适合的价格与数据。

复权因子负责价格换算,公司行动负责账户中的现金和股份变化。

轨 主要用途 使用的口径
策略轨 行情比较与指标计算 固定基准的后复权价格
撮合轨 模拟订单成交 原始价格与真实交易规则
归因轨 账户权益、净值与盈亏 真实交易及权益账本,按原始价格估值
展示轨 报告 K 线与买卖标记 同一报告基准下的前复权价格

图3:复权四轨的分工、输入和衔接关系

1. 策略轨:用统一的价格尺度生成信号

策略轨使用固定基准的后复权价格,计算均线、动量等指标,减少机械除权跳变对历史比较的干扰。

选择后复权的一个原因是:在基准、数据和因子口径固定的前提下,未来新增权益事件,不会因为末日基准变化而重新缩放此前价格。

这并不意味着前复权不能用于回测。按照本文的连乘法公式,在同一个区间内,前后复权只差一个常数倍。均线交叉、区间收益率等对整体缩放不敏感的信号,通常不会因此改变;“股价低于 10 元”这样的绝对价格条件,则需要使用真实价格。

策略产生订单时,也要明确价格单位。如果限价或止损价是在后复权尺度下计算的,传给撮合前需要转换成对应时点的真实价格。跨日订单遇到权益事件,还应按预先规定的订单规则处理。

固定价格基准也不能代替时间约束:策略在某个时点,只能访问当时可以获得的数据。

2. 撮合轨:按当时真实的市场条件成交

撮合轨使用原始行情,判断订单能否成交,并计算真实的成交金额、资金占用、费用和滑点成本。

例如,策略计划投入 10,000 元,股数应根据当时的真实报价和适用的申报数量规则计算。不能拿后复权价格当作分母,再把算出的股数当成真实持仓。

涨跌停判断也要使用同一真实价格口径。 除权除息日不能机械地用前一天的原始收盘价计算限制价;应使用当日适用的参考基准和交易规则。

这里还需要处理可卖数量、停牌等约束。原始价格提供真实报价,撮合规则决定这笔交易在模拟中是否成立。

3. 归因轨:把收益落实到账户资产

这里的归因轨主要负责账户核算和绩效计算。它记录真实成交、费用,以及分红、送转等公司行动带来的资产变化。

以现金分红为例:持有 100 股,每股 10 元,总市值 1,000 元。公司每股分红 1 元,假设除息后股价恰好为 9 元,忽略税费和其他波动。

这时,股票市值是 900 元,还应有 100 元股息权益。两者合计仍为 1,000 元。如果账户只按“100 股 × 9 元”估值,又漏记分红,就会凭空出现 100 元亏损。

因此,在只有现金分红的简化场景下:

账户权益 = 现金 + 持仓股数 × 原始市价 + 应收股息

应收股息与可用现金需要区分。 确认分红权益后记录应收股息,到账时再转入现金;不能提前把尚未到账的钱用于下单。

送转需要记录新增股份及其到账、可卖状态;配股还涉及是否参与、缴款和股份到账。价格因子无法代替这些事件记录。

是否把分红继续投入股票,也会影响后续收益。例如上述股价后来回到 10 元,分红保留为现金,那么账户资产是 1,100 元,收益为 10%。这个结果不能直接用包含特定再投资假设的复权价格收益替代。

4. 展示轨:让走势图和成交记录对应起来

展示轨可以使用以回测末日为基准的前复权 K 线,将历史走势放到末日的价格尺度下展示。

买卖标记也需要做相同转换:

标记显示价 = 真实成交价 × F(成交日) / F(报告基准日)

例如,送股前以 10 元买入,成交日因子为 1,报告基准日因子为 2,那么标记应画在前复权图的 5 元位置。

图上的 5 元用于定位,成交明细仍然记录真实的 10 元。 这样既能看清买卖发生在走势的什么位置,也能核对实际成交金额。

图5:真实买入价与前复权图上买点坐标的区别

四轨共用什么数据?

四轨不需要各自维护一套独立行情。底层可以统一保存原始行情、累计因子、公司行动、交易约束和成交账本,再按用途生成价格视图。

因子应按股票和生效日期正确对齐;同一天的分钟行情使用当时有效的因子,不能在每根分钟 K 线上重复累乘。真实成交量和成交额保留原始记录,不直接乘价格因子。

这样,策略和展示可以使用派生价格,撮合与账户继续围绕真实交易事实运行,各环节通过明确的转换规则衔接。

四、这样设计,回测结果能更真实在哪里?

首先,减少价格口径错误对策略评价的干扰。正确处理机械除权跳变后,可以减少由此产生的误触发交易,让收益和回撤更能反映策略本身的行为。

其次,把交易放回真实的资金约束中。成交、数量和费用使用真实价格,配合适用的交易规则,能够减少因复权价格混用而模拟出的不合理交易。

更关键的是,净值能够对应到实际资产变化。分红进入应收和现金,送转进入股份,费用从账户扣除。每一天的账户价值都有账本依据,不会因为漏记权益事件出现虚假亏损,也不会把未执行的再投资收益算进账户。

这些记录还让结果更容易核查。从图上的买卖标记,可以追溯到真实成交;从成交与公司行动记录,可以核对现金和持仓;再由这些资产计算净值和回撤。保存数据、因子、策略代码、交易规则及运行参数的版本后,也便于复核同一条件下的回测。

对系统维护来说,四轨明确了每个环节的职责。出现信号异常、成交金额不对或净值跳变时,可以沿对应环节检查,减少口径混用造成的排查成本。

这些好处建立在数据与规则正确实现的基础上。四轨处理的是复权、交易和账户口径的一致性;实际成交的还原程度,还需要由流动性、滑点和成交时点等假设共同决定。

复权因子把历史价格调整到可以比较的尺度,四轨设计则把这种换算放进完整的回测过程。价格如何比较、订单如何成交、资产如何变化、报告如何呈现,都有明确的处理方式。

回测中的收益,应该能够沿着成交和权益记录,一笔一笔核对回来。