跳到主要内容

多标的轮动策略:在候选标的之间排名与选择

重要声明:策引是个人开发的投资策略分析工具和教育平台,通过模拟组合展示交易规则、仓位变化与历史表现。平台不提供投资建议,所有策略分析仅供研究参考。真实账户中的决策与风险由用户自行判断和承担。

普通的原语策略是纵向看的:每个标的各看各的历史,各自决定买或卖。

轮动策略是横向看的:在同一个决策日,把组合里的候选标的放在一起比较,排个名次,只持有排在前面的几只。

一句话区分:

  • 纵向(普通策略):"QQQ 的 20 日均线上穿 60 日均线时买入 QQQ。"
  • 横向(轮动策略):"在我这 10 只标的里,每月持有 RSI 最强的 3 只。"
术语对照

这类"同一时刻横向比较多个标的"的策略,在量化领域的正式名称是横截面策略(cross-sectional),与之相对的是只看单个标的历史的时序策略(time-series)。策引的配置项、校验提示和 AI 参考文档沿用这套术语,本文后面也会交替使用「轮动」和「横截面」——指的是同一件事。

怎么工作的

基本思路

想象每个月月初你做一次同样的动作:

  1. 划定范围——候选标的就是你在组合里填的那几只,不多不少
  2. 筛掉不合格的——比如价格跌破 150 日均线的,这个月不参与竞争
  3. 给剩下的排名——按你选定的强弱指标从强到弱排序
  4. 持有前 N 名——等权分配,其余标的权重为 0
  5. 下个月再来一次

关键在于第 1 步:候选池是固定的,变的是每次选中谁。策引不会替你去市场上找标的,也不会自动增删候选标的。

五个组成部分

一条完整的轮动策略由五段组成,缺一不可:

环节作用举例
强弱指标用来排名的数值21 日涨幅、14 日 RSI
资格条件决定谁有资格参与排名价格站上 150 日均线
调仓节奏多久做一次决策每日 / 每周首个交易日 / 每月首个交易日
排名与选择排序并取前 N 名降序排名,取前 3
等权配置把选中的标的等权分配选中 3 只则各 1/3

调仓节奏必须是同一个——排名、选择、配置三个环节都读同一个节奏设置。否则排名和调仓会错开,出现"按上个月的名次调这个月的仓"。

为什么没选中的标的权重是 0

轮动策略每次输出的不是单个标的的买卖信号,而是一整份完整的目标权重表:组合里每一只标的都有一个权重,选中的均分,没选中的写 0。

这样做的好处是每次调仓的结果是确定的、可核对的:你能直接看到"这个月我应该持有哪三只、各占多少",而不是一堆需要自己推算先后顺序的买卖指令。

也因为如此,轮动策略必须搭配 RebalancingCapitalStrategy——只有它会把整份权重表一次性执行到位。其他资金策略是按单个信号从现金里分配的,配上它会执行错。在网页端配置时,系统会自动帮你切换,并拦截不兼容的选择。

全仓都是现金,也是一种正常结果

如果某次调仓时,所有候选标的都没通过资格条件,那么排名为空,选中数量为 0,整份权重表全是 0——组合这段时间空仓拿现金

这不是配置错误,而是资格条件在起作用。上面例子里的"价格站上 150 日均线"就是一道趋势闸门:市场整体走弱时,它会让组合自动退到现金,而不是在一堆都在跌的标的里挑一个"跌得少的"。

如果你不希望策略空仓,就把资格条件放宽(例如只要求价格大于 0),让排名始终有候选。

参数设置

调仓节奏(frequency)

取值含义
daily每个交易日都重新排名
weekly_first_session每个自然周的第一个实际交易日
monthly_first_session每个自然月的第一个实际交易日

周/月节奏对齐的是组合的真实交易日历,不是日历上的周一或 1 号。遇到假期会自动顺延到当周/当月第一个开市日。

还有一个 bootstrap_on_first_session 开关:设为 true 时,组合开始运行的第一天就建仓;设为 false 则等到下一个完整周期开始。

