问题描述
handle_data(context, '399001.XSHE') 这样是一天一次 如何每分钟运行一次
解决方案
在 JoinQuant (聚宽) 平台中,handle_data 函数的运行频率不是通过代码参数来设置的,而是由您在创建回测或模拟交易时选择的**“运行频率”**决定的。
另外,您给出的示例 handle_data(context, '399001.XSHE') 存在语法错误。handle_data 的标准定义是 def handle_data(context, data):,第二个参数 data 是一个包含当前时间切片数据的字典,不能直接传入标的代码。
要实现每分钟运行一次策略,您有以下两种方法:
方法一:使用 handle_data 并设置回测频率为“分钟”
- 编写代码:保持
handle_data的标准写法。 - 界面设置:在聚宽回测界面的右上方(或创建模拟交易时),将**“频率”选项从“天”修改为“分钟”**。
这样设置后,引擎会自动在交易时间的每一分钟调用一次 handle_data。
def initialize(context):
# 初始化设置
g.security = '399001.XSHE'
# 只要在界面选择了“分钟”频率,这个函数就会每分钟执行一次
def handle_data(context, data):
# 获取当前分钟的收盘价
current_price = data[g.security].close
log.info("当前时间:%s, 价格:%s" % (context.current_dt, current_price))
方法二:使用 run_daily 定时函数(官方更推荐)
聚宽官方文档建议尽量使用 run_daily 来代替 handle_data,因为 run_daily 的时间控制更加灵活和明确。您可以使用 time='every_bar' 参数来实现每分钟运行。
注意:使用此方法同样需要在回测界面将频率设置为“分钟”。
def initialize(context):
g.security = '399001.XSHE'
# 注册定时运行函数,time='every_bar' 表示在每个 Bar(分钟频率下即每分钟)运行
run_daily(my_minute_strategy, time='every_bar')
# 自定义策略函数,注意参数只有 context
def my_minute_strategy(context):
# 在 run_daily 调用的函数中,不再提供 data 参数,需要使用 API 获取数据
current_data = get_current_data()
current_price = current_data[g.security].last_price
log.info("当前时间:%s, 最新价格:%s" % (context.current_dt, current_price))
总结
- 频率控制:无论是
handle_data还是run_daily(..., time='every_bar'),要实现分钟级运行,必须在回测/模拟配置界面选择“分钟”频率。 - 代码规范:不要修改系统回调函数(如
handle_data)的默认参数结构。 - 最佳实践:推荐使用
run_daily结合get_current_data()或get_price()/history()来编写策略,结构更清晰。