avatar of ianzeng123 ianzeng123
关注 私信
1
关注
181
关注者

商品板块轮动量化策略设计与实现 —— 追踪商品脉络,完善交易框架

创建于: 2026-04-24 14:13:31, 更新于: 2026-04-28 10:34:47
comments   0
hits   26

商品板块轮动量化策略设计与实现 —— 追踪商品脉络,完善交易框架

大宗商品圈子里有个流传已久的说法:行情的传导是有顺序的——先是贵金属动,然后是原油,最后才轮到农产品。背后的逻辑是资金的风险偏好在依次打开,从避险资产到工业品再到软商品,一棒一棒往下传。

这套说法不是每次都灵,但最近这一轮,走得还挺像那么回事。黄金率先启动,随后原油系跟进发力,有色金属接棒,近期农产品和油脂系也开始活跃起来。板块之间你方唱罢我登场,整体呈现出一种明显的”此起彼伏”节奏。

盯着这个节奏,我开始想:既然板块轮动有迹可循,能不能让程序来做这件事——自动判断哪个板块正在集体发力,然后把仓位集中过去?

这篇文章分享的就是这样一套策略,运行平台为优宽量化,代码完整开放。需要说明的是,贵金属(黄金、白银)通常作为领先信号存在,本策略监控的是其后的产业品板块,不包含贵金属本身。

商品板块轮动量化策略设计与实现 —— 追踪商品脉络,完善交易框架


想做板块轮动,首先要解决三个问题:怎么判断一个板块是否在集体发力、发力的板块里做哪个品种、什么时候该离场。

手动盯的话,这三件事都得靠感觉和经验,容易漏信号,也容易情绪化。让程序来做,就需要把这三个问题逐一量化。

这套策略的设计逻辑,就是围绕这三个问题展开的。


一、整体思路

策略分三层:

第一层:板块评分

每隔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分钟才能完成初始扫描,期间不会开仓。


本文策略仅供学习交流,不构成投资建议。期货交易有风险,入市需谨慎。

策略源码商品期货板块轮动策略

相关推荐