调仓触发方式(rebalance_policy)

取值含义适合
scheduled每个调仓日都重新调平权重希望权重始终保持均等,接受更多交易
membership_change只有选中名单发生变化时才调仓希望减少交易成本,接受权重在两次换仓之间自然漂移

举例:本月选中 A、B、C,下月还是 A、B、C。scheduled 会把三者拉回各 1/3;membership_change 什么都不做,任由涨得多的那只权重变大。

membership_change 的交易次数明显更少,在有交易成本的回测里通常更占优;代价是持仓权重会偏离等权。

仓位上限与现金缓冲(gross_exposure)

RebalancingCapitalStrategy 上的 gross_exposure 决定这份权重表最终投入多少资金:

  • 1.0——满仓执行,选中 3 只则各占组合的 1/3
  • 0.9——投入 90%,选中 3 只则各占 30%,剩下 10% 始终留作现金

留现金会拉低上涨时的收益,但也会同比例缩小回撤,并给你留出应对追加/赎回的余地。这个参数只对横截面策略生效。

候选标的数量

当前支持 1–10 只候选标的。持有数量 N 不能超过候选标的数——4 只候选池里写"持有前 10 名"会直接报错。

选多少只,是分散和集中的取舍:

  • N = 1:完全押注排名第一的标的,波动和回撤都由这一只决定
  • N = 3 且候选 10 只:既保留了排名的选择效果,也不至于集中在单一标的上
  • N 接近候选总数:排名基本不起作用,退化成等权持有

完整配置示例

美股成长股月度轮动,10 只候选标的中持有 RSI 最强的 3 只,只有站上 150 日均线的才有资格:

{
"trade_strategy": {
"indicators": [
{ "id": "feature", "type": "RSI", "params": { "period": 14, "column": "Close" } },
{ "id": "trend_ma", "type": "SMA", "params": { "period": 150, "column": "Close" } }
],
"signals": [
{ "id": "eligible", "type": "GreaterThan",
"inputs": [{ "column": "Close" }, { "ref": "trend_ma" }], "params": {} },
{ "id": "cadence", "type": "RebalanceCadence", "inputs": [],
"params": { "frequency": "monthly_first_session", "bootstrap_on_first_session": true } },
{ "id": "rank", "type": "CrossSectionalRank",
"inputs": [{ "ref": "feature" }, { "ref": "eligible" }, { "ref": "cadence" }],
"params": { "direction": "descending" } },
{ "id": "selected", "type": "TopN",
"inputs": [{ "ref": "rank" }, { "ref": "cadence" }], "params": { "n": 3 } },
{ "id": "not_selected", "type": "Not", "inputs": [{ "ref": "selected" }], "params": {} },
{ "id": "weight", "type": "EqualWeight",
"inputs": [{ "ref": "selected" }, { "ref": "cadence" }],
"params": { "rebalance_policy": "membership_change" } }
],
"outputs": {
"buy_signal": "selected",
"sell_signal": "not_selected",
"target_weight": "weight",
"indicators": [
{ "id": "feature", "output_name": "cross_sectional_feature" },
{ "id": "eligible", "output_name": "cross_sectional_eligible" }
]
}
}
}

注意 cadence 这个节点被 rankselectedweight 三处引用——这是必须的。

outputs.indicators 是可选的,用来把中间值写进信号数据方便复盘。它只能引用按单标的计算的节点(这里的强弱指标和资格条件)。如果引用排名或选择节点,配置在校验阶段就会被拒绝——因为引擎无法写出那一列。选择结果已经可以从买卖信号和目标权重看出来。

不用手写:从模板开始

网页端的策略编辑器内置了三个轮动模板,可以直接改:

  • 固定标的月度动量 Top 2——最简单的入门版本
  • 美股成长股横截面轮动 Top 3——上面这个例子
  • A股跨资产动量轮动 Top 1——4 只跨资产 ETF,日频,只持有最强的一只

也可以直接向 AI 助手描述需求,例如"在我的组合里每月持有涨幅最强的 3 只",它会生成对应的配置。

常见问题

