问题描述
解决方案
在 JoinQuant 聚宽平台中,获取从今天(或指定日期)往前数特定数量的交易日列表,主要使用 get_trade_days 函数。
以下是具体的实现方法和代码示例。
获取最近10个交易日日期列表
使用 get_trade_days 函数,通过设置 count 参数为 10,并指定 end_date 为当前日期,即可获取包括当前日期在内的前 10 个交易日。
1. 在研究环境(Research)中使用
在研究环境中,默认的结束日期是系统当天的日期。
from jqdata import *
import datetime
# 获取截止到今天的前10个交易日(包含今天)
# 如果今天不是交易日,则从最近的一个交易日往前推
dates = get_trade_days(count=10)
print(dates)
2. 在回测或模拟交易(Strategy)中使用
在策略代码中,“今天”指的是回测运行到的当前逻辑时间(context.current_dt)。
def handle_data(context, data):
# 获取截止到回测当前时间的前10个交易日
# end_date 必须指定为 context.current_dt 或 context.previous_date
dates = get_trade_days(end_date=context.current_dt, count=10)
# 打印结果
log.info(dates)
# 示例:获取列表中的第一个日期(10天前)和最后一个日期(今天)
first_date = dates[0]
last_date = dates[-1]
函数说明
- 函数名:
get_trade_days(start_date=None, end_date=None, count=None) - 参数:
end_date: 结束日期。在回测中通常传入context.current_dt。如果不传,默认为datetime.date.today()。count: 数量。表示取end_date往前的count个交易日,包含end_date当天(如果当天是交易日)。- 注意:
start_date和count不能同时使用。
- 返回值: 一个包含
datetime.date对象的numpy.ndarray或列表。
Q&A
Q: get_trade_days 返回的数据类型是什么?
A: 返回的是一个包含 datetime.date 对象的数组(numpy array)。如果需要字符串格式,需要自行转换(例如使用 strftime)。
Q: 如果 end_date 当天是周六或周日,返回的列表包含当天吗?
A: 不包含。get_trade_days 只返回交易日。如果 end_date 是非交易日,它会从该日期之前的最近一个交易日开始往前数。
Q: 如何获取两个具体日期之间的所有交易日?
A: 不使用 count 参数,而是同时指定 start_date 和 end_date。例如:get_trade_days(start_date='2023-01-01', end_date='2023-01-31')。
Q: 如何判断今天是否是交易日?
A: 可以使用 get_trade_days(start_date=date, end_date=date),如果返回的列表非空,则该日期为交易日;或者直接检查该日期是否在 get_all_trade_days() 返回的列表中。