概率论与数理统计示例(第一部分):基础与初级理论·综合运用
(3/3)·从组合概率到假设检验,用一套完整推演看清行情背后的随机与结构
很多交易者把连续三根阳线当成趋势确认,却没算过在纯随机波动里这种形态出现的概率本就不低。等到把伯努利方案和假设检验真正串起来,才会发现不少自认的“信号”只是噪声。本篇作为系列收尾,把前两篇的基础与初级理论拉进同一个综合运用框架。
「用二项分布给走势序列做显著性截断」
这段脚本把一段已标注的走势序列拆成四个计数格:当前段上行且下段仍上行记 nuu,当前上行下段转下行记 nud,当前下行下段转上行记 ndu,当前下行下段续下行记 ndd。汇总后 nu=nuu+nud、nd=ndu+ndd,再算出上行续涨概率 p1e=nuu/nu 与下行反转概率 p2e=ndu/nd,相当于把「惯性」和「折返」分别量化。 输入参数给得很直接:nm=27 是总走势数,kup=16 是其中上行走势数,p0=0.5 是零假设下的随机概率,alpha1=0.05 是单侧误判容忍度。OnStart 里调 MathQuantileBinomial 算出上下临界值 kl 与 kr,若 kup<=kl 或 kup>=kr 就说明该序列的上行占比不太像随机游走,倾向存在方向偏好。 下面这段 Python 用超几何分布做了平行验证:n1=21、n2=6 两组样本,成功数 k1=15、k2=1,同样取 alpha1=0.05 算 kl/kr。跑出来 k2=1 远低于 kr,说明小样本那组的成功数显著偏少,概率上不太可能由抽样噪声解释。外汇与贵金属波动受杠杆与跳空影响,此类统计仅作样本特征筛查,实盘仍需结合风控。
if(mv[i + class="num">1] > class="num">0) ++nuu; else ++nud; } else { if(mv[i + class="num">1] > class="num">0) ++ndu; else ++ndd; } nu = nuu + nud; nd = ndu + ndd; if(nu > class="num">0) p1e = ((class="type">class="kw">double)nuu) / nu; if(nd > class="num">0) p2e = ((class="type">class="kw">double)ndu) / nd; } class="macro">#include <Math\Stat\Binomial.mqh> class="macro">#class="kw">property script_show_inputs class=class="str">"cmt">//+------------------------------------------------------------------+ class="kw">input class="type">int nm = class="num">27; class=class="str">"cmt">// 序列中的走势总数 class="kw">input class="type">int kup = class="num">16; class=class="str">"cmt">// 上行走势的数量 class="kw">input class="type">class="kw">double p0 = class="num">0.5; class=class="str">"cmt">// 检查概率值 class="kw">input class="type">class="kw">double alpha1 = class="num">0.05; class=class="str">"cmt">// 类型 class="num">1 错误概率 class=class="str">"cmt">//+------------------------------------------------------------------+ class="type">void OnStart() { class="type">int kl, kr, er; kr=(class="type">int)MathQuantileBinomial(class="num">1.0-alpha1,nm,p0,er); kl=(class="type">int)MathQuantileBinomial(alpha1,nm,p0,er); Print("kl=", kl, " kup=", kup, " kr=", kr); Print("kup<=kl = ", kup<=kl); Print("kup>=kr = ", kup>=kr); } from scipy.stats class="kw">import hypergeom n1 = class="num">21; n2 = class="num">6 k1 = class="num">15; k2 = class="num">1 alpha1 = class="num">0.05 kl = class="type">int(hypergeom.ppf(alpha1, n1 + n2, k1 + k2, n2)) kr = class="type">int(hypergeom.ppf(class="num">1.0 - alpha1, n1 + n2, k1 + k2, n2)) print("kl =", kl, " k2 =", k2, " kr =", kr) print("k2<=kl =", k2<=kl) print("k2>=kr =", k2>=kr)
◍ 随机变量还没真正铺开
这一节其实是个截断点:原文明确说描述性统计、区间参数估值、渐近估值和贝叶斯方法都没碰,理由是先把随机变量的概念理清,才有办法做有意义的研究。 从实操角度看,这意味着你现在能在 MT5 里跑的只是「概念验证」级别的片段,别急着拿去套 EURUSD 或 XAUUSD 的实盘参数。 作者把上述数理统计内容推迟到下一篇,本篇刻意压住篇幅。外汇与贵金属波动受杠杆和流动性影响,高风险,任何未经验证的统计量直接上实盘都偏激进。
画得少,看得清
这套离散化与概率模型的工具包,核心就九个文件:三个 Python 脚本算超几何和费舍尔精确检验,六个 MQL5 文件覆盖价格离散、伯努利与马尔可夫参数估值及假设检验。discret_prices.mq5 体积仅 2.67 KB,跑完把走势压成 1 和 -1 的序列图,肉眼就能分辨状态切换密度。 真正落地时不必全装,先拷 Discr.mqh 和 discret_prices.mq5 到 MT5 的 MQL5/Scripts 目录,编译后拖到图表, EURUSD 这类高流动性品种在 M15 以上周期离散效果更稳。外汇与贵金属杠杆高、滑点突发的特性,会让 -1/1 序列在重大数据发布前后出现伪信号,参数别直接照搬。 把 p_model.mq5(1.86 KB)接着挂上,就能对刚离散出的序列估 p 值,和 p0_hypothesis.mq5 联用可快速筛掉“胜率等于拍脑袋数字”的假想。工具链条短,但每一步都能在 MT5 里当场复算。