问题描述
解决方案
明确回答
get_price 函数是可以在 initialize (初始化) 函数中运行的。
在 ptrade 量化平台中,get_price 函数的使用场景包括研究、回测、交易模块。而 initialize 函数是策略启动时运行一次的初始化入口。在 initialize 中调用 get_price 是非常常见的操作,通常用于在策略正式开始交易前,获取历史数据来初始化全局变量(例如计算初始的均线、历史波动率、或者获取某些标的的历史基准价格)。
使用场景与代码示例
假设你的策略需要在启动时计算某只股票过去 10 天的平均价格,并将其保存为全局变量,你可以直接在 initialize 中调用 get_price:
def initialize(context):
# 设置股票池
g.security = '600570.SS'
set_universe(g.security)
# 在初始化时获取历史数据
# 获取策略启动前 10 天的收盘价数据
history_data = get_price(g.security, count=10, frequency='1d', fields='close')
if history_data is not None and not history_data.empty:
# 计算初始的 10 日均价并保存到全局变量 g 中
g.initial_ma10 = history_data['close'].mean()
log.info(f"策略初始化完成,{g.security} 的初始 10 日均价为: {g.initial_ma10}")
else:
g.initial_ma10 = 0
log.warning("初始化时获取历史数据失败!")
def handle_data(context, data):
# 在盘中逻辑中使用初始化时计算的数据
pass
在 initialize 中使用 get_price 的注意事项
-
时间基准的区别:
- 回测环境:在
initialize中调用get_price(如果不传入end_date),默认获取的是回测起始日期之前的历史数据。这非常符合逻辑,因为它避免了引入未来函数。 - 交易/实盘环境:获取的是策略启动当天的历史数据(不包含当天未收盘的数据)。
- 回测环境:在
-
数据量与性能:
initialize只在策略启动(或重启)时运行一次。在这里调用get_price获取适量数据是安全的,但如果一次性请求海量数据(如多年的分钟线),可能会导致策略启动缓慢。 -
并发调用警告:
根据 ptrade 官方文档提示,get_price与get_history不支持多线程同时调用。虽然在initialize中单次调用没有并发问题,但如果你在initialize中设置了run_interval(定时任务),请确保定时任务中的get_price不会与handle_data中的数据获取接口在同一时刻并发触发,否则可能偶现获取数据为空的现象。
总结:你完全可以放心地在 initialize 中使用 get_price 来为你的策略做数据准备工作。