
大宗商品圈子里有个流传已久的说法:行情的传导是有顺序的——先是贵金属动,然后是原油,最后才轮到农产品。背后的逻辑是资金的风险偏好在依次打开,从避险资产到工业品再到软商品,一棒一棒往下传。
这套说法不是每次都灵,但最近这一轮,走得还挺像那么回事。黄金率先启动,随后原油系跟进发力,有色金属接棒,近期农产品和油脂系也开始活跃起来。板块之间你方唱罢我登场,整体呈现出一种明显的”此起彼伏”节奏。
盯着这个节奏,我开始想:既然板块轮动有迹可循,能不能让程序来做这件事——自动判断哪个板块正在集体发力,然后把仓位集中过去?
这篇文章分享的就是这样一套策略,运行平台为优宽量化,代码完整开放。需要说明的是,贵金属(黄金、白银)通常作为领先信号存在,本策略监控的是其后的产业品板块,不包含贵金属本身。

想做板块轮动,首先要解决三个问题:怎么判断一个板块是否在集体发力、发力的板块里做哪个品种、什么时候该离场。
手动盯的话,这三件事都得靠感觉和经验,容易漏信号,也容易情绪化。让程序来做,就需要把这三个问题逐一量化。
这套策略的设计逻辑,就是围绕这三个问题展开的。
策略分三层:
第一层:板块评分
每隔15分钟,对7个板块各打一个综合趋势得分(0~100分)。得分高说明板块内部品种集体趋势一致,值得关注;得分低说明板块内部分歧,暂时跳过。
第二层:品种筛选
对得分达标的板块,在其内部品种上跑历史回测,筛出胜率、盈亏比、回撤都过关的品种,同时找出该品种历史上最优的MA参数组合。
第三层:信号执行
每5分钟检查一次筛出的品种,出现MA金叉就开多,出现死叉就开空。持仓后持续巡检,MA一旦反叉立即平仓。
所有板块并行运行,不存在”只做某一个板块”的切换逻辑。哪个板块得分达标,就监听哪个板块的信号;多个板块同时达标,就同时持有多个板块的仓位。
7个板块,48个主流品种,覆盖商品期货主要品种:
| 板块 | 品种代码 |
|---|---|
| 🛢️ 能源系 | fu、bu、lu |
| 🔩 有色金属系 | cu、al、zn、pb、ni、sn、ao |
| ⚙️ 黑色金属系 | rb、hc、ss、i、j、jm、SF、SM、FG、SA |
| 🫙 油脂系 | y、p、OI |
| 🌽 农产品系 | c、cs、a、b、m、jd、lh |
| 🍎 软商品系 | SR、CF、CY、AP、CJ、PK |
| 🧪 化工系 | l、v、pp、eg、eb、pg、TA、MA、PX、PF、SH、UR |
分类原则是产业链驱动逻辑相近。同一板块内的品种,在行情发动时往往方向一致,这正是一致性打分的基础。
这是策略的核心。对每个板块,先计算内部每个品种的单品种得分,再聚合为板块得分。

