问题描述
请问before_market_open与before_trading_start 这两个函数有什么区别呢?
解决方案
在 JoinQuant(聚宽)量化交易平台中,before_trading_start 和 before_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_func或prepare_data)。它并不是聚宽 API 的保留关键字。 - 触发机制:系统不会自动调用这个函数。如果你想让它在开盘前运行,必须在
initialize函数中使用定时运行 API(如run_daily,run_weekly,run_monthly)来显式注册它,并指定运行时间。 - 用途:配合定时运行函数,实现更灵活的调度。比如你只想在每月的第一个交易日开盘前运行,或者想在 09:15 运行,就可以自定义这个函数并用
run_monthly或run_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_daily 的 time 参数决定(如 09:00, 09:15 等) |
| 执行频率 | 每天执行一次 | 可通过 run_daily/weekly/monthly 灵活控制频率 |
建议:
如果你只是需要每天开盘前做一些常规准备,直接使用内置的 before_trading_start 是最简单方便的。如果你需要更复杂的定时逻辑(比如每周一开盘前,或者特定时间点),则建议自定义函数(如 before_market_open)并结合 run_xxx 系列函数来使用。