问题描述
get_stock_exrights返回的数据中包含exer_forward_a、exer_backward_a等复权因子,这些数值有什么用?
解决方案
在 ptrade 量化交易平台中,get_stock_exrights 接口用于获取股票的历史除权除息信息。返回的数据中包含的 exer_forward_a、exer_forward_b、exer_backward_a 和 exer_backward_b 等字段,是用于手动计算股票复权价格的关键因子。
1. 复权因子的具体含义
股票在发生分红、送股、配股等除权除息事件后,其价格会出现跳空缺口。为了在量化回测和技术分析中保持价格序列的连续性,必须对历史价格进行复权处理。这些因子就是用来进行线性变换的系数:
exer_forward_a:前复权除权因子 A(乘数)。exer_forward_b:前复权除权因子 B(加数)。exer_backward_a:后复权除权因子 A(乘数)。exer_backward_b:后复权除权因子 B(加数)。
2. 复权价格的计算公式
利用这些因子,你可以通过简单的线性公式将真实价格(不复权价格)转换为复权价格:
-
前复权价格计算公式:
前复权价格 = exer_forward_a * 真实价格 + exer_forward_b -
后复权价格计算公式:
后复权价格 = exer_backward_a * 真实价格 + exer_backward_b
3. 为什么需要这些因子?
虽然 ptrade 的 get_history 和 get_price 接口已经提供了 fq='pre'(前复权)和 fq='post'(后复权)的选项来直接获取复权数据,但在某些高级场景下,你可能需要自己掌握复权逻辑:
- 自定义复权基准日:标准的复权通常以最新交易日(前复权)或上市首日(后复权)为基准。如果你需要以特定历史日期为基准进行动态复权,就需要利用这些因子自行推算。
- 处理逐笔/Tick数据:高频的 Tick 数据或逐笔成交数据通常是不复权的。如果你需要在盘中实时计算复权后的高频指标,就需要提取当天的复权因子对实时价格进行转换。
- 财务数据对齐:在计算某些基于价格的财务比率(如市盈率、市净率)时,确保价格和财务数据的股本基数一致。
4. 代码示例
以下是一个在 ptrade 中获取复权因子并演示计算逻辑的示例:
def initialize(context):
g.security = '600570.SS'
set_universe(g.security)
def handle_data(context, data):
# 获取股票的除权除息信息
exrights_df = get_stock_exrights(g.security)
if exrights_df is not None and not exrights_df.empty:
# 获取最近一次的除权除息记录
latest_exright = exrights_df.iloc[-1]
# 提取复权因子
fwd_a = latest_exright['exer_forward_a']
fwd_b = latest_exright['exer_forward_b']
bwd_a = latest_exright['exer_backward_a']
bwd_b = latest_exright['exer_backward_b']
# 获取当前真实价格
current_real_price = data[g.security]['close']
# 计算复权价格
calc_fwd_price = fwd_a * current_real_price + fwd_b
calc_bwd_price = bwd_a * current_real_price + bwd_b
log.info(f"真实价格: {current_real_price}")
log.info(f"计算出的前复权价格: {calc_fwd_price}")
log.info(f"计算出的后复权价格: {calc_bwd_price}")
总结:get_stock_exrights 返回的复权因子为量化开发者提供了底层的数据支持,使得在处理复杂的价格序列对齐和高频数据复权时拥有极大的灵活性。