Statistiche

La libreria statistica fornisce un modo conveniente di lavorare con distribuzioni statistiche di base.

La libreria fornisce 5 funzioni per ogni distribuzione:

  1. Calcolo della densità di probabilità - funzioni della forma MathProbabilityDensityX()
  2. Calcolo delle probabilità - funzioni della forma MathCumulativeDistributionX()
  3. Calcolo dei quantili di distribuzione - funzioni della forma MathQuantileX()
  4. Generazione di numeri casuali con distribuzione specificata - funzioni della forma MathRandomX()
  5. Calcolo dei momenti teorici delle distribuzioni - funzioni della forma MathMomentsX()

Oltre a calcolo dei valori per le singole variabili casuali, la libreria fornisce anche overloads per le funzioni che eseguono gli stessi calcoli per gli array.

 

Esempio:

//+------------------------------------------------------------------+
//|                                    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 le funzioni per calcolare la distribuzione normale
#include <Math\Stat\Normal.mqh>
//+------------------------------------------------------------------+
//| Funzione start programma Script function                         |
//+------------------------------------------------------------------+
void OnStart()
  {
//--- impostai parametri della distribuzione normale
   double mu=5.0;
   double sigma=1.0;
   PrintFormat("Distribuzione normale con i parametri mu=%G e sigma=%G, esempi di calcolo:",mu,sigma);
//--- imposta l'intervallo
   double x1=mu-sigma;
   double x2=mu+sigma;
//--- variabili per il calcolo della probabilità
   double cdf1,cdf2,probability;
//--- variabili per i codici errore
   int error_code1,error_code2;
//--- calcola i valori della funzione di distribuzione 
   cdf1=MathCumulativeDistributionNormal(x1,mu,sigma,error_code1);
   cdf2=MathCumulativeDistributionNormal(x2,mu,sigma,error_code2);
//--- controlla i codici errore
   if(error_code1==ERR_OK && error_code2==ERR_OK)
     {
      //--- calcola la probabilità di una variabile random nel range
      probability=cdf2-cdf1;
      //--- da in output il risultato
      PrintFormat("1. Calcola la probabilità di una variabile random entro il range di %.5f<x<%.5f",x1,x2);
      PrintFormat("  Risposta: Probabilità = %5.8f",probability);
     }
 
//--- Trova il valore del range della variabile random x, corrispondente al 95% del livello di confidenza
   probability=0.95; //  imposta la confidenza di probabilità
//--- imposta le probabilità ai confini degli intervalli
   double p1=(1.0-probability)*0.5;
   double p2=probability+(1.0-probability)*0.5;
//--- calcola i confini degli intevalli
   x1=MathQuantileNormal(p1,mu,sigma,error_code1);
   x2=MathQuantileNormal(p2,mu,sigma,error_code2);
//--- controlla codici errore
   if(error_code1==ERR_OK && error_code2==ERR_OK)
     {
      //--- output del risultato 
      PrintFormat("2. Per l'intervallo di confidenza = %.2f, trova il range della variabile random",probability);
      PrintFormat("  Risposta: il range è %5.8f <= x <=%5.8f",x1,x2);
     }
 
   PrintFormat("3. Calcola i primi 4 momenti calcolati e teorici della distribuzione");
//--- Genea un arrai di numeri random, calcola i primi 4 momenti e li confronta con i valori teorici
   int data_count=1000000;  // imposta il numero di valori e prepara un array
   double data[];
   ArrayResize(data,data_count);
//--- genera i valori random e li memorizza nell'array
   for(int i=0; i<data_count; i++)
     {
      data[i]=MathRandomNormal(mu,sigma,error_code1);
     }
//--- imposta l'indice dei valori iniziali e l'ammontare dei dati del calcolo
   int start=0;
   int count=data_count;
//--- calcola i primi 4 momenti dei valori generati
   double mean=MathMean(data,start,count);
   double variance=MathVariance(data,start,count);
   double skewness=MathSkewness(data,start,count);
   double kurtosis=MathKurtosis(data,start,count);
//--- variabili per i momenti teorici
   double normal_mean=0;
   double normal_variance=0;
   double normal_skewness=0;
   double normal_kurtosis=0;
//--- mostra i valori dei momenti calcolati
   PrintFormat("            Media           Varianza          Asimmetria           Curtosi");
   PrintFormat("Calccolati  %.10f   %.10f      %.10f      %.10f",mean,variance,skewness,kurtosis);
//--- calcola i valori teorici dei momenti e li confronta con i valori ottenuti
   if(MathMomentsNormal(mu,sigma,normal_mean,normal_variance,normal_skewness,normal_kurtosis,error_code1))
     {
      PrintFormat("Teorici %.10f   %.10f      %.10f       %.10f",normal_mean,normal_variance,normal_skewness,normal_kurtosis);
      PrintFormat("Differenza  %.10f   %.10f      %.10f       %.10f",mean-normal_mean,variance-normal_variance,skewness-normal_skewness,kurtosis-normal_kurtosis);
     }
  }