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 元 |
两种方式都消除了机械跳变,区别在于保留哪一端的价格尺度。

用 P(t) 表示某天的原始价格,F(t) 表示固定基准下的累计因子,T 表示选定末日,则:
后复权价 = P(t) × F(t)
前复权价 = P(t) × F(t) / F(T)
使用复权数据时,需要先确认计算方法和价格基准,避免混用不同口径的因子与行情。
还要注意:前复权中,基准日的价格与原始价格一致,此前价格已经被调整,不能把它们当成当年的真实成交价。
二、量化回测为什么必须处理复权?
回测需要根据历史行情生成信号,再模拟交易和资产变化。权益事件会同时影响这几个环节。
首先是策略信号。在送股例子中,如果策略直接用原始收盘价计算跌幅,可能因为那次机械的“下跌 50%”触发止损。均线、动量等指标也可能受到干扰。
其次是成交模拟。复权价格用于统一历史比较的尺度,却不一定是当时市场上的报价。如果拿它计算买入股数、成交金额和手续费,资金约束就可能失真。
还有账户收益。送股后,账户里的股份需要增加;现金分红时,需要记录应收股息和现金到账。只调整行情,账户里的资产不会自动变化。
最后是结果展示。如果报告使用前复权 K 线,却把真实成交价直接画上去,买卖标记就可能落在错误的位置。
这些问题说明,回测必须处理权益事件及其影响。至于使用哪种价格口径,要由具体用途决定。
三、复权四轨怎么设计?
可以把信号计算、模拟成交、账户核算和报告展示分为四条轨,各自使用适合的价格与数据。
复权因子负责价格换算,公司行动负责账户中的现金和股份变化。
| 轨 | 主要用途 | 使用的口径 |
|---|---|---|
| 策略轨 | 行情比较与指标计算 | 固定基准的后复权价格 |
| 撮合轨 | 模拟订单成交 | 原始价格与真实交易规则 |
| 归因轨 | 账户权益、净值与盈亏 | 真实交易及权益账本,按原始价格估值 |
| 展示轨 | 报告 K 线与买卖标记 | 同一报告基准下的前复权价格 |

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 元。 这样既能看清买卖发生在走势的什么位置,也能核对实际成交金额。

四轨共用什么数据?
四轨不需要各自维护一套独立行情。底层可以统一保存原始行情、累计因子、公司行动、交易约束和成交账本,再按用途生成价格视图。
因子应按股票和生效日期正确对齐;同一天的分钟行情使用当时有效的因子,不能在每根分钟 K 线上重复累乘。真实成交量和成交额保留原始记录,不直接乘价格因子。
这样,策略和展示可以使用派生价格,撮合与账户继续围绕真实交易事实运行,各环节通过明确的转换规则衔接。
四、这样设计,回测结果能更真实在哪里?
首先,减少价格口径错误对策略评价的干扰。正确处理机械除权跳变后,可以减少由此产生的误触发交易,让收益和回撤更能反映策略本身的行为。
其次,把交易放回真实的资金约束中。成交、数量和费用使用真实价格,配合适用的交易规则,能够减少因复权价格混用而模拟出的不合理交易。
更关键的是,净值能够对应到实际资产变化。分红进入应收和现金,送转进入股份,费用从账户扣除。每一天的账户价值都有账本依据,不会因为漏记权益事件出现虚假亏损,也不会把未执行的再投资收益算进账户。
这些记录还让结果更容易核查。从图上的买卖标记,可以追溯到真实成交;从成交与公司行动记录,可以核对现金和持仓;再由这些资产计算净值和回撤。保存数据、因子、策略代码、交易规则及运行参数的版本后,也便于复核同一条件下的回测。
对系统维护来说,四轨明确了每个环节的职责。出现信号异常、成交金额不对或净值跳变时,可以沿对应环节检查,减少口径混用造成的排查成本。
这些好处建立在数据与规则正确实现的基础上。四轨处理的是复权、交易和账户口径的一致性;实际成交的还原程度,还需要由流动性、滑点和成交时点等假设共同决定。
复权因子把历史价格调整到可以比较的尺度,四轨设计则把这种换算放进完整的回测过程。价格如何比较、订单如何成交、资产如何变化、报告如何呈现,都有明确的处理方式。
回测中的收益,应该能够沿着成交和权益记录,一笔一笔核对回来。