Статистика

Статистическая библиотека предназначена для удобной работы с основными статистическими распределениями.

Для каждого распределения в библиотеке представлено 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 2000-2024, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"
//--- подключаем функции для расчета нормального распределения
#include <Math\Stat\Normal.mqh>
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//--- задаем параметры нормального распределения
   double mu=5.0;
   double sigma=1.0;
   PrintFormat("Нормальное распределение с параметрами mu=%G и sigma=%G, примеры вычислений:",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("  Ответ: Probability = %5.8f",probability);
     }
 
//--- Найдем интервал значений случайной величины x, соответствующий 95% доверительной вероятности
   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("  Ответ: диапазон  %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);
     }
  }