问题描述
请教:有限位模拟时, 9:25后, 以开盘价委托,模拟交易委托价格正常。 但用current_data[stock].last_price取最新价, 与实际不符?请问这个是后复权价么?要取不复权最新价如何取?
解决方案
您好!在 JoinQuant 聚宽平台中遇到 current_data[stock].last_price 价格与实际不符的情况,主要原因与获取时间以及复权设置有关。以下是详细的解答和处理方法:
1. 为什么 9:25 后 last_price 与实际不符?
根据聚宽 API 文档规定,通过 get_current_data() 获取的 last_price 属性:
- 在 09:30 之前获取,返回的是昨日收盘价。
因此,您在 9:25 之后(集合竞价期间)调用last_price,拿到的并不是当天的最新撮合价,而是昨天的收盘价,所以会感觉与实际不符。
2. 这个价格是后复权价吗?
默认情况下,聚宽平台提供的数据是前复权价格(或者在未开启真实价格的模拟盘中,是基于模拟交易创建日期的调整价格),不是后复权价。
3. 如何获取当天的开盘价?
如果您想在开盘前获取当天的集合竞价开盘价,应该使用 day_open 属性,而不是 last_price。
- 获取方法:
current_data[stock].day_open - 注意:当天的开盘价至少需要在 09:27 分之后才可获取到。
4. 如何获取不复权的真实最新价?
为了在模拟交易和回测中获取真实的、不复权的价格,强烈建议您在初始化函数中开启动态复权(真实价格)模式。开启后,您通过订单详情和持仓看到的都是真实价格。
设置方法:
在 initialize(context) 函数中添加以下代码:
set_option('use_real_price', True)
综合代码示例
def initialize(context):
# 1. 开启真实价格模式,确保交易和获取的现价是不复权的真实价格
set_option('use_real_price', True)
# 设定在 9:30 运行(模拟盘实际会在 9:27~9:30 之间运行)
run_daily(market_open, time='09:30')
def market_open(context):
stock = '000001.XSHE'
current_data = get_current_data()
# 2. 获取当天的开盘价(9:27之后有效)
today_open = current_data[stock].day_open
# 3. 获取最新价(9:30之前是昨收,9:30之后是最新价)
last_price = current_data[stock].last_price
log.info(f"股票 {stock} 当天开盘价: {today_open}, 最新价/昨收价: {last_price}")
总结:
- 9:30 前要取开盘价,请在 9:27 后使用
current_data[stock].day_open。 - 要确保价格为不复权的真实价格,请务必在
initialize中调用set_option('use_real_price', True)。