问题描述
解决方案
在PTrade量化交易平台中,获取交易日历相关数据主要依赖于 get_trading_day 和 get_trade_days 这两个API接口。
以下是具体的实现方法和代码示例。
1. 获取上一个交易日
使用 get_trading_day(day) 函数。
- 参数:
day(int)。0表示当前交易日。-1表示前一个交易日。1表示后一个交易日。
- 返回值:
datetime.date对象。
2. 获取某个月份所有的交易日
使用 get_trade_days(start_date, end_date) 函数。
- 参数:
start_date(str): 该月份的起始日期(如 '2023-10-01')。end_date(str): 该月份的结束日期(如 '2023-10-31')。
- 返回值:包含指定范围内所有交易日的
numpy.ndarray数组。
策略代码示例
以下代码展示了如何在 initialize 或 handle_data 中实现这两个需求。
def initialize(context):
# 初始化
g.security = '600570.SS'
set_universe(g.security)
# --- 示例1:获取上一个交易日 ---
# 注意:在回测模式下,get_trading_day(0) 返回的是回测当天的日期
# get_trading_day(-1) 返回的是回测当天的前一个交易日
prev_trading_day = get_trading_day(-1)
log.info("上一个交易日是: %s" % prev_trading_day)
# --- 示例2:获取某个月份(例如2023年10月)的所有交易日 ---
target_month_start = '2023-10-01'
target_month_end = '2023-10-31'
# 获取指定范围内的交易日列表
month_trade_days = get_trade_days(start_date=target_month_start, end_date=target_month_end)
log.info("2023年10月的所有交易日如下:")
for day in month_trade_days:
# month_trade_days 中的元素通常是 numpy.datetime64 或 str 类型,具体取决于版本
# 这里直接打印即可
log.info(str(day))
def handle_data(context, data):
# 在盘中运行时,也可以动态获取
# 获取当前回测日期的上一个交易日
last_day = get_trading_day(-1)
# log.info("当前回测日期的上一交易日: %s" % last_day)
pass
注意事项
- 日期格式:
get_trade_days的入参建议使用'YYYY-MM-DD'或'YYYYMMDD'格式的字符串。 - 非交易日调用:如果在非交易日(例如周末或节假日)调用
get_trading_day(0),系统通常会返回下一交易日的日期。 - 数据类型:
get_trading_day返回的是datetime.date对象,而get_trade_days返回的是numpy数组,如果需要进行日期计算,可能需要进行类型转换。
Q&A
Q: get_trading_day(-1) 在周一调用时,返回的是周日还是上周五?
A: 返回的是上周五(假设上周五是正常交易日)。该函数只返回交易所开市的日期,会自动跳过周末和法定节假日。
Q: 如果我想获取未来5天的交易日怎么办?
A: 可以使用 get_trade_days(start_date=今天, count=5)。get_trade_days 支持 count 参数,表示从 start_date 开始往后获取指定数量的交易日。
Q: get_trade_days 返回的数据可以直接用于 get_price 吗?
A: 可以。get_trade_days 返回的日期格式通常可以直接作为 get_price 或 get_history 等函数的日期参数使用,但建议先将其转换为字符串格式以确保兼容性。