问题描述
attribute_history,get_price 获取的日线价格,当天的数据何时更新呢? 是当晚12点更新么?模拟交易中会使用这些函数
解决方案
在 JoinQuant(聚宽)量化平台上,关于 attribute_history 和 get_price 获取日线(1d)数据的更新时间以及使用机制,有以下几个关键点需要注意:
1. 日线数据的系统更新时间
根据聚宽官方文档,当日的回测/模拟交易日线数据会在收盘后通过多数据源进行校验,并在 T+1(第二天)的 00:01 更新。也就是说,当天的完整日线数据要在当晚 12 点过后的 00:01 才会正式入库并可作为历史日线数据被调用。
2. attribute_history 和 get_price 的调用机制
在模拟交易或回测中,为了严格避免“未来函数”(即提前使用未发生的数据),这两个函数在获取日线('1d')数据时有特殊的设定:
- 不包含当天数据:当您使用
attribute_history或get_price(且未指定包含当天的特定参数)获取天级别('1d')数据时,返回的数据是不包括当天的,即使您是在 15:00 收盘后(如after_trading_end函数中)调用也是如此。 - 获取的是历史切片:它们获取的是截至前一个交易日的历史数据。
3. 模拟交易中如何获取当天的数据?
如果您在模拟交易的盘中(或收盘后)需要获取当天的最新价格或行情,不能依赖获取日线历史数据的 API,而应该使用以下替代方案:
方案 A:使用 get_current_data() 获取最新快照
如果您只需要当天的最新价、开盘价、涨跌停价等,推荐使用 get_current_data()。这个函数专门用于获取当前单位时间的实时数据。
def handle_data(context, data):
current_data = get_current_data()
# 获取最新价(盘中为最新成交价,09:30前为昨日收盘价)
last_price = current_data['000001.XSHE'].last_price
# 获取当天开盘价
day_open = current_data['000001.XSHE'].day_open
方案 B:获取分钟级('1m')数据
如果您需要当天盘中的 K 线序列(如当天的最高价、最低价轨迹),可以通过 get_price 或 attribute_history 获取分钟级别的数据,分钟数据是不包含当前这一分钟的,但包含了当天已经走完的分钟数据。
# 获取当天开盘到当前时间的分钟数据
df = get_price('000001.XSHE', end_date=context.current_dt, frequency='1m', count=240)
方案 C:使用 get_bars 函数
get_bars 函数支持 include_now 参数。如果您确实需要包含当前时刻所在 bar 的数据,可以使用 get_bars。
# 获取包含当天的日线数据(盘中调用时,当天的收盘价为最新价)
bars = get_bars('000001.XSHE', count=5, unit='1d', fields=['open', 'close'], include_now=True)
总结
- 正式日线数据更新:第二天 00:01。
attribute_history/get_price取 '1d':默认不包含当天数据。- 模拟交易实战建议:盘中获取最新价格用
get_current_data(),获取当天已发生的 K 线用分钟级数据或get_bars(include_now=True)。