🚀 AI 一键生成 ptrade 策略代码

PTrade 编程基础:使用 Context 对象获取上一交易日 (previous_date)

ptrade | 发布时间: 2025/12/24
以下内容由 EasyQuant 生成。

问题描述

如何在策略中获取上一个交易日的日期?

解决方案

在 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)

注意事项

  1. 自动跳过非交易日get_trading_day 会自动处理周末和节假日。例如,如果今天是周一,get_trading_day(-1) 返回的是上周五的日期。
  2. 返回值类型:该函数返回的是 datetime.date 对象,而不是字符串。如果调用的其他 API(如 get_fundamentalsget_price)需要字符串格式的日期,请使用 .strftime('%Y%m%d') 进行转换。
  3. 回测与实盘
    • 回测中,"当前时间"是指策略运行到的回测时间点。
    • 实盘/交易中,"当前时间"是指系统的实际日期。

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 方法即可。