问题描述
我发现回测中,系统自动记录的买卖价格是除权价格,而用get_price函数获得的价格由于使用了'pre'参数,是前复权的价格。我想问一下,如何将系统自动记录的除权价格折算成前复权价格,以保持一致,方便作比较?谢谢
解决方案
在 JoinQuant (聚宽) 平台中,当您在 initialize 函数中开启了动态复权模式(即 set_option('use_real_price', True))后,系统在撮合交易和记录持仓时使用的都是真实价格(除权价格)。而为了方便策略编写,get_price、history 等数据获取 API 默认返回的是基于当前日期的前复权价格。
为了将系统记录的真实价格折算成前复权价格进行比较,您可以使用 API 提供的复权因子(factor)。
转换公式
根据 JoinQuant API 文档的说明,API 返回的价格是前复权后的价格,利用 factor 可以算出原始价格(真实价格),公式为:
真实价格 = 前复权价格 / factor
因此,如果您已知真实价格,想要折算为前复权价格,公式为:
前复权价格 = 真实价格 * factor
代码实现方法
您可以在获取价格数据时,同时获取 factor 字段,然后进行乘法运算。以下是具体的代码示例:
def handle_data(context, data):
security = '000001.XSHE'
# 假设这是系统记录的真实买入价格(例如从 context.portfolio.positions 中获取的 avg_cost)
# 这里为了演示,我们假设一个真实价格
real_price = 10.50
# 使用 attribute_history 获取前复权价格和复权因子
# 注意:获取当天的 factor 可以用 get_current_data() 或者获取最近的 history
df = attribute_history(security, 1, '1d', fields=['close', 'factor'])
if not df.empty:
current_factor = df['factor'][-1]
# 将真实价格转换为前复权价格
pre_fq_price = real_price * current_factor
log.info("真实价格: %.2f, 复权因子: %.4f, 折算的前复权价格: %.2f" % (real_price, current_factor, pre_fq_price))
# 这样您就可以将 pre_fq_price 与 get_price 获取的 'pre' 价格进行一致性比较了
注意事项
- 复权因子的时效性:复权因子是会随着分红、送股等除权除息事件发生变化的。在回测的某一天获取的
factor,是将历史真实价格转换为站在那一天视角下的前复权价格的因子。 - 不要跨日期缓存:正如官方文档强烈建议的,由于前复权价格和复权因子在发生除权除息后会变动,不要跨日期缓存这些 API 返回的结果。每次需要比较时,请获取当天的
factor进行实时折算。