三个维度叠加:
MA排列(±40分)
var fast = SECTORS[sectorName].maFast; // 10
var slow = SECTORS[sectorName].maSlow; // 30
var isBull = fastMA > slowMA; // 多头排列 → +40
var isBear = fastMA < slowMA; // 空头排列 → -40
价格动量(±30~50分)
取近20根1小时K线的涨跌幅,动量越强分值越高:
var momentum = (closes[n-1] - closes[n-21]) / closes[n-21] * 100;
var momScore = momentum > 0
? (30 + Math.min(momentum * 3, 20)) // 最高50分
: -(30 + Math.min(Math.abs(momentum) * 3, 20));
波动率加成(+10分)
当前ATR处于历史高分位时额外加10分,高波动意味着趋势行情中有足够利润空间:
var volScore = volPct > 0.5 ? 10 : 0;
三项相加得到单品种原始得分。
统计板块内多头品种数和空头品种数,取多数方向作为板块方向,计算一致性:
var consistency = Math.max(bullCount, bearCount) / total; // 0 ~ 1
var consistencyMult = 0.5 + consistency * 0.5; // 0.5 ~ 1.0
var finalScore = alignedScore * consistencyMult;
一致性系数的作用:如果板块内7个品种有6个方向一致,一致性=86%,系数=0.93,得分接近满分;如果只有4/7一致,系数=0.79,得分明显打折。板块内部分歧时不轻易入场。
板块得分 ≥ 30分时,对板块内每个品种依次做回测,遍历4组MA参数:
var maParams = [[5, 20], [10, 30], [20, 60], [25, 99]];
每组参数跑完整的MA金叉/死叉历史回测,统计胜率、盈亏比、最大回撤,同时过滤掉不达标的组合:
if (bt.signalCount < 3) continue; // 信号太少不可信
if (bt.winRate < minWinRate) continue; // 胜率不足40%
if (bt.profitFactor < minProfitFactor) continue; // 盈亏比不足1.2
if (bt.maxDrawdown > maxMDD) continue; // 最大回撤超过25%
通过筛选的品种,取综合评分最高的MA参数作为该品种的实盘参数:
var score = bt.winRate * 100 * 0.30
+ Math.min(bt.profitFactor * 20, 60) * 0.30
+ Math.max(0, 1 - bt.maxDrawdown / maxMDD) * 100 * 0.20
+ calcVolPct(records) * 10;
每个板块取评分最高的前2个品种(topPerSector = 2)进入信号监听名单。
每5分钟,对所有候选品种检查一次当前K线的MA金叉/死叉:
var crossUp = fastPrev <= slowPrev && fastCur > slowCur; // 金叉
var crossDown = fastPrev >= slowPrev && fastCur < slowCur; // 死叉
if (crossUp && direction >= 0) return 'long'; // 板块多头方向出金叉→开多
if (crossDown && direction <= 0) return 'short'; // 板块空头方向出死叉→开空
板块方向做过滤:多头板块只做多,空头板块只做空,避免逆板块方向开仓。
持仓控制靠两个参数:topPerSector = 2(每个板块最多2个品种)和 maxTotalPositions = 6(全局上限6个)。
没有固定止盈止损,纯信号退出。每轮主循环都对所有持仓做一次MA排列检查:
if (side === 'long') return fastMA > slowMA; // 快线跌破慢线 → false → 平仓
if (side === 'short') return fastMA < slowMA; // 快线上穿慢线 → false → 平仓
MA排列只要反转,当轮即触发平仓。需要注意的是,MA反叉信号基于1小时K线,在趋势剧烈反转时,从价格实际转向到信号触发之间通常有1小时以上的滞后,这段时间的浮亏是策略本身无法规避的,需要配合整体仓位管理来控制风险。
var Amount = 1; // 每次开仓手数
var topPerSector = 2; // 每板块最多持仓品种数
var maxTotalPositions = 6; // 全局持仓上限
var minSectorScore = 30; // 板块入场门槛(低于此分不看信号)
var minWinRate = 0.40; // 品种回测最低胜率
var minProfitFactor = 1.20; // 品种回测最低盈亏比
var maxMDD = 25; // 最大回撤阈值(%)
var allowShort = true; // 是否允许做空
var sectorScanInterval = 15; // 板块评分刷新间隔(分钟)
var signalCheckInterval = 5; // 开仓信号检查间隔(分钟)
minSectorScore 是最关键的一个参数。调高它,策略更保守,只在板块趋势非常明确时才进入;调低它,策略更激进,弱趋势板块也会开仓。初始建议保持30,根据实盘表现再调整。
策略运行时,界面实时显示四张监控表格,方便盘中随时掌握策略状态。
板块得分总览 — 7个板块按得分高低排序,显示当前方向(多头/空头/震荡)、板块内多空品种数量、一致性百分比,以及是否处于信号监听状态。得分低于30分的板块标注为”观望”,不参与本轮信号检查。
候选品种 — 所有通过回测筛选、当前正在等待信号触发的品种,显示所属板块、综合评分、胜率、盈亏比、最大回撤,以及回测选出的最优MA参数组合。
实时持仓 — 每个持仓品种的方向、入场价、当前价、浮盈百分比,以及MA状态(顺势/反叉)。MA状态显示”⚠️ 反叉”时,意味着该品种当轮即将触发平仓。

策略在板块趋势明确、轮动节奏清晰的市场中表现较好。当整个市场进入无方向震荡时,7个板块的得分会普遍低于30分,策略会自动停止新开仓,这是它内置的市场环境过滤机制。
主要局限有三点:
(1)使用1小时线,对板块趋势的感知有一定滞后,快进快出的短线行情容易踏空或追高。
(2)不设止损,依靠MA反叉退出。在趋势剧烈反转时,信号滞后1小时以上,期间浮亏无法规避,使用时需严格控制单品种仓位比例,不要重仓单一品种。
(3)每次板块评分刷新时都要对达标板块内所有品种重新跑回测,品种多时耗时较长,首次启动约需1~2分钟才能完成初始扫描,期间不会开仓。
本文策略仅供学习交流,不构成投资建议。期货交易有风险,入市需谨慎。
策略源码:商品期货板块轮动策略