🚀 AI 一键生成 joinquant 策略代码
立即体验
👉 AI 生成代码 👈

JoinQuant模拟交易中 after_code_changed 函数的执行时机详解

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

问题描述

after_code_changed何时运行

模拟交易中,替换代码后,after_code_changed何时执行呢,是替换代码的同时就会运行,还是第二天开盘前某个时间运行呢?

解决方案

在 JoinQuant(聚宽)的模拟交易中,替换代码后 after_code_changed 并不是在替换代码的同时立即运行的,而是在第二天模拟盘进程恢复(重启)时运行。

具体执行时机解析

根据 JoinQuant API 文档的说明,模拟盘的运行机制如下:

  1. 休眠与恢复机制:模拟盘在每天的交易时间结束后会保存状态并结束进程(相当于休眠)。然后在第二天开盘前(通常是早晨系统初始化时)重新启动并恢复状态。
  2. 代码变更检测:在第二天进程恢复时,系统会加载策略代码。如果系统发现策略代码与上一次运行时相比发生了修改,并且代码中定义了 after_code_changed(context) 函数,那么就会在恢复过程中执行该函数。
  3. 执行顺序:在第二天重启恢复时,全局代码会被执行一遍,接着使用保存的状态恢复 gcontext,然后如果代码有变动就会执行 after_code_changed,最后执行 process_initialize

为什么需要 after_code_changed?

由于模拟盘重启后不再执行 initialize 函数initialize 在整个模拟盘生命周期中只执行一次),如果你在替换代码时修改了 initialize 中的某些全局变量(例如更换了要交易的股票 g.stock = '000002.XSHE'),这些修改在第二天重启时是不会生效的(系统会直接读取昨天保存的 g.stock 的旧值)。

因此,你必须将需要修改的变量状态写在 after_code_changed 中:

def after_code_changed(context):
    # 在这里修改模拟盘中已经持久化保存的变量
    g.stock = '000002.XSHE'
    log.info("代码已更新,目标股票已切换为 000002.XSHE")

总结

  • 不是立即执行:你点击替换代码的那一刻,当前正在运行的进程不会立刻执行该函数。
  • 第二天开盘前执行:它会在第二天早晨模拟盘进程从休眠中唤醒、加载新代码并发现代码有变动时自动执行。
  • 回测时的特例:需要注意的是,在执行回测时,after_code_changed 也会被默认执行一次(在 process_initialize 之前)。