问题描述
price = context.portfolio.positions[code].price
一、请问这个函数在开盘前竞价时段运行,会取到最新的竞价吗?还是只能取到昨天的开盘价?
或者取到当天的开盘价?如果取到当天的开盘价就是未来函数了。
二、请问在模拟和回测时,这个函数会自动调整成回测时数据bar当天的日期吗?
谢谢!!!
解决方案
您好!关于 context.portfolio.positions[code].price 的获取机制,以下是详细的解答:
一、在开盘前竞价时段运行,取到的是什么价格?
context.portfolio.positions[code].price 代表的是该持仓标的的最新行情价格。
-
在开盘前(如
before_trading_start,通常在 9:00 运行):
此时当天的交易尚未开始,也没有产生当天的开盘价,因此该属性获取到的是昨天的收盘价。它不会取到当天的开盘价,所以不存在未来函数的问题。 -
如何获取集合竞价数据?
如果您想获取 9:25 集合竞价产生的数据,可以使用专门的 API:get_call_auction()。该函数可以获取指定时间区间内交易日 09:25 的集合竞价数据(当日的集合竞价数据最晚于 9:28 分返回)。 -
如何获取当天的开盘价?
如果您在 9:30 开盘后(如handle_data或run_daily设定的盘中时间)运行,可以通过get_current_data()[code].day_open获取当天的开盘价。注意,当天的开盘价至少在 09:27 分之后才可获取。
二、在模拟和回测时,时间会自动调整吗?
是的,会自动调整。
在 JoinQuant 的回测和模拟交易引擎中,context 对象是与当前的逻辑时间(即 context.current_dt)严格绑定的。
- 回测时:引擎会根据您设定的回测频率(按天或按分钟),逐个 Bar 推进时间。当代码运行到某一个特定的 Bar 时,
context.portfolio.positions[code].price获取的就是那个特定时间点(逻辑时间)的最新价格。引擎在底层已经处理好了时间对齐,绝不会让您在历史回测中取到未来的价格。 - 模拟交易时:逻辑时间与真实时间基本同步,获取的也是当前真实时间点能获取到的最新价格。
总结:
- 开盘前调用
price得到的是昨日收盘价。 - 回测和模拟中,
context里的数据会自动与当前运行的逻辑时间对齐,无需手动调整日期,也不会产生未来函数。