Estadística

La biblioteca estadística ha sido creada para trabajar de forma cómoda con las principales distribuciones estadísticas.

Para cada una de las distribuciones, en la biblioteca se presentan 5 funciones:

  1. Cálculo de la densidad de la distribución  — función del tipo MathProbabilityDensityX()
  2. Cálculo de la probabilidad — función del tipo MathCumulativeDistributionX()
  3. Cálculo de los cuantiles de las distribuciones — función del tipo MathQuantileX()
  4. Generación de números aleatorios con la distribución indicada — función del tipo MathRandomX()
  5. Cálculo de los momentos teóricos de las distribuciones — función del tipo MathMomentsX()

Aparte del cálculo de magnitudes aleatorias, en la biblioteca se dispone también de la posibilidad de cargar de nuevo funciones, que realizarán los mismos cálculos en las matrices.

 

Ejemplo:

//+------------------------------------------------------------------+
//|                                    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"
//--- activamos las funciones para calcular una distribución normal
#include <Math\Stat\Normal.mqh>
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//--- establecemos los parámetros de la distribución normal
   double mu=5.0;
   double sigma=1.0;
   PrintFormat("Distribución normal con los parámetros mu=%G y sigma=%G, ejemplos de cálculo:",mu,sigma);
//--- establecemos el intervalo
   double x1=mu-sigma;
   double x2=mu+sigma;
//--- variables para el cálculo de la probabilidad
   double cdf1,cdf2,probability;
//--- variables para el código de error
   int error_code1,error_code2;
//--- calculamos los valores de la función de distribución
   cdf1=MathCumulativeDistributionNormal(x1,mu,sigma,error_code1);
   cdf2=MathCumulativeDistributionNormal(x2,mu,sigma,error_code2);
//--- comprobamos el código de los errores
   if(error_code1==ERR_OK && error_code2==ERR_OK)
     {
      //--- calculamos la probabilidad de una magnitud aleatoria en el rango
      probability=cdf2-cdf1;
      //--- mostramos el resultado
      PrintFormat("1. Calcular en el rango %.5f<x<%.5f la probabilidad de una magnitud aleatoria",x1,x2);
      PrintFormat("  Respuesta: Probability = %5.8f",probability);
     }
 
//--- Encontramos el intervalo de valores de la magnitud aleatoria x, que corresponde al 95% de la probabilidad confiada
   probability=0.95; //  establecemos la probabilidad confiada
//--- establecemos la probabilidad en los límites del intervalo
   double p1=(1.0-probability)*0.5;
   double p2=probability+(1.0-probability)*0.5;
//--- calculamos los límites del intervalo
   x1=MathQuantileNormal(p1,mu,sigma,error_code1);
   x2=MathQuantileNormal(p2,mu,sigma,error_code2);
//--- comprobamos el código de los errores
   if(error_code1==ERR_OK && error_code2==ERR_OK)
     {
      //--- mostramos el resultado 
      PrintFormat("2. Para el intervalo confiado = %.2f encontrar el rango de la magnitud aleatoria",probability);
      PrintFormat("  Respuesta: rango  %5.8f <= x <=%5.8f",x1,x2);
     }
 
   PrintFormat("3. Calcular los primeros 4 momentos teóricos y calculados de la distribución");
//--- Generamos una matriz de números aleatorios, calculamos los primeros 4 momentos y comparamos con los valores teóricos
   int data_count=1000000;  // establecemos el número de valores y preparamos la matriz
   double data[];
   ArrayResize(data,data_count);
//--- generamos los valores aleatorios y los guardamos en la matriz
   for(int i=0; i<data_count; i++)
     {
      data[i]=MathRandomNormal(mu,sigma,error_code1);
     }
//--- establecemos el índice del valor incial y el número de datos para el cálculo
   int start=0;
   int count=data_count;
//--- calculamos los primeros 4 momentos de los valores generados
   double mean=MathMean(data,start,count);
   double variance=MathVariance(data,start,count);
   double skewness=MathSkewness(data,start,count);
   double kurtosis=MathKurtosis(data,start,count);
//--- variables para los momentos teóricos
   double normal_mean=0;
   double normal_variance=0;
   double normal_skewness=0;
   double normal_kurtosis=0;
//--- mostramos los valores de los momentos calculados
   PrintFormat("            Mean           Variance          Skewness           Kurtosis");
   PrintFormat("Calculated  %.10f   %.10f      %.10f      %.10f",mean,variance,skewness,kurtosis);
//--- calculamos los valores teóricos de los momentos y comparamos con los obtenidos
   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);
     }
  }