问题描述
解决方案
在 JoinQuant 聚宽策略中,获取上一个交易日日期最直接且推荐的方法是使用 context 对象中的 previous_date 属性。
核心方法:context.previous_date
- 含义:前一个交易日的日期。
- 类型:
datetime.date对象。 - 适用范围:回测和模拟交易中的
handle_data、before_trading_start、run_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
补充说明
- 数据类型转换:
context.previous_date返回的是datetime.date对象(例如2023-10-27)。如果你需要将其用于某些要求字符串格式的 API(如查询数据库),请使用str(context.previous_date)进行转换。 - 与
current_dt的区别:context.current_dt是策略当前的逻辑时间(包含时分秒),而context.previous_date仅包含日期,且严格指向上一个有效的交易日(会自动跳过周末和节假日)。
Q&A
Q: context.previous_date 在 initialize 函数中可以使用吗?
A: 不建议在 initialize 中使用。initialize 是策略初始化阶段,此时回测尚未正式开始推进时间轴,context 中的时间属性可能尚未完全建立或不具备业务意义。请在 before_trading_start 或 handle_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: 不会。它是指大盘(交易所)的交易日。只要交易所开市,即为一个交易日,与具体某只股票是否停牌无关。