🚀 AI 一键生成 joinquant 策略代码

JoinQuant 期货策略必备:如何用 get_trade_day 解决夜盘交易日归属问题?

joinquant | 发布时间: 2025/12/10
以下内容由 EasyQuant 生成。

问题描述

在处理有夜盘的期货数据时,如何确定晚上9点后的数据属于哪个交易日?

解决方案

在聚宽(JoinQuant)平台以及中国期货市场的规则中,晚上 21:00 之后的夜盘交易数据属于下一个交易日

具体规则如下:

  1. 交易日定义:对于有夜盘的品种,以夜盘集合竞价开始时(通常为前一自然日的 21:00)作为一个交易日的开始,至当天下午收盘(通常为 15:00)结束。
  2. 跨周末/节假日:如果是周五晚上的夜盘,或者节假日前最后一个工作日晚上的夜盘,其数据归属于假期结束后的第一个交易日。

使用 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

注意事项

  1. 自动对齐:在使用 get_priceget_barsattribute_history 等获取行情数据的 API 时,系统已经自动处理了这种时间偏移。例如,获取某日的日线数据时,该日线已经包含了前一天晚上的夜盘数据。
  2. 标的差异get_trade_day 需要传入具体的标的代码(如 RB1905.XSGE),因为不同品种可能有不同的交易时间安排(部分品种无夜盘)。
  3. 非交易时间:如果传入的时间点是非交易时间(例如中午休市或尚未开盘),该函数通常会返回上一个有效的交易日或根据具体逻辑处理,建议仅在涉及交易时段判断时使用。

Q&A

Q: 如果我在周五晚上 23:00 下单,订单会在什么时候成交?
A: 订单会立即进入交易所系统进行撮合(如果使用了支持夜盘的策略频率),该笔交易会被记录在下周一的交易日账单中。

Q: get_trade_day 可以用于股票吗?
A: 可以。对于 A 股股票,因为没有夜盘,交易日通常就是传入时刻所在的自然日期(如果是交易日的话)。如果传入非交易时间,逻辑会有所不同,通常返回最近的交易日。

Q: 为什么期货日线数据的 pre_close (前收盘价) 和前一天的 close 不一样?
A: 期货的 pre_close 通常指的是“前结算价”(Settlement Price),而不是前一天的收盘价。期货每日结算时会根据全天成交加权平均计算结算价,用于计算保证金和盈亏,次日涨跌幅限制也是基于前结算价计算的。