3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
在 ptrade 量化交易平台中,如果在早上 8:10 左右使用 get_price 函数无法获取上一交易日的数据,通常是由于系统行情数据尚未完成初始化或更新导致的。
根据 ptrade API 文档的说明:
before_trading_start 函数默认在每天的 9:10 执行。如果在 9:10 之前(如 8:10 开启交易时立即执行)调用行情接口,受系统行情未更新的影响,会导致数据获取有误或为空。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)
get_price、get_history、get_snapshot 等)。end_date(通过 get_trading_day(-1) 获取),而不是依赖默认的空值,这样可以避免日期边界带来的歧义。run_daily 将盘前逻辑安排在 9:15 到 9:25 之间执行,这是最安全、最规范的做法。