问题描述
解决方案
在 PTrade 策略中,获取上一个交易日的日期主要使用 get_trading_day 函数。
核心方法
使用 get_trading_day(-1) 即可获取相对于当前策略时间的上一个交易日。
- 函数名:
get_trading_day(day) - 参数:
day(int)。0表示当前交易日,-1表示前一个交易日,1表示后一个交易日。 - 返回值:
datetime.date对象。
代码示例
以下是一个完整的策略示例,展示了如何在 handle_data 中获取上一个交易日,并将其转换为字符串格式(如 'YYYYMMDD')。
def initialize(context):
# 初始化设置,这里设置一只股票作为示例
g.security = '600570.SS'
set_universe(g.security)
def handle_data(context, data):
# 1. 获取上一个交易日的 datetime.date 对象
# 参数 -1 代表向前推 1 个交易日
prev_date_obj = get_trading_day(-1)
# 打印原始对象
log.info("上一个交易日对象: %s" % prev_date_obj)
# 2. 如果需要字符串格式(例如用于 get_price 或 get_fundamentals 等接口)
# 转换为 'YYYYMMDD' 格式
prev_date_str_1 = prev_date_obj.strftime('%Y%m%d')
log.info("上一个交易日 (YYYYMMDD): %s" % prev_date_str_1)
# 转换为 'YYYY-MM-DD' 格式
prev_date_str_2 = prev_date_obj.strftime('%Y-%m-%d')
log.info("上一个交易日 (YYYY-MM-DD): %s" % prev_date_str_2)
# 3. 示例:使用上一个交易日获取历史收盘价
# 注意:get_price 的 end_date 如果是回测模式,通常需要小于等于当前回测日期
# 这里仅作演示获取上一日数据的逻辑
price = get_price(g.security, start_date=prev_date_str_1, end_date=prev_date_str_1, frequency='1d', fields=['close'])
log.info("上一个交易日收盘价: \n%s" % price)
注意事项
- 自动跳过非交易日:
get_trading_day会自动处理周末和节假日。例如,如果今天是周一,get_trading_day(-1)返回的是上周五的日期。 - 返回值类型:该函数返回的是
datetime.date对象,而不是字符串。如果调用的其他 API(如get_fundamentals或get_price)需要字符串格式的日期,请使用.strftime('%Y%m%d')进行转换。 - 回测与实盘:
- 在回测中,"当前时间"是指策略运行到的回测时间点。
- 在实盘/交易中,"当前时间"是指系统的实际日期。
Q&A
Q: get_trading_day(0) 返回的是什么?
A: 返回的是当前交易日的日期对象。如果当前是回测,则为回测当天的日期;如果是实盘且为非交易日,则可能返回下一交易日(具体视券商环境配置而定,通常建议在交易时段调用)。
Q: 如何获取未来第 3 个交易日的日期?
A: 使用 get_trading_day(3)。正整数参数表示向后推算的交易日天数。
Q: 这个函数需要导入 datetime 库吗?
A: 不需要为了调用 get_trading_day 而导入库,它是 PTrade 的内置 API。但如果你需要对返回的日期对象进行复杂的加减操作(非交易日维度的),可能需要 Python 标准库 datetime 的支持。对于简单的格式化输出,直接使用对象自带的 strftime 方法即可。