:root{--brand-1:#18794e;--brand-2:#3dd68c;--brand-3:#2bb673;--brand-soft:#3dd68c22;} .hero .kicker{color:var(--brand-2)} .nav .ep{color:var(--brand-2)} .sec h2 .num{color:var(--brand-2)} .quote::before{background:var(--brand-1)} .quote .q-text .em{color:var(--brand-2)} .quote .q-water .pg{color:var(--brand-2)} .widget .w-title{color:var(--brand-2)} .takeaway h3{color:var(--brand-2)} .takeaway ol li::marker{color:var(--brand-2)} .next .nx-label{color:var(--brand-2)} .formula .eq{color:var(--brand-2)} a{color:var(--brand-2)} .comp.c1 .tag{background:var(--brand-soft);color:var(--brand-2)} /* UMP判罚 */ .ump .trades{display:flex;flex-direction:column;gap:8px;margin:12px 0} .ump .trade{display:flex;align-items:center;gap:12px;padding:10px 12px;background:var(--bg-mute);border:1px solid var(--divider);border-radius:8px;cursor:pointer;transition:all .2s;font-size:13.5px} .ump .trade:hover{border-color:var(--brand-1)} .ump .trade .tid{font-family:var(--mono);color:var(--t3);width:50px;flex:none;font-size:12px} .ump .trade .feat{flex:1;color:var(--t2);font-size:12.5px} .ump .trade .feat b{color:var(--t1);font-family:var(--mono)} .ump .trade .badge{padding:3px 10px;border-radius:4px;font-size:11px;font-weight:700;font-family:var(--mono)} .ump .trade .badge.pass{background:var(--green-soft);color:var(--green-1)} .ump .trade .badge.block{background:var(--red-soft);color:var(--red-1)} .ump .trade .badge.pending{background:var(--bg-soft);color:var(--t3)} .ump .trade.blocked{opacity:.6} .ump .controls{display:flex;gap:8px;flex-wrap:wrap;margin:10px 0} .ump .controls button{font-size:12.5px} .ump .controls button.on{background:var(--brand-soft);color:var(--brand-2);border-color:var(--brand-1)} .ump .gauge{margin-top:14px} .ump .gauge .gl{font-size:12px;color:var(--t3);margin-bottom:6px} .ump .gauge .bar{height:22px;background:var(--bg-mute);border-radius:6px;overflow:hidden;position:relative} .ump .gauge .fill{height:100%;border-radius:6px;transition:width .4s;display:flex;align-items:center;justify-content:flex-end;padding-right:8px;font-size:11px;color:#fff;font-weight:600;font-family:var(--mono)} .ump .gauge .fill.green{background:linear-gradient(90deg,#18794e,#3dd68c)} .ump .gauge .fill.red{background:linear-gradient(90deg,#b3344a,#f66f81)} .ump .verdict{margin-top:12px;padding:13px;border-radius:8px;font-size:13.5px;text-align:center} .ump .verdict.ok{background:var(--green-soft);color:var(--green-1);border:1px solid var(--green-1)} .ump .verdict.bad{background:var(--red-soft);color:var(--red-1);border:1px solid var(--red-1)}
量化交易实战 · 第 13 期 · 第二季

回测说"该买",UMP 说"红牌"——听谁的?

abu UMP 主裁判罚 · ump_main judge

普通回测是"无脑执行"——信号一来就下单,不管这笔交易长得像不像历史上亏钱的那批。abu 的 UMP(UmpMainJudge)给回测加了个主裁:它学历史交易的"好/坏"特征(涨跌幅、波动、换手),对新交易打分,可疑的亮红牌拦截。回测负责生成信号,UMP 负责否决坏信号——把回测从"无脑执行"变成"有判断的执行"。
⏱ 约 9 分钟 🎯 想给回测加判断、用 abu 的人 📦 源:abu §7

01为什么需要 UMP:回测是无脑的

普通回测有个隐含假设:所有信号都同等可信。但实际不是——有些信号出现在"高风险环境"(高波动、连涨后追高),历史上这种环境亏得多。回测不知道,照样下单。

UMP(UmpMainJudge,主裁判罚器)就是补这个判断的。它的工作分两步:

本质上是用机器学习给回测加一个"风险否决权"。回测说"该买",UMP 说"这种环境买的都亏了,红牌"——这笔就不做。长期看,被 UMP 拦截的交易确实平均亏损,拦截让总收益更稳。

回测负责生成信号,
UMP 负责否决坏信号。
灏天文库 · 量化交易实战 P.39

02UMP 判罚演示:给交易看 UMP 怎么判

下面模拟 UMP。每笔交易有特征(涨跌幅、波动率、距前高、换手率),UMP 用训练好的模型打分。点交易看 UMP 判罚:通过(绿)或拦截(红)。"开 UMP"对比开关前后的回测收益。

🟥 UMP 判罚演示
点交易看 UMP 判罚;开关 UMP 对比回测收益。
UMP 拦截概率(点击交易查看)
—
点上方交易看 UMP 怎么判。

03UMP 的特征和判罚逻辑

UMP 用哪些特征判罚?abu 默认用交易发生时的几个"环境特征":

特征1

涨跌幅

买入时距前 N 日的涨幅。追高(涨太多)的交易历史上亏得多。

特征2

波动率

买入时的近期波动。高波动环境的交易风险大、胜率低。

特征3

距前高

当前价距近期高点的距离。接近前高(突破)vs 远离前高(回调),盈亏分布不同。

特征4

换手率

买入时的成交活跃度。异常放量常是出货信号。

判罚逻辑:UMP 把这些特征喂给分类器(abu 默认用 GMM 或 KNN),输出一个"这笔交易属于'坏交易'簇的概率"。设阈值(如 0.6),高于就拦截。

features(trade) → classifier.predict_proba → P(bad) → if P(bad) > threshold: 拦截

关键提醒:UMP 的判罚依赖训练数据的质量。如果历史回测本身就有未来函数、幸存者偏差,UMP 学到的"好/坏"也是错的。所以 UMP 不是银弹——它是"在干净的回测上加一层否决权",不能救脏的回测。

UMP 是否决权,
不是免死金牌。
灏天文库 · 量化交易实战 P.40

04带走这套清单

✅ UMP 判罚 6 条可执行规则

  1. UMP 是给回测加否决权:回测生成信号,UMP 否决可疑的,不是替代策略。
  2. 训练要干净:UMP 学历史交易的"好/坏",回测脏则 UMP 也脏,先保证回测无未来函数。
  3. 特征选环境变量:涨跌幅、波动、距前高、换手——交易发生时的"环境",不是信号本身。
  4. 阈值要调:太高拦截太少没用,太低拦太多错过机会,用样本外调。
  5. 看拦截收益:被拦截的交易平均应亏损,否则 UMP 学错了,要重训。
  6. UMP 不救烂策略:策略本身没 edge,UMP 再会判也救不了——先有 edge 再加 UMP。
回测从无脑执行,
变成有判断的执行。
灏天文库 · 量化交易实战 P.41