🚀 AI 一键生成 joinquant 策略代码
立即体验

JoinQuant 期货夜盘交易日如何精确判断?使用 get_trade_day 函数解决夜盘归属难题

joinquant | 发布时间: 2026/7/25
以下内容由 EasyQuant 生成。

问题描述

请根据以下 SEO 主题生成完整页面内容:

Title: joinquant 期货夜盘处理:使用 get_trade_day 精确判断夜盘归属交易日

Question: joinquant 中如何判断夜盘时间(如21:00)属于哪一个真正的期货交易日?

解决方案

JoinQuant 期货夜盘交易日精准判断指南

在商品期货量化交易中,夜盘交易时段(如前一日 21:00 至次日 02:30)在交易所规则中统一划归为下一个交易日。如果在策略编写中直接使用 context.current_dt.date(),会获取到实际的自然日(Calendar Date),导致交易日逻辑错乱、历史数据提取偏差或回测结果异常。

JoinQuant 提供了专门的 API get_trade_day,能够根据传入的具体时刻和标的代码,精准返回其对应的真实期货交易日。


一、为什么不能直接使用 context.current_dt.date()?

以螺纹钢(RB)为例:

  • 自然时间:周一晚上 21:05
  • 交易所规则:属于周二的交易日
  • 若使用 context.current_dt.date():返回的是周一的日期,导致获取历史 K 线、计算因子或判断调仓日时逻辑出错。

因此,必须使用考虑了夜盘机制的专有函数来进行映射。


二、使用 get_trade_day 精确获取归属交易日

1. API 语法

get_trade_day(security, query_dt)
  • security: 标的代码或标的代码列表(如 'RB1901.XSGE'['RB1901.XSGE', '000001.XSHE'])。
  • query_dt: 指定的时间时刻,可以是字符串或 datetime.datetime 对象。
  • 返回值: 返回一个字典(dict),key 为标的代码,value 为 datetime.date 对象(若非交易日或未上市/退市则返回 None)。

2. 实际代码示例

from jqdata import *

# 查询夜盘 22:00 对应的交易日
res = get_trade_day(["RB1901.XSGE", "000001.XSHE"], query_dt="2019-01-04 22:00:00")
print(res)
# 输出结果:
# {
#   'RB1901.XSGE': datetime.date(2019, 1, 7),  # 螺纹钢夜盘自动归属到下一个交易日(周一)
#   '000001.XSHE': datetime.date(2019, 1, 4)   # A股无夜盘,仍为当天的日期
# }

三、在策略中的典型应用场景

场景:开盘前/夜盘启动时判断是否为新交易日首巴

在策略的 handle_datarun_daily 中,可通过 get_trade_day 快速校验当前运行的时间点属于哪个期货交易日:

from jqdata import *

def initialize(context):
    set_option('use_real_price', True)
    # 设定期货子账户
    set_subportfolios([SubPortfolioConfig(cash=1000000, type='futures')])
    g.security = 'RB2405.XSGE'
    # 参照期货标的运行
    run_daily(market_open, time='every_bar', reference_security=g.security)

def market_open(context):
    current_time = context.current_dt
    # 获取当前时刻对应的交易日
    trade_day_dict = get_trade_day(g.security, current_time)
    current_trade_day = trade_day_dict.get(g.security)
    
    # 打印当前自然时间与归属交易日
    # 例如:自然时间 2023-11-06 21:01:00 -> 归属交易日 2023-11-07
    log.info("当前自然时间: %s, 归属期货交易日: %s" % (current_time, current_trade_day))

四、期货交易日规则注意事项

  1. 夜盘起始点:对于有夜盘的品种,交易日以夜盘集合竞价开始时刻为起点,至次日日盘收盘(15:00)结束。
  2. 跨周末与节假日:周五晚上的夜盘(21:00 后)属于下周一的交易日;节假日前的最后一个夜盘属于节后首个交易日。
  3. 无夜盘品种/股票:无夜盘的品种以每日 00:00 划分为当天的交易日。