问题描述
新人入坑,感谢指导
如何理解set_option的 'use_real_price'
解决方案
在 JoinQuant (聚宽) 量化平台中,set_option('use_real_price', True) 是一个非常重要且官方强烈建议开启的设置项。它用于设置是否开启动态复权(真实价格)模式。
简单来说,它的核心作用是决定你的策略在回测和模拟交易时,是使用真实的未复权价格进行撮合交易,还是使用前复权价格进行撮合交易。
以下是详细的解析:
1. 开启真实价格模式 (True) 的含义与影响
当你在 initialize 函数中设置 set_option('use_real_price', True) 时:
- 真实价格撮合:回测和模拟交易过程中,每天看到的当天价格都是真实的(不复权的)。系统会使用真实的价格进行下单撮合,你在交易详情和持仓详情里看到的也都是真实价格。这完全符合真实的交易场景。
- API 获取数据依然便捷:为了让编写代码简单,通过
history、attribute_history、get_price等数据获取 API 拿到的,依然是基于当天日期的前复权价格。这样你在计算均线、技术指标时不需要自己手动处理复权跳空缺口。 - 自动处理分红送股:每到新的一天,如果持仓中有股票发生了送股或者分红,对应的股数或现金会自动在你的账户(
context.portfolio)中体现,完美模拟真实账户的除权除息。 - 避免未来函数:这是最重要的一点。使用真实价格撮合,回测到历史某一天,就使用那一天的真实价格;如果需要复权数据,使用的是那一天的复权因子对之前的价格进行前复权。全程不使用未来的数据,有效避免了“未来函数”。
2. 关闭真实价格模式 (False) 的弊端
如果不开启(默认是 False,主要是为了兼容早期旧策略):
- 违背真实场景:系统会选定一个日期(通常是建立回测的日期)作为基准,回测过程中所有的价格都是基于此日期的前复权价格。这意味着你可能会用一个历史上根本不存在的“前复权价格”(比如几毛钱甚至负数)去下单,这严重违背了真实的交易规则(例如A股买入必须是100的整数倍,价格不同能买入的数量完全不同)。
- 回测结果不一致:不同的日期建立的回测跑出来的结果可能会有差异,因为这两次回测之间如果股票发生了拆合或者分红,会导致回测中看到的前复权价格不一致。
3. 官方建议与代码示例
官方强烈建议您开启动态复权(真实价格)模式,进行模拟与回测!
开启方式:
只需在策略的 initialize 初始化函数中加入一行代码即可:
def initialize(context):
# 开启真实价格(动态复权)模式
set_option('use_real_price', True)
# 其他初始化代码...
g.security = '000001.XSHE'
4. 新手避坑注意事项
- 不要跨日期缓存 API 数据:因为开启后,你在不同日期调用
history等 API 返回的前复权价格可能是不一样的(因为基准日变了)。所以,不要把今天获取的历史数据存到全局变量里留到明天去用,每天需要数据时重新获取即可。 - 获取昨日真实价格:如果你确实想通过
history拿到昨天的真实价格,需要用取得的前复权价格除以复权因子(factor)。
总结:作为新人,写策略的第一步,请务必在 initialize 中写上 set_option('use_real_price', True),这能让你的回测结果更贴近实盘,少走很多弯路。