3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
在 Ptrade 量化平台中,遇到 get_price 返回空数据是一个非常常见的问题。根据 Ptrade 官方 API 文档的底层逻辑,导致你代码中数据为空的核心原因主要有以下两点:
get_price 会返回空数据?get_price 不包含当天数据(核心原因)
Ptrade 官方文档明确指出:“数据返回内容不包括当天数据”。get_price 主要用于获取历史指定时间段的数据。如果你在盘中(或回测的当天)调用它来获取 1m(分钟级别)的数据,且没有指定 end_date,系统默认截止到昨天,这会导致在某些券商的模拟端或实盘环境中直接返回空值。
end_date 参数未明确指定
在回测环境中,get_price 的 end_date 如果不传,系统有时无法正确推断当前的回测时间边界。文档建议:“回测中输入请小于回测日期,交易、研究中输入请小于当前日期”。
get_history 替代在 handle_data、run_daily 或 run_interval 等盘中运行的函数里,获取最近 N 根 K 线(尤其是分钟线)的标准做法是使用 get_history,而不是 get_price。
get_history 专为盘中实时获取行情设计,且可以通过 include=True/False 参数控制是否包含当前未走完的 K 线。
def initialize(context):
g.start = True
# 建议在初始化时设置股票池,这样 get_history 可以更高效地获取数据
set_universe(['600119.SS'])
def handle_data(context, data):
if g.start:
log.info("开始获取数据")
g.start = False
execution(context)
def execution(context):
code_list = ['600119.SS']
# 使用 get_history 替代 get_price
# count=30: 获取30根K线
# frequency='1m': 1分钟线
# include=False: 不包含当前正在生成的这一分钟(避免未来函数)
new_df = get_history(count=30, frequency='1m', field=['close'], security_list=code_list, fq='pre', include=False)
print(new_df)
get_history 与 get_price 不支持多线程同时调用。千万不要在 run_interval 和 handle_data 同一时刻同时调用这两个接口,否则会偶发性返回空数据。code_list(即使里面只有1只股票)时,Ptrade 会将其视为多股票查询。在 Python 3.11 环境下,返回的 DataFrame 会包含 code 列;在 Python 3.5 环境下,返回的可能是 Panel 对象或以股票代码为列名的 DataFrame。建议打印出 type(new_df) 确认数据结构,以便后续正确解析。