🚀 AI 一键生成 ptrade 策略代码

ptrade 平台早上8点10分调用 get_price 获取不到上一交易日数据怎么办?

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

问题描述

get_price函数在早上8点10分获取不了上一交易日的数据

使用get_price函数,但是却没有办法获取上一个交易日的一个交易数据,发生时间点是在早上的8点10分!

解决方案

在 ptrade 量化交易平台中,如果在早上 8:10 左右使用 get_price 函数无法获取上一交易日的数据,通常是由于系统行情数据尚未完成初始化或更新导致的。

原因分析

根据 ptrade API 文档的说明:

  1. 盘前初始化时间:在交易环境中,before_trading_start 函数默认在每天的 9:10 执行。如果在 9:10 之前(如 8:10 开启交易时立即执行)调用行情接口,受系统行情未更新的影响,会导致数据获取有误或为空。
  2. 接口限制:虽然 get_price 是获取历史数据的接口,但在券商柜台或 ptrade 系统的底层,盘前过早的时间点可能正在进行日切或数据清算,导致历史数据接口暂时不可用。

解决方案

为了稳定获取上一交易日的数据,建议采用以下几种方法进行调整:

方法一:使用 run_daily 延迟执行(推荐)

不要在 initialize 或过早的 before_trading_start 中直接调用行情接口。可以使用 run_daily 定时任务,将数据获取的时间点设定在 9:15 之后(此时系统数据已准备完毕)。

def initialize(context):
    g.security = '600570.SS'
    set_universe(g.security)
    # 设定在每天 9:15 获取历史数据
    run_daily(context, get_yesterday_data, time='09:15')

def get_yesterday_data(context):
    # 明确指定 end_date 为上一交易日
    pre_date = get_trading_day(-1).strftime('%Y%m%d')
    df = get_price(g.security, end_date=pre_date, frequency='1d', count=1)
    log.info("获取到的上一交易日数据:\n%s" % df)

def handle_data(context, data):
    pass

方法二:在 before_trading_start 中明确指定 end_date 并配合 Sleep

如果必须在 before_trading_start 中获取,请确保该函数在 9:10 之后执行。如果是手动过早拉起策略,可以在代码中加入时间判断或 sleep,并且明确传入 end_date 参数

import time
import datetime

def initialize(context):
    g.security = '600570.SS'
    set_universe(g.security)

def before_trading_start(context, data):
    # 明确获取上一交易日的日期
    pre_date = get_trading_day(-1).strftime('%Y%m%d')
    
    # 尝试获取数据,增加容错机制
    try:
        df = get_price(g.security, end_date=pre_date, frequency='1d', count=1)
        if df is None or df.empty:
            log.warning("8点多获取数据为空,可能系统未就绪")
        else:
            log.info("成功获取数据:\n%s" % df)
    except Exception as e:
        log.error("获取数据异常:%s" % e)

总结建议

  • 避免在 9:10 之前调用任何行情接口(包括 get_priceget_historyget_snapshot 等)。
  • 获取历史数据时,显式传入 end_date(通过 get_trading_day(-1) 获取),而不是依赖默认的空值,这样可以避免日期边界带来的歧义。
  • 善用 run_daily 将盘前逻辑安排在 9:15 到 9:25 之间执行,这是最安全、最规范的做法。