🚀 AI 一键生成 joinquant 策略代码

聚宽量化平台中 before_market_open 与 before_trading_start 有什么区别?

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

问题描述

聚宽函数,区别

请问before_market_open与before_trading_start 这两个函数有什么区别呢?

解决方案

在 JoinQuant(聚宽)量化交易平台中,before_trading_startbefore_market_open 经常在策略代码中出现,但它们的本质和调用机制有很大的区别。简单来说:一个是系统内置的特定回调函数,另一个是用户自定义的普通函数。

以下是详细的区别解析:

1. before_trading_start(context):系统内置回调函数

  • 定义:这是聚宽 API 官方提供的一个可选的内置事件函数
  • 触发机制:只要你在策略代码中定义了这个函数,系统就会在每天开盘前(默认时间为 09:00)自动调用它一次
  • 用途:通常用于每天开盘前的一些初始化工作,比如获取昨日收盘价、更新股票池、打印日期日志等。
  • 示例
    def before_trading_start(context):
        # 系统每天 09:00 自动执行
        log.info("即将开始交易,当前日期:" + str(context.current_dt))
        # 可以在这里更新当天的待买入股票池等
    

2. before_market_open(context):用户自定义函数

  • 定义:这只是一个普通的 Python 自定义函数名(你完全可以把它命名为 my_morning_funcprepare_data)。它并不是聚宽 API 的保留关键字。
  • 触发机制:系统不会自动调用这个函数。如果你想让它在开盘前运行,必须在 initialize 函数中使用定时运行 API(如 run_daily, run_weekly, run_monthly)来显式注册它,并指定运行时间。
  • 用途:配合定时运行函数,实现更灵活的调度。比如你只想在每月的第一个交易日开盘前运行,或者想在 09:15 运行,就可以自定义这个函数并用 run_monthlyrun_daily 调度。
  • 示例
    def initialize(context):
        # 必须手动注册,指定每天 09:00 运行该自定义函数
        run_daily(before_market_open, time='09:00')
        
        # 或者指定每月第一个交易日 09:00 运行
        # run_monthly(before_market_open, monthday=1, time='09:00')
    
    def before_market_open(context):
        # 只有被 run_daily 调度时才会执行
        log.info("自定义的开盘前准备函数运行了")
    

总结对比

特性 before_trading_start before_market_open (自定义)
函数性质 聚宽 API 内置回调函数 用户自定义普通函数
调用方式 系统自动调用 需配合 run_daily 等定时函数手动注册调用
执行时间 固定在每天 09:00 run_dailytime 参数决定(如 09:00, 09:15 等)
执行频率 每天执行一次 可通过 run_daily/weekly/monthly 灵活控制频率

建议
如果你只是需要每天开盘前做一些常规准备,直接使用内置的 before_trading_start 是最简单方便的。如果你需要更复杂的定时逻辑(比如每周一开盘前,或者特定时间点),则建议自定义函数(如 before_market_open)并结合 run_xxx 系列函数来使用。