Estatísticas

A biblioteca estatística destina-se a um cômodo trabalho com as distribuições estatísticas básicas.

Para cada distribuição na biblioteca, são apresentadas 5 características:

  1. Cálculo de densidade da distribuição, função do tipo MathProbabilityDensityX()
  2. Cálculo de probabilidade, função do tipo MathCumulativeDistributionX()
  3. Cálculo de quantis das distribuições, função do tipo MathQuantileX()
  4. Geração de números aleatórios com a distribuição definida, função do tipo MathRandomX()
  5. Cálculo de momentos teóricos das distribuições, função do tipo MathMomentsX()

Além de calcular os valores para as variáveis ​​aleatórias individuais, na biblioteca, são apresentadas também as sobrecargas das funções, que produzem os cálculos nas matrizes.

 

Exemplo:

//+------------------------------------------------------------------+
//|                                    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"
//--- habilitamos as funções para calcular a distribuição normal
#include <Math\Stat\Normal.mqh>
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//--- definimos os parâmetros da distribuição normal
   double mu=5.0;
   double sigma=1.0;
   PrintFormat("Distribuição normal com parâmetros mu=%G e sigma=%G, exemplos de cálculos:",mu,sigma);
//--- definimos o intervalo
   double x1=mu-sigma;
   double x2=mu+sigma;
//--- variáveis para calcular a probabilidade
   double cdf1,cdf2,probability;
//--- variáveis para o código de erro
   int error_code1,error_code2;
//--- calculamos os valores de função da distribuição 
   cdf1=MathCumulativeDistributionNormal(x1,mu,sigma,error_code1);
   cdf2=MathCumulativeDistributionNormal(x2,mu,sigma,error_code2);
//--- verificamos o código de erros
   if(error_code1==ERR_OK && error_code2==ERR_OK)
     {
      //--- calculamos a probabilidade da variável aleatória no intervalo
      probability=cdf2-cdf1;
      //--- exibimos o resultado
      PrintFormat("1. Calcular no intervalo %.5f<x<%.5f a variável aleatória",x1,x2);
      PrintFormat("  Resposta: Probability = %5.8f",probability);
     }
 
//--- Encontramos o intervalo de valores da variável aleatória x, correspondente ao 95% da probabilidade de confiança
   probability=0.95; //  definimos a probabilidade de confiança
//--- definimos a probabilidade nos limites do i intervalo
   double p1=(1.0- probability)*0.5;
   double p2=probability+(1.0- probability)*0.5;
//--- calculamos os limites do intervalo
   x1=MathQuantileNormal(p1,mu,sigma,error_code1);
   x2=MathQuantileNormal(p2,mu,sigma,error_code2);
//--- verificamos o código de erros
   if(error_code1==ERR_OK && error_code2==ERR_OK)
     {
      //--- exibimos o resultado
      PrintFormat("2. Para o intervalo de confiança = %.2f encontrar o intervalo da variável aleatória",probability);
      PrintFormat("  Resposta: intervalo  %5.8f <= x <=%5.8f",x1,x2);
     }
 
   PrintFormat("3. Calculamos os 4 primeiros momentos calculados e teóricos da distribuição");
//--- Geramos a matriz de números aleatórios, calculamos os primeiros 4 momentos e comparamos com os valores teóricos
   int data_count=1000000;  // definimos o número de valores e preparamos a matriz
   double data[];
   ArrayResize(data,data_count);
//--- geramos os valores aleatórios e salvamo-los na matriz
   for(int i=0; i<data_count; i++)
     {
      data[i]=MathRandomNormal(mu,sigma,error_code1);
     }
//--- definimos o índice do valor inicial e número de dados para o cálculo
   int start=0;
   int count=data_count;
//--- calculamos os primeiros 4 momentos dos valores gerados
   double mean=MathMean(data,start,count);
   double variance=MathVariance(data,start,count);
   double skewness=MathSkewness(data,start,count);
   double kurtosis=MathKurtosis(data,start,count);
//--- variáveis para os momentos teóricos
   double normal_mean=0;
   double normal_variance=0;
   double normal_skewness=0;
   double normal_kurtosis=0;
//--- exibimos os valores dos momentos calculados
   PrintFormat("            Mean           Variance          Skewness           Kurtosis");
   PrintFormat("Calculated  %.10f   %.10f      %.10f      %.10f",mean,variance,skewness,kurtosis);
//--- calculamos os valores teóricos dos momentos e comparamos com os obtidos
   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);
     }
  }