🚀 AI 一键生成 joinquant 策略代码

JoinQuant API 技巧:如何获取上一个交易日的日期?

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

问题描述

如何在策略中直接获取上一个交易日的日期?

解决方案

在 JoinQuant 聚宽策略中,获取上一个交易日日期最直接且推荐的方法是使用 context 对象中的 previous_date 属性。

核心方法:context.previous_date

  • 含义:前一个交易日的日期。
  • 类型datetime.date 对象。
  • 适用范围:回测和模拟交易中的 handle_databefore_trading_startrun_daily 等接收 context 参数的函数中。

代码示例

以下是一个完整的策略示例,展示了如何在每日开盘前打印出上一个交易日的日期:

# -*- coding: utf-8 -*-
from jqdata import *

def initialize(context):
    # 设定基准
    set_benchmark('000300.XSHG')
    # 开启动态复权模式(真实价格)
    set_option('use_real_price', True)
    
    # 每天开盘前运行
    run_daily(before_market_open, time='09:00')

def before_market_open(context):
    # --- 方法1:直接获取(推荐)---
    # 获取上一个交易日,返回的是 datetime.date 对象
    prev_date = context.previous_date
    
    # 打印结果
    log.info("当前时间: %s" % context.current_dt)
    log.info("上一个交易日(对象): %s" % prev_date)
    log.info("上一个交易日(字符串): %s" % str(prev_date))
    
    # --- 方法2:通过 get_trade_days 计算(备用)---
    # 如果需要获取更久之前的交易日,可以使用 get_trade_days
    # 获取截止到当前日期的最后2个交易日
    trade_days = get_trade_days(end_date=context.current_dt.date(), count=2)
    if len(trade_days) >= 2:
        calc_prev_date = trade_days[-2] # 倒数第二个即为上一个交易日
        log.info("计算所得上个交易日: %s" % calc_prev_date)

def handle_data(context, data):
    pass

补充说明

  1. 数据类型转换context.previous_date 返回的是 datetime.date 对象(例如 2023-10-27)。如果你需要将其用于某些要求字符串格式的 API(如查询数据库),请使用 str(context.previous_date) 进行转换。
  2. current_dt 的区别context.current_dt 是策略当前的逻辑时间(包含时分秒),而 context.previous_date 仅包含日期,且严格指向上一个有效的交易日(会自动跳过周末和节假日)。

Q&A

Q: context.previous_dateinitialize 函数中可以使用吗?
A: 不建议在 initialize 中使用。initialize 是策略初始化阶段,此时回测尚未正式开始推进时间轴,context 中的时间属性可能尚未完全建立或不具备业务意义。请在 before_trading_starthandle_data 等运行时函数中使用。

Q: 如果我想获取上上个交易日(前天)怎么办?
A: context 对象只直接提供了 previous_date。如果需要获取更早的交易日(如前天、5天前),需要使用 get_trade_days 函数。例如:get_trade_days(end_date=context.previous_date, count=2)[0]

Q: context.previous_date 会包含停牌的日期吗?
A: 不会。它是指大盘(交易所)的交易日。只要交易所开市,即为一个交易日,与具体某只股票是否停牌无关。