用于一组指标信号的朴素贝叶斯分类器·综合运用
📊

用于一组指标信号的朴素贝叶斯分类器·综合运用

(3/3)·从条件概率公式到指标委员会实盘验证,这套框架如何把胜率提升变成可复现的工程

实战向进阶 第 3/3 篇
很多人把指标信号直接当进场指令,却从没算过这个信号在历史里到底对应了多少次真正盈利。朴素贝叶斯的价值不在玄学,而在逼你把‘信号→状态’的条件概率摊开看。不先量化信号质量,再多指标堆叠也只是噪音放大器。

用双均线假设搭出多策略信号框架

先把两个方向假设 H_BULL 和 H_BEAR 立起来,它们靠 iMA 周期 1 的均线做价格参照。__INDICATOR_1 取 Bar=0 的实时开盘价均线(1,0,sma,open),__INDICATOR_2 同参数但 Bar=5,并在 TradeDuration 里锁死用 5 根柱线。也就是说,统计模式下第 5 根柱线是“虚拟当前柱”,系统回头看第 5 到第 0 根之间的报价变化来验证假设,而非真金白银下单。 两套模式(统计收集 / 实盘交易)的取数位置不同:交易模式下若指标基于开盘价则从柱线 0 取信号,否则取柱线 1;若直接吃即时报价,就在柱线 0 查指标值。因此同一逻辑要准备多组不同 Bar 数的参数集,先攒统计再转实盘。 假设组这样配:__SIGNAL_A = H_BULL,IndicatorXrelatesToIndicatorY,X=1、Y=2、方向 UpSide,动作 Alert;__SIGNAL_B 仅把方向和名称换成 H_BEAR / DownSide。这就把“价格站在短均线上方”的牛熊假设钉死了。 验证概率用三条标准策略。随机振荡(14,3,3,sma,lowhigh)取 Bar=6,因用了高低价须往前多取一根;上穿 20 买(S_BUY stochastic)、下穿 80 卖(S_SELL stochastic)。MACD 参数 fast=6 slow=21 signal=6 从 var4~var6 读,基于开盘价故 Bar=5,主线上穿信号线买、下穿卖。布林带周期 7 偏差 1(var1,var2),向右平移 2 根,故 Bar=5 仍算历史数据;前一根高低价破平移上/下轨触发 S_BUY / S_SELL bands。所有参数存为 .set 文件可直接加载到 MT5 回测。 外汇与贵金属波动剧烈,上述信号仅描述框架逻辑,实盘胜率倾向随经纪商点差与滑点漂移,落地前请用历史数据重优化 var 类参数。

◍ 回测数字与三指标共振的落地验证

用 EURUSD 的 D1 周期、2014.01.01 至 2017.01.01 共 778 根样本柱做统计:其中 328 个满足 5 天买入假设,449 个满足 5 天卖出假设。把各指标信号的历史胜率算出来,随机振荡 0.615、MACD 0.576、布林带 0.568,这是纯计数层面的理论效率。 切到交易模式重跑,把柱线编号 5 改 0、6 改 1,并将对应信号组的 Action 由 Alert 改成 Buy/Sell,三种策略分别用 indstats-trade-stoch.set、indstats-trade-macd.set、indstats-trade-bands.set 跑出真实成交摘要。实测随机振荡 29 买中 18 盈、22 卖中 14 盈,总效率 0.63;MACD 0.58;布林带 0.57,和理论值几乎贴合,微小偏差来自 5 柱内信号重叠时不重复开仓。 拿公式算三指标同步触发的理论胜率:0.63×0.58×0.57 ÷ (0.63×0.58×0.57 + 0.37×0.42×0.43) ≈ 0.757。把 ConsistentSignalNumber 改成 3、载入 indstats-trade-all.set 实测,组合系统总效率 0.75,低频但更准的入场使盈利因子冲到 3.18、最大回撤压到 30$,不过交易数只剩 12 笔。外汇与贵金属属高风险品种,这类历史概率只代表样本内倾向,实盘可能明显偏离。 下面这段是 EA 日志里摘出的核心计数,逐行对应上面结论:bars 是总样本数,bull/bear 是多空假设数,buy/sell 与 buyOk/sellOk 分列各策略信号量和盈利量,totals 行给出逐策略胜率,macd/bands/stochastic 后括号内是 盈/总。最后四行是三种单策略加三指标组合的实测买卖胜率,组合 Total 0.75 即上文落地值。

