问题描述
解决方案
在 JoinQuant 聚宽平台中,要设置回测模式以使用真实的交易价格(即动态复权模式),需要在策略初始化函数 initialize 中调用 set_option 函数。
设置方法
在 initialize(context) 函数中添加以下代码:
def initialize(context):
# 开启动态复权模式(真实价格)
set_option('use_real_price', True)
# 其他初始化代码...
set_benchmark('000300.XSHG')
详细说明
1. 为什么要开启 use_real_price (True)?
- 避免未来函数:默认模式(False)通常使用基于回测开始日期或当前日期的前复权数据。这意味着在历史时刻使用了未来的复权因子(例如,2015年的回测使用了2023年的复权因子),这是一种未来函数,会导致回测结果失真。
- 模拟真实交易:开启后,回测引擎在撮合订单时,会使用该股票在历史当天的真实挂牌价格。这保证了买入股数、成交金额与当时市场的实际情况一致(例如,不会出现因为复权导致股价变成几千元或几分钱,从而导致买入数量计算错误的情况)。
- 自动处理分红送转:开启该选项后,当持仓股票发生拆分、合并或分红时,系统会根据复权因子自动调整账户中的持仓数量和现金(即自动到账分红和送股),这与实盘逻辑一致。
2. 对数据获取 API 的影响
开启 set_option('use_real_price', True) 后,对策略中获取数据的 API(如 history, attribute_history, get_price 等)有以下影响:
- 数据也是动态复权的:这些 API 返回的数据是基于回测当前日期的前复权价格。
- 例如:回测运行到 2015-06-01,调用
history获取过去5天数据,系统会返回以 2015-06-01 为基准的前复权数据。这模拟了你在 2015-06-01 当天打开行情软件看到的K线图。
- 例如:回测运行到 2015-06-01,调用
- 不要跨日缓存数据:由于每天的复权基准可能因为除权除息而变化,不同日期调用 API 返回的历史价格可能不同。因此,不要将 API 返回的数据保存到全局变量(如
g.data)中跨日使用,而应该在每一天需要时重新获取。
总结:强烈建议在所有策略(尤其是涉及长时间跨度的回测)中开启此选项,以确保回测的严谨性和真实性。