🚀 AI 一键生成 ptrade 策略代码

PTrade 日期函数怎么选?三大日期 API 的应用场景与最佳实践

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

问题描述

我想获取上一个交易日、过去一个月的交易日列表,或者某个特定日期之前的所有交易日,应该分别用哪个函数比较方便?

解决方案

在 PTrade 中,针对你提出的三个不同场景,分别有对应的 API 函数可以最方便地实现需求。

以下是具体的函数推荐及使用说明:

1. 获取上一个交易日

推荐函数: get_trading_day(day)

  • 说明:该函数用于获取相对于当前日期的偏移交易日。
  • 参数day 为整数。0 表示当天,-1 表示前一个交易日,1 表示后一个交易日。
  • 用法:传入 -1 即可获取上一个交易日。

2. 获取过去一个月的交易日列表

推荐函数: get_trade_days(start_date=None, end_date=None, count=None)

  • 说明:该函数用于获取指定范围内的交易日列表。
  • 用法
    • 方法 A(按数量,最方便):如果你认为“一个月”大约是 20-22 个交易日,可以直接使用 count 参数。例如 get_trade_days(count=22) 会返回截止到当前日期的过去 22 个交易日。
    • 方法 B(按日期范围,最准确):如果你需要严格的日历月(例如 3月5日 到 4月5日),则需要先计算出起始日期,然后传入 start_dateend_date

3. 获取某个特定日期之前的所有交易日

推荐函数: get_all_trades_days(date=None)

  • 说明:该函数用于获取指定日期之前(含该日期)的所有历史交易日列表。
  • 参数date 为指定的截止日期(如 '20230101')。如果不传,默认截止到当前回测或交易日期。
  • 用法:直接传入目标日期即可。

代码示例

以下是一个完整的策略代码示例,展示了如何在 initialize 中调用这三个函数并打印结果:

def initialize(context):
    # 1. 获取上一个交易日
    # 返回的是 datetime.date 对象
    prev_day = get_trading_day(-1)
    log.info("上一个交易日: %s" % prev_day)

    # 2. 获取过去一个月的交易日列表 (方式一:按大概交易日数)
    # 假设一个月约有 22 个交易日,返回的是 numpy.ndarray
    last_month_days_by_count = get_trade_days(count=22)
    log.info("过去22个交易日列表: %s" % last_month_days_by_count)
    
    # 2. 获取过去一个月的交易日列表 (方式二:指定日期范围)
    # 获取指定范围内的交易日
    specific_range_days = get_trade_days(start_date='20230101', end_date='20230201')
    log.info("2023年1月全月交易日: %s" % specific_range_days)

    # 3. 获取特定日期之前的所有交易日
    # 获取 2022年1月1日 之前的所有交易日
    all_days_before_2022 = get_all_trades_days(date='20220101')
    # 打印最后5个以验证
    log.info("2022年1月1日之前的最后5个交易日: %s" % all_days_before_2022[-5:])

def handle_data(context, data):
    pass

Q&A

Q: get_trade_daysget_all_trades_days 返回的数据类型是什么?
A: 这两个函数返回的都是 numpy.ndarray 类型的数组,里面包含的是字符串格式或日期格式的交易日数据(通常在打印时显示为字符串形式)。

Q: 如果我在非交易日调用 get_trading_day(0) 会返回什么?
A: 如果当前日期是非交易日,get_trading_day(0) 通常会返回下一交易日的日期。建议在策略中使用 is_trade() 或检查当前日期是否在交易日列表中来避免逻辑错误。

Q: get_trade_dayscount 参数包含当天吗?
A: 是的,count 表示获取 end_date(默认为当前日期)往前的 count 个交易日,包含 end_date 当天(如果当天是交易日)。

Q: 如何判断今天是交易日还是节假日?
A: 可以使用 get_trading_day(0) 获取当前系统认为的交易日,或者判断当前日期是否存在于 get_all_trades_days() 返回的列表中。在回测和交易中,handle_data 函数本身只会在交易日触发。