问题描述
使用get_price函数,但是却没有办法获取上一个交易日的一个交易数据,发生时间点是在早上的8点10分!
解决方案
在 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)
总结建议
- 避免在 9:10 之前调用任何行情接口(包括
get_price、get_history、get_snapshot等)。 - 获取历史数据时,显式传入
end_date(通过get_trading_day(-1)获取),而不是依赖默认的空值,这样可以避免日期边界带来的歧义。 - 善用
run_daily将盘前逻辑安排在 9:15 到 9:25 之间执行,这是最安全、最规范的做法。