🚀 AI 一键生成 joinquant 策略代码

为什么 JoinQuant 的 get_all_trade_days() 会获取到未来的交易日?

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

问题描述

get_all_trade_days()获取日期超过当前时间

在策略环境和研究环境中,使用get_all_trade_days()函数会获取到2年后的交易日,这是为什么?举例:

all_trade_days = get_all_trade_days()
print(all_trade_days)
返回: array([2005-01-04, 2005-01-05, 2005-01-06, ..., 2025-03-11, 2025-03-12, 2025-03-13], dtype=object)

解决方案

为什么 get_all_trade_days() 会返回未来的交易日?

在 JoinQuant(聚宽)量化平台中,get_all_trade_days() 函数的设计初衷是获取平台数据库中存储的所有交易日历数据。为了满足部分策略(如期权定价、期货远期合约交割日计算等)对未来时间推算的需求,聚宽的底层数据库会预先生成未来几年(通常是1-2年)的默认交易日历(剔除常规周末,并根据已知节假日进行预估)。

因此,当您调用无参数的 get_all_trade_days() 时,它会直接返回这个完整的数组,其中自然包含了超过当前现实时间的未来日期。


如何只获取到当前(或回测当天)的交易日?

如果您只希望获取历史到当前时间的交易日,建议使用 get_trade_days() 函数,或者对 get_all_trade_days() 的结果进行切片过滤。

方法一:使用 get_trade_days()(推荐)

get_trade_days() 允许您指定 end_date。在回测或模拟交易中,您可以将其指定为 context.current_dt,这样就不会获取到未来的“未来数据”。

from jqdata import *

def handle_data(context, data):
    # 获取从 2005-01-04 到回测当前逻辑时间的所有交易日
    past_trade_days = get_trade_days(start_date='2005-01-04', end_date=context.current_dt.date())
    print(past_trade_days)

注:根据官方文档,get_trade_days 默认最多只能获取到截至现实时间的当前年份的最后一天的交易日数据。

方法二:对 get_all_trade_days() 进行时间过滤

如果您在研究环境中,可以通过 Python 的 datetime 模块对返回的 numpy 数组进行过滤:

import datetime
from jqdata import *

# 获取所有交易日(包含未来)
all_trade_days = get_all_trade_days()

# 获取今天的日期
today = datetime.date.today()

# 过滤出小于等于今天的交易日
past_trade_days = all_trade_days[all_trade_days <= today]
print(past_trade_days)

总结

get_all_trade_days() 返回未来日期是平台底层日历预生成的正常现象。在编写严谨的量化策略时,为了避免引入未来函数,请务必结合 context.current_dtdatetime.date.today() 对日期范围进行严格限制。