概念笔记
聚宽策略框架(initialize / handle_data / before_trading_start)
聚宽策略由几个「平台在特定时机自动调用」的入口函数组成:initialize 只跑一次,beforetradingstart 每个交易日开盘前跑一次,handledata 每个周期跑;自定义函数靠 rundaily 挂进循环。
一句话
写聚宽策略 = 填入口函数:initialize(context) 开头做一次(设股票、参数、基准、注册定时任务);before_trading_start(context) 每个交易日开盘前做一次(放每天只取一次的数据);handle_data(context, data) 每个周期做(按天回测时在 9:30 执行);需要更多节奏时用 run_daily 注册自定义函数。
当前理解
为什么是这套入口
- 任何策略都能拆成「开头一次」+「每天循环」两段(《十行代码》):人操作也是先定股票、再每天看价做买卖。initialize 与 handle_data 正是这两段的代码化。handle_data 按天回测时操作在 9:30 执行。
g是全局变量容器,initialize 里设的值在其它函数里都能读(如g.security、g.stocksnum)。
三个入口的时机与分工(第 3 篇追涨示例最清楚)
- initialize:整个回测/模拟盘开始时执行一次。负责:设
g变量、set_benchmark(基准)、set_commission(手续费)、set_slippage(滑点)、set_option('use_real_price', True)(动态复权)、set_universe(股票池)、run_daily(注册定时函数)。 - before_trading_start:每个交易日开盘前被调用一次;开盘之后当天不再调用,直到次日。适合放「每天取一次」的活(示例里用它取全部候选股的昨日收盘价
history(1,'ld','close',stocks)、清空当日已买集合)。 - handle_data:每个周期被调用;盘中决策都写这里(示例里限制「下午 13:00 后」才干活)。
- 自编函数不会自动进循环,必须在 initialize 里
run_daily(func, time)注册(见 jq-run-daily)。
代码组织的演进
- 小策略两段就够(第 1 章)。变复杂后(轮动 1.0 → 3.0)按功能抽自定义函数:选股
pick(context)、交易trade(...)、止损stop(context)(第 6 篇);把「每天都跑」与「每 N 天跑」拆开。
来源
- 十行代码带你量化交易入门 — initialize/handle_data 最小两段框架
- 使用 JoinQuant 编写一个策略 — 四入口职责、双均线与追涨两示例
- 简单市值轮动策略 — run_daily 替代 handle_data、计数轮动
- 市值轮动策略 2.0 — 自定义函数模块化、daily 骨架
- raw 路径:
原始出处(已归档)03-…05-…06-…
常见混淆
- before_trading_start vs handle_data:前者一天一次、开盘前;后者每周期、含盘中。前者放「准备数据」,后者放「按数据决策」。
- initialize 里取数:教程只把 initialize 当「设置+注册」,行情类实时判断放 handle_data/周期函数;initialize 里写死的东西不随交易日刷新。
- handle_data 被弃用:第 5 篇说平台推荐 run_daily,handle_data 将被弃用——老教程两套都写,新代码优先 run_daily 模式。
开放问题
- [需要验证] handle_data 的弃用状态与现行推荐入口(教程为 2015–2017 语境,平台 API 已演进)。
- [需要验证] 除 initialize/before_trading_start/handle_data/run_daily 外,官方是否还有 after_trading_end 等新入口(raw 未提)。
来源
更新 2026-09-06