MQL5 / C++
: bars=<span class="number">class="num">778</span>
: bull=<span class="number">class="num">328</span> bear=<span class="number">class="num">449</span>
:&nbsp;&nbsp;&nbsp;&nbsp;buy:&nbsp;&nbsp;&nbsp;&nbsp;<span class="number">class="num">328</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="number">class="num">0</span>&nbsp;&nbsp;&nbsp;&nbsp; <span class="number">class="num">30</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="number">class="num">0</span>&nbsp;&nbsp;&nbsp;&nbsp; <span class="number">class="num">50</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="number">class="num">0</span>&nbsp;&nbsp;&nbsp;&nbsp; <span class="number">class="num">58</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="number">class="num">0</span> 
:&nbsp;&nbsp;buyOk:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="number">class="num">0</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="number">class="num">0</span>&nbsp;&nbsp;&nbsp;&nbsp; <span class="number">class="num">18</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="number">class="num">0</span>&nbsp;&nbsp;&nbsp;&nbsp; <span class="number">class="num">29</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="number">class="num">0</span>&nbsp;&nbsp;&nbsp;&nbsp; <span class="number">class="num">30</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="number">class="num">0</span> 
:&nbsp;&nbsp; sell:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="number">class="num">0</span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="number">class="num">449</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="number">class="num">0</span>&nbsp;&nbsp;&nbsp;&nbsp; <span class="number">class="num">22</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="number">class="num">0</span>&nbsp;&nbsp;&nbsp;&nbsp; <span class="number">class="num">49</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="number">class="num">0</span>&nbsp;&nbsp;&nbsp;&nbsp; <span class="number">class="num">67</span> 
: sellOk:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="number">class="num">0</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="number">class="num">0</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="number">class="num">0</span>&nbsp;&nbsp;&nbsp;&nbsp; <span class="number">class="num">14</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="number">class="num">0</span>&nbsp;&nbsp;&nbsp;&nbsp; <span class="number">class="num">28</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="number">class="num">0</span>&nbsp;&nbsp;&nbsp;&nbsp; <span class="number">class="num">41</span> 
: totals:&nbsp;&nbsp; <span class="number">class="num">0.00</span>&nbsp;&nbsp; <span class="number">class="num">0.00</span>&nbsp;&nbsp; <span class="number">class="num">0.60</span>&nbsp;&nbsp; <span class="number">class="num">0.64</span>&nbsp;&nbsp; <span class="number">class="num">0.58</span>&nbsp;&nbsp; <span class="number">class="num">0.57</span>&nbsp;&nbsp; <span class="number">class="num">0.52</span>&nbsp;&nbsp; <span class="number">class="num">0.61</span> 
: Stats by name:
:&nbsp;&nbsp;macd=<span class="number">class="num">0.576</span> [<span class="number">class="num">57</span>/<span class="number">class="num">99</span>]
:&nbsp;&nbsp;bands=<span class="number">class="num">0.568</span> [<span class="number">class="num">71</span>/<span class="number">class="num">125</span>]
:&nbsp;&nbsp;stochastic=<span class="number">class="num">0.615</span> [<span class="number">class="num">32</span>/<span class="number">class="num">52</span>]
: Buys: <span class="number">class="num">18</span>/<span class="number">class="num">29</span> <span class="number">class="num">0.62</span> Sells: <span class="number">class="num">14</span>/<span class="number">class="num">22</span> <span class="number">class="num">0.64</span> Total: <span class="number">class="num">0.63</span>
: Buys: <span class="number">class="num">29</span>/<span class="number">class="num">49</span> <span class="number">class="num">0.59</span> Sells: <span class="number">class="num">28</span>/<span class="number">class="num">49</span> <span class="number">class="num">0.57</span> Total: <span class="number">class="num">0.58</span>
: Buys: <span class="number">class="num">29</span>/<span class="number">class="num">51</span> <span class="number">class="num">0.57</span> Sells: <span class="number">class="num">34</span>/<span class="number">class="num">59</span> <span class="number">class="num">0.58</span> Totals: <span class="number">class="num">0.57</span>
: Buys: <span class="number">class="num">4</span>/<span class="number">class="num">7</span> <span class="number">class="num">0.57</span> Sells: <span class="number">class="num">5</span>/<span class="number">class="num">5</span> <span class="number">class="num">1.00</span> Total: <span class="number">class="num">0.75</span>

「画得少,看得清」

离散信号最大的坑是指标互相打架:叠加多个指标后,可能始终等不到所有指标共同确认的那一下。给信号之间加一点时间冗余,比硬等共振更现实。 更进一步的做法是直接算指标状态的概率密度,比如振荡器读到某个超买超卖值,对应成功入场的百分比是多少,再叠上止损止盈和手数参数一起看。外汇和贵金属波动剧烈、杠杆高风险大,这类概率结论只代表倾向,不等于胜率保证。 文末附的 indstats 智能系统(mq4/mq5 均有)把贝叶斯公式落到了实盘统计上,跑一遍测试设置就能验证理论概率和实抽结果是否对得上。少堆几个指标、把概率算透,比满屏画线更容易执行。

把信号诊断交给小布盯盘
这些指标信号的历史条件概率与委员会投票结果,小布盯盘的 AIGC 已内置,打开对应品种页即可看到胜率分布,你只管判断当前状态是否值得下注。

常见问题

可在框架里只保留相关性低的指标,或对信号做去冗余;同篇前文已讨论独立性假设的边界,实战中适度违背仍可运行,只是后验概率需打折看待。
柱线能稳定统计入场盈亏比,避免报价抖动带来的伪信号;这会让概率模型更干净,也更符合多数中低频系统的执行逻辑。
基础实现可等权,但进阶做法应按各指标历史 P(E|H) 质量加权;本文结果小节展示了等权下的基准表现,可作为你调权的起点。
目前小布内置的是信号胜率诊断与多指标状态面板,框架级回测需自行在终端部署文中代码;但诊断视图已覆盖文中核心概率字段。
宏观事件会瞬间改写状态先验,历史条件概率可能失效;贵金属受避险流影响时指标独立性更差,实盘需配合风控阈值,行情可能反向。