统计

统计库提供了一种处理基本统计分布的便利方式。

统计库为每个分布提供5个函数:

  1. 计算概率密度 – MathProbabilityDensityX()函数
  2. 计算概率 – MathCumulativeDistributionX()函数
  3. 计算分布四分位数 – MathQuantileX()函数
  4. 生成指定分布的随机数 – MathRandomX()函数
  5. 计算分布的理论力矩 – MathMomentsX()函数

除了计算各地随机变量值以外,该统计库还提供重载执行相同数组计算的函数。

示例:

//+------------------------------------------------------------------+

//|                                    NormalDistributionExample.mq5 |

//|                        Copyright 2016, MetaQuotes Software Corp. |

//|                                             https://www.mql5.com |

//+------------------------------------------------------------------+

#property copyright "Copyright 2016, MetaQuotes Software Corp."

#property link      "https://www.mql5.com"

#property version   "1.00"

//--- 包括计算正态分布的函数

#include <Math\Stat\Normal.mqh>

//+------------------------------------------------------------------+

//| 脚本程序起始函数                                                   |

//+------------------------------------------------------------------+

void OnStart()

  {

//--- 设置正态分布的参数

   double mu=5.0;

   double sigma=1.0;

   PrintFormat("Normal distribution with parameters mu=%G and sigma=%G, calculation examples:",mu,sigma);

//--- 设置间隔

   double x1=mu-sigma;

   double x2=mu+sigma;

//--- 概率计算变量

   double cdf1,cdf2,probability;

//--- 错误代码变量

   int error_code1,error_code2;

//--- 计算分布函数值

   cdf1=MathCumulativeDistributionNormal(x1,mu,sigma,error_code1);

   cdf2=MathCumulativeDistributionNormal(x2,mu,sigma,error_code2);

//--- 检查错误代码

   if(error_code1==ERR_OK && error_code2==ERR_OK)

     {

      //--- 计算范围内随机变量概率

      probability=cdf2-cdf1;

      //--- 输出结果

      PrintFormat("1. 计算%.5f范围内随机变量的概率<x<%.5f",x1,x2);

      PrintFormat("  Answer: Probability = %5.8f",probability);

     }



//--- 对应95%的置信度,寻找随机变量x的值范围

   probability=0.95; //  设置置信概率

//--- 在区间范围设置概率

   double p1=(1.0-probability)*0.5;

   double p2=probability+(1.0-probability)*0.5;

//--- 计算区间范围

   x1=MathQuantileNormal(p1,mu,sigma,error_code1);

   x2=MathQuantileNormal(p2,mu,sigma,error_code2);

//--- 检查错误代码

   if(error_code1==ERR_OK && error_code2==ERR_OK)

     {

      //--- 输出结果 

      PrintFormat("2. 如果置信区间 = %.2f,请查找随机变量的范围",probability);

      PrintFormat("  Answer: range is  %5.8f <= x <=%5.8f",x1,x2);

     }



   PrintFormat("3. 估算分布的前4个已计算的理论力矩");

//--- 生成随机数数组,计算前4力矩和比较理论值

   int data_count=1000000;  // 设置值数和准备数组

   double data[];

   ArrayResize(data,data_count);

//--- 生成随机值并将其存入数组

   for(int i=0; i<data_count; i++)

     {

      data[i]=MathRandomNormal(mu,sigma,error_code1);

     }

//--- 设置初始值指数和计算的数据量

   int start=0;

   int count=data_count;

//--- 计算生成值的前4力矩

   double mean=MathMean(data,start,count);

   double variance=MathVariance(data,start,count);

   double skewness=MathSkewness(data,start,count);

   double kurtosis=MathKurtosis(data,start,count);

//--- 理论力矩变量

   double normal_mean=0;

   double normal_variance=0;

   double normal_skewness=0;

   double normal_kurtosis=0;

//--- 显示计算的力矩值

   PrintFormat("            Mean           Variance          Skewness           Kurtosis");

   PrintFormat("Calculated  %.10f   %.10f      %.10f      %.10f",mean,variance,skewness,kurtosis);

//--- 计算力矩理论值并将其与获得的值相比较

   if(MathMomentsNormal(mu,sigma,normal_mean,normal_variance,normal_skewness,normal_kurtosis,error_code1))

     {

      PrintFormat("Theoretical %.10f   %.10f      %.10f       %.10f",normal_mean,normal_variance,normal_skewness,normal_kurtosis);

      PrintFormat("Difference  %.10f   %.10f      %.10f       %.10f",mean-normal_mean,variance-normal_variance,skewness-normal_skewness,kurtosis-normal_kurtosis);

     }

  }