🚀 AI 一键生成 joinquant 策略代码

JoinQuant 策略开发:利用 run_params 区分回测与模拟交易

joinquant | 发布时间: 2025/12/24
以下内容由 EasyQuant 生成。

问题描述

如何在代码中判断当前运行模式是回测还是模拟交易?

解决方案

在 JoinQuant 聚宽平台中,可以通过 context.run_params 对象来获取当前策略的运行参数。具体来说,使用 context.run_params['type'] 可以判断当前的运行模式。

判断方法

context.run_params['type'] 会返回一个字符串,对应不同的运行模式:

  • 'simple_backtest'编译运行(在策略编辑页面点击“编译运行”)。
  • 'full_backtest'运行回测(点击“运行回测”生成的完整回测)。
  • 'sim_trade'模拟交易(挂在模拟交易服务器上的实盘模拟)。

代码示例

你可以在 initializehandle_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("正在调试代码...")

应用场景

区分运行模式通常用于以下场景:

  1. 消息推送:只在 sim_trade(模拟交易)模式下调用 send_message 发送微信通知,避免回测时产生大量无效消息。
  2. 撮合机制:在模拟交易中开启盘口撮合 (match_with_order_book) 以更接近实盘,而在回测中关闭以提高速度。
  3. 调试日志:在 simple_backtest 中打印详细的 debug 日志,而在模拟交易中只打印关键的 infoerror 日志。
  4. 数据处理:回测时可能需要预加载大量历史数据,而模拟交易只需要处理当天的实时数据。

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_backtestfull_backtest) 中调用该函数会被系统直接忽略,且不会报错。

Q: 可以在策略运行中途改变运行模式吗?
A: 不可以。运行模式是在策略启动时确定的,context.run_params 在整个策略生命周期内是只读的。

Q: 本地使用 JQData SDK 时如何判断?
A: 本地 SDK 环境通常不涉及 context.run_params 的自动注入(除非使用本地回测引擎)。如果是自己编写的脚本,通常需要通过自定义变量或配置参数来控制逻辑。上述方法主要适用于聚宽官网的在线回测和模拟交易环境。