Q: 我能让它从全市场里选股吗?

不能。候选池必须是你在组合里明确填写的标的(当前最多 10 只)。策引不做全市场扫描,不跟踪指数成分变化,也不会自动增删候选标的。详见能力边界说明

Q: 排名用什么指标比较好?

常见的是一段时间的涨幅(RateOfChange)和相对强弱(RSI)。回看窗口越短越敏感、换手越高;越长越稳定、反应越慢。没有普适的最优值,建议在回测里对比几组再定,并留意换手次数带来的成本差异。

Q: 资格条件是必须的吗?

结构上必须有,但可以放得很宽。如果你希望排名完全说了算,用一个恒真的条件(比如价格大于 0)即可。加趋势闸门的意义在于:市场整体走弱时能退到现金,而不是被迫在下跌的标的里选一个。

Q: 为什么两次调仓之间目标权重是空的?

因为那些交易日本来就不做决策。空值表示"这天没有新指令",不代表权重归零,也不应该按 0 理解——照旧持有上次的仓位即可。

Q: 和平台已有的动量轮动组合有什么关系?

思路一致,实现方式不同。已有的动量轮动组合由平台预设;横截面原语让你可以用自己的标的池、自己的指标和节奏配一个出来。

风险和注意事项

主要风险

  • 候选池决定上限:策略只能在你给的这几只里选。候选池整体走弱时,"选最强的"选出来的也可能是下跌的标的——资格条件是控制这一点的主要手段。
  • N 越小越集中:只持有 1 只时,组合的波动和回撤基本等于那一只标的的波动和回撤,不要用"轮动"这个词来想当然地假设它更分散。
  • 换手成本:日频 + scheduled 的组合换手最高。回测里请确认已包含手续费设置,并对照实际账户的费率。
  • 排名靠的是已经发生的数据:强弱指标衡量的是过去的表现,不预测未来。趋势反转时,排名的调整总是滞后的。
  • 回测样本有限:横截面策略的结果对候选池的选择很敏感。换一组标的,结论可能完全不同——历史表现不代表未来。
  • 候选池含个股时,停牌会让整次运行失败:调仓日只要有一个需要买入或已持有的标的当天没有真实成交数据(A 股停牌、一字涨跌停无法成交),系统不会用旧价格假装成交,而是让本次运行直接失败——组合状态会显示更新失败。这是刻意的:拿过期价格算出来的持仓和净值会一直错下去。我们自己的研究里,仅中兴通讯(000063)2018 年那次停牌,就让多轮回测失败。ETF 基本不受影响(成分股停牌不影响 ETF 本身交易),所以个股候选池建议先做停牌和流动性筛查,或优先使用 ETF

建议的检查步骤

  1. 先用较长的回看窗口和月度节奏跑一遍,看换手次数是否在你能接受的范围
  2. 对比一下同样标的池的等权买入持有基准——如果轮动跑不赢它,说明排名没有起到作用
  3. 查看历史最大回撤,确认它在你的风险预算之内
  4. gross_exposure 决定是否要留现金缓冲
  5. 候选池里如果有个股,先确认这些标的历史上停牌是否频繁——一次停牌就会让当次运行失败

总结

能做什么:在你指定的 1–10 只候选标的之间横向排名,按资格条件过滤后持有前 N 名并等权配置,支持日/周/月节奏。

不能做什么:全市场选股、动态调整候选池、做空、加杠杆。

配置要点

  • 调仓节奏节点只建一个,三处共用
  • 资金策略必须是 RebalancingCapitalStrategy
  • 交易成本敏感时优先用 membership_change
  • 想要现金缓冲就调 gross_exposure

重要提醒:本文内容仅供研究参考,不构成投资建议。文中的配置示例与历史回测结果基于特定的标的池和时间区间,换一组标的或换一段时间,结论可能完全不同。请结合你的资金安排、已有持仓与可承受回撤,自行判断真实账户中的操作与风险。

开始使用:在原语策略可视化编辑器里打开轮动模板试改参数,或继续阅读原语策略入门动量轮动策略详解