问题描述
get_divid_factors dr 因子跟其他平台有差异,这个计算方式的原理是什么?
解决方案
在量化交易中,复权因子(dr因子)的准确性直接影响回测结果的可靠性。很多开发者在使用 QMT 平台的 ContextInfo.get_divid_factors(stock.market) 获取除权除息日和复权因子时,会发现其数值与聚宽、Wind、Choice 等其他平台存在细微差异。这种差异主要来源于复权计算原理、基准日选择以及分红再投资假设的不同。以下是详细的原理剖析:
### 1. QMT get_divid_factors 函数简介
在 QMT 中,该函数用于获取指定股票的除权除息日与复权因子的映射字典。python<br>def handlebar(ContextInfo):<br> # 获取浦发银行的复权因子<br> factors = ContextInfo.get_divid_factors('600000.SH')<br> print(factors)<br>
### 2. 复权因子产生差异的核心原因
#### A. 差价复权 vs 等比复权(核心差异)
复权主要分为差价复权(绝对数复权)和等比复权(相对数复权):
- 差价复权:直接在历史价格上加减分红金额。优点是计算简单,缺点是如果历史分红较多,早期股价可能出现负数。
- 等比复权:假设分红按除权日的开盘价或前收盘价进行再投资,按比例调整历史价格。这种方式能保证收益率的连续性,是目前主流的回测复权方式。
QMT 平台在获取历史行情(如 get_history_data)时,提供了 front(前复权)、back(后复权)、front_ratio(等比前复权)、back_ratio(等比后复权)多种选择。如果直接对比 QMT 的普通复权因子与其他平台的等比复权因子,必然会出现差异。
#### B. 复权基准日的不同
- 前复权:以当前最新交易日为基准(因子为1),向历史回溯调整。随着新分红的产生,历史所有复权价格和因子都会发生变化。
- 后复权:以股票上市首日为基准(因子为1),向未来调整。历史复权价格一旦确定就不再改变。
不同平台在更新前复权因子时,基准日的切换时间点可能不同(例如除权除息日当天盘前更新 vs 盘后更新),导致同一天获取的因子存在差异。
#### C. 精度与数据源差异
除权除息涉及派息(每股派X元)、送股(每10股送X股)、转增(每10股转增X股)以及配股。不同数据源在处理配股(特别是配股未足额认购时)和分红尾数四舍五入时的精度不同,会导致复权因子在小数点后 4-6 位产生微小偏差。随着时间推移,这种乘数效应会被放大。
### 3. QMT 复权因子的计算公式原理
以 QMT 支持的等比复权为例,其单次除权除息的调整系数(dr)计算逻辑通常如下:
除权参考价 = (股权登记日收盘价 - 每股派息金额 + 配股价 × 每股配股数) / (1 + 每股送股数 + 每股转增数 + 每股配股数)
单次复权因子 = 股权登记日收盘价 / 除权参考价
累计复权因子 = 连乘历次单次复权因子
### 4. 开发者建议
1. 对齐复权方式:在跨平台对比数据时,务必确保双方使用的都是“等比前复权”或“等比后复权”。在 QMT 中,建议使用 dividend_type='front_ratio' 或 back_ratio 来获取更符合真实收益率的行情数据。
2. 避免直接使用绝对价格:在编写策略时,尽量使用收益率(涨跌幅)等相对指标,而不是依赖绝对的复权价格阈值,这样可以最大程度消除不同平台复权因子微小差异带来的影响。