问题描述
解决方案
在聚宽(JoinQuant)平台以及中国期货市场的规则中,晚上 21:00 之后的夜盘交易数据属于下一个交易日。
具体规则如下:
- 交易日定义:对于有夜盘的品种,以夜盘集合竞价开始时(通常为前一自然日的 21:00)作为一个交易日的开始,至当天下午收盘(通常为 15:00)结束。
- 跨周末/节假日:如果是周五晚上的夜盘,或者节假日前最后一个工作日晚上的夜盘,其数据归属于假期结束后的第一个交易日。
使用 API 获取归属交易日
聚宽提供了专门的 API 函数 get_trade_day 来解决这个问题。你可以传入一个具体的时刻,系统会返回该时刻对应的实际交易日日期。
代码示例
# -*- coding: utf-8 -*-
from jqdata import *
import datetime
def initialize(context):
# 示例 1: 普通工作日晚上
# 2019年1月3日是周四,晚上22:00的交易属于1月4日(周五)
dt_normal = "2019-01-03 22:00:00"
trade_day_normal = get_trade_day("RB1905.XSGE", dt_normal)
print(f"自然时间: {dt_normal} -> 归属交易日: {trade_day_normal}")
# 示例 2: 周五晚上跨周末
# 2019年1月4日是周五,晚上22:00的交易属于1月7日(下周一)
dt_weekend = "2019-01-04 22:00:00"
trade_day_weekend = get_trade_day("RB1905.XSGE", dt_weekend)
print(f"自然时间: {dt_weekend} -> 归属交易日: {trade_day_weekend}")
# 示例 3: 凌晨时间
# 2019年1月5日是周六凌晨(周五夜盘的延续),属于1月7日(下周一)
dt_early_morning = "2019-01-05 01:00:00"
trade_day_morning = get_trade_day("RB1905.XSGE", dt_early_morning)
print(f"自然时间: {dt_early_morning} -> 归属交易日: {trade_day_morning}")
def handle_data(context, data):
pass
注意事项
- 自动对齐:在使用
get_price、get_bars或attribute_history等获取行情数据的 API 时,系统已经自动处理了这种时间偏移。例如,获取某日的日线数据时,该日线已经包含了前一天晚上的夜盘数据。 - 标的差异:
get_trade_day需要传入具体的标的代码(如RB1905.XSGE),因为不同品种可能有不同的交易时间安排(部分品种无夜盘)。 - 非交易时间:如果传入的时间点是非交易时间(例如中午休市或尚未开盘),该函数通常会返回上一个有效的交易日或根据具体逻辑处理,建议仅在涉及交易时段判断时使用。
Q&A
Q: 如果我在周五晚上 23:00 下单,订单会在什么时候成交?
A: 订单会立即进入交易所系统进行撮合(如果使用了支持夜盘的策略频率),该笔交易会被记录在下周一的交易日账单中。
Q: get_trade_day 可以用于股票吗?
A: 可以。对于 A 股股票,因为没有夜盘,交易日通常就是传入时刻所在的自然日期(如果是交易日的话)。如果传入非交易时间,逻辑会有所不同,通常返回最近的交易日。
Q: 为什么期货日线数据的 pre_close (前收盘价) 和前一天的 close 不一样?
A: 期货的 pre_close 通常指的是“前结算价”(Settlement Price),而不是前一天的收盘价。期货每日结算时会根据全天成交加权平均计算结算价,用于计算保证金和盈亏,次日涨跌幅限制也是基于前结算价计算的。