问题描述
解决方案
在 JoinQuant 聚宽平台中,可以通过 context.run_params 对象来获取当前策略的运行参数。具体来说,使用 context.run_params['type'] 可以判断当前的运行模式。
判断方法
context.run_params['type'] 会返回一个字符串,对应不同的运行模式:
'simple_backtest':编译运行(在策略编辑页面点击“编译运行”)。'full_backtest':运行回测(点击“运行回测”生成的完整回测)。'sim_trade':模拟交易(挂在模拟交易服务器上的实盘模拟)。
代码示例
你可以在 initialize 或 handle_data 等函数中加入以下逻辑来进行判断:
# -*- coding: utf-8 -*-
def initialize(context):
# 获取运行模式
run_type = context.run_params['type']
# 打印当前模式
log.info("当前运行模式: " + run_type)
if run_type == 'sim_trade':
# 模拟交易特有的设置
log.info("正在进行模拟交易,开启盘口撮合...")
set_option('match_with_order_book', True)
# 可以在这里设置发送微信消息等实盘特有功能
elif run_type == 'full_backtest':
# 回测特有的设置
log.info("正在进行回测,设置较为严格的滑点...")
set_slippage(PriceRelatedSlippage(0.002))
elif run_type == 'simple_backtest':
# 编译运行(调试)特有的设置
log.info("正在调试代码...")
应用场景
区分运行模式通常用于以下场景:
- 消息推送:只在
sim_trade(模拟交易)模式下调用send_message发送微信通知,避免回测时产生大量无效消息。 - 撮合机制:在模拟交易中开启盘口撮合 (
match_with_order_book) 以更接近实盘,而在回测中关闭以提高速度。 - 调试日志:在
simple_backtest中打印详细的debug日志,而在模拟交易中只打印关键的info或error日志。 - 数据处理:回测时可能需要预加载大量历史数据,而模拟交易只需要处理当天的实时数据。
Q&A
Q: context.run_params 还有其他属性吗?
A: 是的,除了 type,它还包含:
start_date: 回测/模拟开始日期 (datetime.date对象)。end_date: 回测/模拟结束日期 (datetime.date对象)。frequency: 运行频率,值为'day'(天)、'minute'(分钟) 或'tick'(Tick级)。
Q: 为什么我在回测中调用 send_message 没有收到微信?
A: send_message 函数仅在 聚宽官网的实时运行模拟交易 (sim_trade) 中生效。在回测 (simple_backtest 或 full_backtest) 中调用该函数会被系统直接忽略,且不会报错。
Q: 可以在策略运行中途改变运行模式吗?
A: 不可以。运行模式是在策略启动时确定的,context.run_params 在整个策略生命周期内是只读的。
Q: 本地使用 JQData SDK 时如何判断?
A: 本地 SDK 环境通常不涉及 context.run_params 的自动注入(除非使用本地回测引擎)。如果是自己编写的脚本,通常需要通过自定义变量或配置参数来控制逻辑。上述方法主要适用于聚宽官网的在线回测和模拟交易环境。