🚀 AI 一键生成 ptrade 策略代码

ptrade周末测试不打印日志的解决方法与调试技巧

ptrade | 发布时间: 2026/5/21
以下内容由 EasyQuant 生成。

问题描述

如何解决量化周末测试不打印日志的问题

在周末使用ptrade进行测试,但是不打印日志,这个时候要怎么进行测试呢?

解决方案

在周末或节假日使用 ptrade 进行策略测试时,经常会遇到不打印日志的情况。这主要是因为 ptrade 的事件驱动机制在非交易日的行为与交易日不同。以下是导致该问题的原因及相应的测试与调试方法:

为什么周末测试不打印日志?

  1. handle_data 不执行:根据 ptrade 的底层逻辑,handle_data 函数不会在非交易日触发。因此,如果你把打印日志的代码写在 handle_data 中,周末运行时是不会有任何输出的。
  2. 节假日参数配置:在交易模块中,before_trading_start 函数的执行受配置参数影响。如果设置了 holiday_not_do_before="1",则节假日也不会执行盘前函数。

周末如何进行策略测试和调试?

要在周末进行代码逻辑的测试和日志打印,可以采用以下几种替代方案:

方法一:在 initialize 中进行一次性测试

initialize 函数在策略启动时必定会执行一次,不受交易日限制。你可以将需要测试的逻辑(如获取历史数据、财务数据、股票基础信息等)放在这里进行打印。

def initialize(context):
    g.security = '600570.SS'
    set_universe(g.security)
    
    # 在初始化中直接测试并打印日志
    log.info("周末测试:策略初始化启动")
    stock_info = get_stock_info(g.security)
    log.info(f"获取股票信息:{stock_info}")

方法二:确保 before_trading_start 在节假日执行

默认情况下,before_trading_start 在节假日是执行的(holiday_not_do_before="0")。你可以将测试代码放在该函数中。如果之前修改过参数,请确保将其改回默认值。

def initialize(context):
    g.security = '600570.SS'
    set_universe(g.security)
    # 确保节假日执行盘前函数(0为执行,1为不执行)
    set_parameters(holiday_not_do_before="0")

def before_trading_start(context, data):
    log.info("周末测试:盘前函数触发")
    # 在这里编写你的测试逻辑
    history_data = get_history(5, '1d', 'close', g.security)
    log.info(f"历史数据:\n{history_data}")

方法三:使用 run_interval 定时触发(仅限交易模块)

如果你需要在周末模拟盘中持续运行的逻辑,可以使用 run_interval 函数。它会按照设定的时间间隔(秒)周期性运行,不受交易日限制。

def initialize(context):
    g.security = '600570.SS'
    set_universe(g.security)
    # 每10秒执行一次测试函数
    run_interval(context, weekend_test_func, seconds=10)

def weekend_test_func(context):
    log.info("周末测试:定时任务触发")
    # 注意:周末获取实时行情(如 get_snapshot)可能返回周五的收盘数据或空数据
    snapshot = get_snapshot(g.security)
    log.info(f"行情快照:{snapshot}")

def handle_data(context, data):
    pass # 周末不会执行

周末测试的注意事项

  1. 行情数据滞后:周末获取的实时行情(如 get_snapshotget_gear_price)通常是上一个交易日(周五)的收盘数据。
  2. 委托下单无效:周末调用 order 等交易接口报单到柜台,通常会被直接拒单或处于“待报”状态,无法真实成交。
  3. 回测模式:如果你只是想验证策略逻辑,强烈建议使用回测模式而不是模拟交易模式。在回测模式下,你可以指定任意历史时间段,系统会模拟当时的交易日环境,handle_data 会正常触发,日志也会正常打印。