第 04 篇
多股票策略
把第 1 章的单股票均线策略推广到多只股票:用 for 循环对股票池里每只股票执行同一套判断,并指出一个新手必踩的坑——每只股票都用全部资金买,第一只就买光了;正确做法是把资金平均分。素材见 raw/collections/jq-getting-started/04-22-多股票策略md.md。
这是什么
从「盯一只股票」到「同时盯多只股票」的过渡篇。动机很朴素:人精力有限,同时追踪多只股票困难;计算机强在数据处理,可以同时监视多只股票。做法是列出股票清单,每只执行与单股票相同的均线规则。
核心要点
- 沿用同一规则:昨日收盘价高出过去 20 日平均价 → 开盘买入;低于 → 开盘卖出(与第 1 章完全相同的单股均线逻辑,套到每只股票上)。
- 人做事也要拆两步:先确定股票范围(是哪些股票);每天对每只观察昨收 vs 20 日均价决定买卖。
- 初始化:
g.security = ['002043.XSHE', '002582.XSHE']——从单字符串变成 list,一次放两只股票(002043 兔宝宝 + 002582 好想你)。 - 周期循环用 for:
for security in g.security:对每只股票分别取价、算均线、判断买卖。 - 新手错误:循环里对每只股票都用全部资金
order_value(security, cash)→ 买完第一只就没钱了,后面全是空单。 - 资金要平均分配:
per_cash = cash / len(g.security),把现金按股票数平分;每只用order_value(security, per_cash)买。 - 为什么必须分散:多股票策略相对于单股票的意义就是分散风险。资金集中在第一只上 = 名义多股、实际还是单股重仓。
机制 / 论证
- 核心论证:多股票 ≠ 多写几遍单股票代码。股票多时逐只手写不可行,必须用「股票清单(数据)+ for 循环(结构)」表达「对每一只都做同样的事」——这是程序化交易相对人力的第一个结构性优势。
- 资金分配的教训链:规则上「多只股票」要成立,资金上也要「真分散」。平均分配是按数量均分(最简单);它引出下一课的深层问题——均分「当前现金」会随时间导致持仓失衡(见市值轮动 2.0 篇的 order_target_value 解法)。
可操作
- 可复用骨架(参数与逻辑):
initialize(context):g.security = ['002043.XSHE', '002582.XSHE'](list 形式列股票)。handle_data(context, data):for security in g.security:内做三件事——取last_price = data[security].close;取average_price = data[security].mavg(20, 'close');取cash = context.portfolio.cash并算per_cash = cash / len(g.security)。- 判断:
last_price > average_price→order_value(security, per_cash);elif last_price < average_price→order_target(security, 0)。
- 参数要点:股票 2 只、均线窗口 20 日、每只预算 = 总现金 ÷ 股票数。
- 规则教训:资金分几份永远要跟「同时在买的标的数」挂钩,不能每次都拿全部现金去下循环里的单。
术语
- 股票池/股票清单:要交易的一组股票,此处是 g.security 这个 list。
- for 循环:对清单里每只股票重复执行同一段逻辑。
- per_cash / 平均分配:总现金 ÷ 股票数。
- 分散风险:多标的摊薄单只股票带来的波动。
不确定 / 待验证
- raw 代码里
data[i].mavg(20,'close')、order_target(i, 0)中的i应为循环变量security(笔误);最后整合代码里order_value(security, cash)又退回用全部现金而非per_cash——与正文「要平均分配」矛盾,属整合时的笔误。→ 以正文逻辑为准(用 per_cash),落地需自查。 - raw 用 mavg(20,'close') 表述 20 日均价(与第 1 章一致)。
相关
- 十行代码带你量化交易入门 — 单股票版本
- 简单市值轮动策略 — 股票池 + 定期轮动的进阶
- 聚宽下单 API 与订单对象 — order_value / order_target 用法
- 聚宽策略框架(initialize / handle_data / before_trading_start) — initialize / handle_data 框架
- 聚宽新手入门教程(JoinQuant 平台实操) — 本教程总览
更新 2026-09-06