Jikipedia
第 04 篇

多股票策略

把第 1 章的单股票均线策略推广到多只股票:用 for 循环对股票池里每只股票执行同一套判断,并指出一个新手必踩的坑——每只股票都用全部资金买,第一只就买光了;正确做法是把资金平均分。素材见 raw/collections/jq-getting-started/04-22-多股票策略md.md。

量化多股票for循环资金分配均线策略

这是什么

从「盯一只股票」到「同时盯多只股票」的过渡篇。动机很朴素:人精力有限,同时追踪多只股票困难;计算机强在数据处理,可以同时监视多只股票。做法是列出股票清单,每只执行与单股票相同的均线规则。

核心要点

  • 沿用同一规则:昨日收盘价高出过去 20 日平均价 → 开盘买入;低于 → 开盘卖出(与第 1 章完全相同的单股均线逻辑,套到每只股票上)。
  • 人做事也要拆两步:先确定股票范围(是哪些股票);每天对每只观察昨收 vs 20 日均价决定买卖。
  • 初始化g.security = ['002043.XSHE', '002582.XSHE']——从单字符串变成 list,一次放两只股票(002043 兔宝宝 + 002582 好想你)。
  • 周期循环用 forfor 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 解法)。

可操作

  • 可复用骨架(参数与逻辑):
    1. initialize(context)g.security = ['002043.XSHE', '002582.XSHE'](list 形式列股票)。
    2. 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)
    3. 判断:last_price > average_priceorder_value(security, per_cash)elif last_price < average_priceorder_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 章一致)。

相关

更新 2026-09-06

检索知识库

按标题、类型或正文检索