把行情当作随机变量看
◍ 把行情当作随机变量看
在 MT5 里做价格行为分析,第一步是把每一根 K 线涨跌看成随机变量,而不是确定性事件。这样你才会用概率分布去描述波动,而不是凭感觉喊方向。 外汇与贵金属杠杆高、跳空频繁,把价格当正态变量直接套用会吃大亏,真实分布往往厚尾。 MQL5 内置的统计函数能直接拉取历史序列做均值、方差计算,下面这段是取最近 N 根收盘价做基础统计的骨架,复制到脚本里就能跑。
「价格波动本身就是统计样本」
很多人以为统计学是回测报告里才用得上的东西,其实 MT5 里那根蜡烛图,本质就是标的在时间点上的统计分布。你看到的每个收盘价,都是经纪商已经替你完成采集和衡量的结果,交易者手里拿到的永远是二手但成形的数据。 技术分析之所以能用来判断买卖,是因为指标和价格形态背后全在跑统计:均线算的是均值,布林带算的是标准差,连你肉眼看的支撑阻力,也是历史频率的直觉化。外汇和贵金属市场高杠杆、跳空频繁,这种统计规律只代表概率倾向,不等于下次一定重复。 所以别把图表当真理,把它当一份持续更新的样本集更实在。理解了采集—衡量—分析这三步,你调参数时才清楚自己到底在改分布的哪一段。
掷硬币看清统计与概率的纠缠
把 EURUSD 小时图看作两种货币关系的状态记录,每一根 K 线都是该关系在某一时刻的取值。为什么这段是跌而不是涨?底层答案只有一个词:概率。对象取这个值或那个值,都由概率分布决定,而不是由我们的愿望决定。 拿一枚公平硬币做实验最能说明问题。理论概率正反面各 0.5,前 10 次掷出 8 正 2 反,前 100 次掷出 53 正 47 反。次数少的时候偏差能大到 80%/20%,次数拉到 100 才收敛到 53%/47% 附近。 反过来若事先不知硬币是否公平,用统计倒推概率:10 次样本算出的 0.8/0.2 会误判硬币有偏,100 次样本算出的 0.53/0.47 才能较准确定论它是公平的。实验次数越多,统计反映对象真实特性的误差越小。 对交易者来说,手里的历史行情是统计,要预测的下一段价格行为是概率。挑战在于用有限样本去估分布、再下买卖决策。外汇与贵金属杠杆高、价格受宏观事件扰动,这种由统计推概率的做法天然带误差,任何推断都只是倾向而非确定。
◍ 从身高样本拆开六个统计量
拿一组 10 人的身高(cm)当样本:173、162、194、181、186、159、173、178、168、171。样本大小 n=10,所有下面算出来的数都只是这组样本的统计量,不是总体随机变量的真值。 样本平均值把 10 个数加总除以 10,得到 174.5 cm。这是后续所有离差计算的锚点。 样本方差描述数据散得多开:先求每个值减均值的平方和,再除以 n-1=9,本例得出 113.611。方差大说明有个别值离均值远,比如 159 和 194 都拉高了它。 样本偏度看分布是否对称。按公式算立方偏差和并做方差 2/3 次幂缩放,本例偏度仅 0.372981,因为高低偏离互相抵消;若换成强偏分布,偏度能到 1.384651。 样本峰度衡量尖峭程度。身高数据算完得 -0.1442285,若为极尖锐峰值,该量可冲到 10 上下。 再加 10 个体重数据(65、70、83、60、105、58、69、90、78、65)配对看。协方差 = 各对(身高差×体重差)之和除以 9,得 91.2778;但图上可见身高升时体重常降,说明两样本并非独立。 相关系数把协方差除以两方差平方根之积,约束在 [-1,1]。本例身高体重相关系数 0.579098,属中等正向线性依存。外汇与贵金属价格序列做同样计算时,样本非平稳,高风险,相关可能在行情切换中骤变,建议直接开 MT5 用历史数据跑一遍验证。
「移动平均线就是最直白的统计样本」
要把统计学落进图表,最省事的入口就是移动平均线(MovingAverage)。它干的事很朴素:取一段窗口里的价格,算算术平均。公式写成 MA = (P[1]+P[2]+…+P[n]) / n,其中 P[i] 是第 i 根 K 线的价格,n 是回看根数。 这东西本质上和统计里的样本均值同构,没有任何魔法。但它并不只是拿来画一条线——指数移动平均(EMA)的递推计算就建立在它之上,而 MACD 的核心差分项直接吃 EMA 的输出。 也就是说,你在 MT5 里拖出的 MACD 指标,底层依赖的仍是这个最基础的统计平均。外汇与贵金属波动大、跳空频繁,均线滞后与样本偏差的高风险始终存在,用它判趋势强度只能当作概率参考而非定论。
用 Statistics.mqh 跑一遍基础统计量
MT5 自带的 statistics.mqh 把均值、方差、偏度、峰度、协方差和相关系数都封装成了独立函数,调用时严格按依赖顺序走:方差要先行算好的均值,偏度峰度再吃均值加方差,相关系数则必须拿到两序列协方差和各自方差。 下面这段脚本直接塞了 10 个身高(cm)和 10 个体重(kg)的样例,顺手把六个量全算出来打到日志。身高样本均值约 174.5、体重均值约 74.3,这种小样本跑出来偏度峰度波动会很大,只看绝对值容易误判分布形态。 外汇和贵金属行情序列用同一套函数时,记得先去趋势或分段,否则长周期均值会被单边行情拽偏,算出的协方差参考意义有限,杠杆品种本身高风险,统计结论只代表历史样本的概率倾向。 代码逐行拆解: #include <Statistics.mqh> 引入统计库,否则 Average / Variance 等全都未定义。 void OnStart() 脚本入口,MT5 跑脚本只认这个函数。 double arrX[10]={173,162,194,181,186,159,173,178,168,171}; 身高样本数组,长度 10。 double arrY[10]={65,70,83,60,105,58,69,90,78,65}; 体重样本数组,与 arrX 一一对应。 double mx=Average(arrX); 算 arrX 均值。 double my=Average(arrY); 算 arrY 均值。 double dx=Variance(arrX,mx); 用已得均值算 arrX 方差。 double dy=Variance(arrY,my); 算 arrY 方差。 double as=Asymmetry(arrX,mx,dx); 传均值和方差算偏度。 double exc=Excess(arrX,mx,dx); 传同样参数算超额峰度。 double cov=Cov(arrX,arrY,mx,my); 两序列均值传入算协方差。 double corr=Corr(cov,dx,dy); 协方差加两方差算相关系数。 PrintFormat("mx=%.6e",mx); 以科学计数法六位打印均值,其余同理。
class="macro">#include <Statistics.mqh> class=class="str">"cmt">//+------------------------------------------------------------------+ class=class="str">"cmt">//| Script program start function | class=class="str">"cmt">//+------------------------------------------------------------------+ class="type">void OnStart() { class=class="str">"cmt">//--- specify two data samples. class="type">class="kw">double arrX[class="num">10]={class="num">173,class="num">162,class="num">194,class="num">181,class="num">186,class="num">159,class="num">173,class="num">178,class="num">168,class="num">171}; class="type">class="kw">double arrY[class="num">10]={class="num">65,class="num">70,class="num">83,class="num">60,class="num">105,class="num">58,class="num">69,class="num">90,class="num">78,class="num">65}; class=class="str">"cmt">//--- calculate the mean class="type">class="kw">double mx=Average(arrX); class="type">class="kw">double my=Average(arrY); class=class="str">"cmt">//--- to calculate the variance, use the mean value class="type">class="kw">double dx=Variance(arrX,mx); class="type">class="kw">double dy=Variance(arrY,my); class=class="str">"cmt">//--- skewness and kurtosis values class="type">class="kw">double as=Asymmetry(arrX,mx,dx); class="type">class="kw">double exc=Excess(arrX,mx,dx); class=class="str">"cmt">//--- covariance and correlation values class="type">class="kw">double cov=Cov(arrX,arrY,mx,my); class="type">class="kw">double corr=Corr(cov,dx,dy); class=class="str">"cmt">//--- print results in the log file PrintFormat("mx=%.6e",mx); PrintFormat("dx=%.6e",dx); PrintFormat("as=%.6e",as); PrintFormat("exc=%.6e",exc); PrintFormat("cov=%.6e",cov); PrintFormat("corr=%.6e",corr); }
◍ 最后一句大实话
前面几节把正态、方差、相关性这些统计地基铺开了,但评论区里 СанСаныч Фоменко 和 _____Life_Line 的质疑才是真刀真枪:外汇和贵金属价格序列大多是非平稳的,用几十年样本算出的均值、方差放到危机里可能完全失效,随机序列靠概率不对称和期望正负也能啃下收益,而不是靠预测。 所以别把课本统计当圣经,开 MT5 把一段 EURUSD 的 H1 丢进 iMA 和 iStdDev 跑一遍,看不同窗口下均值是不是漂移,比背公式有用。市场高风险,统计只是帮你少交学费,不是给你印钞机。