用于一组指标信号的朴素贝叶斯分类器·综合运用
(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 即上文落地值。
: bars=<span class="number">class="num">778</span> : bull=<span class="number">class="num">328</span> bear=<span class="number">class="num">449</span> : buy: <span class="number">class="num">328</span> <span class="number">class="num">0</span> <span class="number">class="num">30</span> <span class="number">class="num">0</span> <span class="number">class="num">50</span> <span class="number">class="num">0</span> <span class="number">class="num">58</span> <span class="number">class="num">0</span> : buyOk: <span class="number">class="num">0</span> <span class="number">class="num">0</span> <span class="number">class="num">18</span> <span class="number">class="num">0</span> <span class="number">class="num">29</span> <span class="number">class="num">0</span> <span class="number">class="num">30</span> <span class="number">class="num">0</span> : sell: <span class="number">class="num">0</span> <span class="number">class="num">449</span> <span class="number">class="num">0</span> <span class="number">class="num">22</span> <span class="number">class="num">0</span> <span class="number">class="num">49</span> <span class="number">class="num">0</span> <span class="number">class="num">67</span> : sellOk: <span class="number">class="num">0</span> <span class="number">class="num">0</span> <span class="number">class="num">0</span> <span class="number">class="num">14</span> <span class="number">class="num">0</span> <span class="number">class="num">28</span> <span class="number">class="num">0</span> <span class="number">class="num">41</span> : totals: <span class="number">class="num">0.00</span> <span class="number">class="num">0.00</span> <span class="number">class="num">0.60</span> <span class="number">class="num">0.64</span> <span class="number">class="num">0.58</span> <span class="number">class="num">0.57</span> <span class="number">class="num">0.52</span> <span class="number">class="num">0.61</span> : Stats by name: : macd=<span class="number">class="num">0.576</span> [<span class="number">class="num">57</span>/<span class="number">class="num">99</span>] : bands=<span class="number">class="num">0.568</span> [<span class="number">class="num">71</span>/<span class="number">class="num">125</span>] : 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 均有)把贝叶斯公式落到了实盘统计上,跑一遍测试设置就能验证理论概率和实抽结果是否对得上。少堆几个指标、把概率算透,比满屏画线更容易执行。