Statistik

Die statistische Bibliothek ist für die Berechnung der grundlegenden statistischen Verteilungen vorhergesehen.

Für jede Verteilung sind in der Bibliothek fünf Funktionen vorhanden:

  1. Berechnung der Dichte der Verteilung – MathProbabilityDensityX() Funktionen
  2. Berechnung der Wahrscheinlichkeiten – MathCumulativeDistributionX() Funktionen
  3. Berechnung der Verteilung der Quantile – MathQuantileX() Funktionen
  4. Erzeugung von Zufallszahlen aus einer gegebenen Verteilung – MathRandomX() Funktionen
  5. Berechnung der theoretischen Momente – MathMomentsX() Funktionen

Man kann sowohl einzelne Zufallsvariablen berechnen, als auch mit Arrays von Zufallsvariablen arbeiten.

 

Beispiel:

//+------------------------------------------------------------------+
//|                                    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"
//--- fügen wir Funktionen für die Berechnung der Normalverteilung hinzu
#include <Math\Stat\Normal.mqh>
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//--- setzen wir Parameter der Normalverteilung
   double mu=5.0;
   double sigma=1.0;
   PrintFormat("Normalverteilung mit den Parametern mu=%G und sigma=%G, Beispiele der Berechnung:",mu,sigma);
//--- Interval setzen
   double x1=mu-sigma;
   double x2=mu+sigma;
//--- Variablen für die Berechnung der Wahrscheinlichkeit
   double cdf1,cdf2,probability;
//--- Variablen für den Fehlercode
   int error_code1,error_code2;
//--- berechnen wir den Wert der Funktion der Verteilung
   cdf1=MathCumulativeDistributionNormal(x1,mu,sigma,error_code1);
   cdf2=MathCumulativeDistributionNormal(x2,mu,sigma,error_code2);
//--- überprüfen wir den Fehlercode
   if(error_code1==ERR_OK && error_code2==ERR_OK)
     {
      //--- berechnen wir die Wahrscheinlichkeit der Zufallsvariablen im angebebenen Bereich
      probability=cdf2-cdf1;
      //--- Ergebnis ausgeben
      PrintFormat("1. Die Wahrscheinlichkeit des Auftretens der Zufallszahl im Bereich %.5f<x<%.5f berechnen",x1,x2);
      PrintFormat("  Antwort: Probability = %5.8f",probability);
     }
 
//--- Finden wir den Wertebereich der Zufallsvariablen x, der mit dem Konfidenzintervall von 95% übereinstimmt
   probability=0.95; //  setzen wir das Konfidentzintervall
//--- setzen wir Wahrscheinlichkeiten an den Grenzen des Intervalls
   double p1=(1.0-probability)*0.5;
   double p2=probability+(1.0-probability)*0.5;
//--- berechnen wir die Grenzen des Berecihs
   x1=MathQuantileNormal(p1,mu,sigma,error_code1);
   x2=MathQuantileNormal(p2,mu,sigma,error_code2);
//--- überprüfen wir den Fehlercode
   if(error_code1==ERR_OK && error_code2==ERR_OK)
     {
      //--- geben wir das Ergebnis aus 
      PrintFormat("2. Für das Konfidenzintervall = %.2f den Wertebereich der Zufallsvariablen finden",probability);
      PrintFormat("  Anwort: Wertebereich  %5.8f <= x <=%5.8f",x1,x2);
     }
 
   PrintFormat("3. Berechnete und theoretische 4 Momente der Verteilung berechnen");
//--- Generieren wir das Array der Zufallsvariablen, berechnen wir die ersten 4 Momente und vergleichen wir diese mit den theoretischen Werten
   int data_count=1000000;  // setzen wir die Anzahl der Werte und bereiten ein Array vor
   double data[];
   ArrayResize(data,data_count);
//--- erzeugen wir Zufallszahlen und speichern diese im Array
   for(int i=0; i<data_count; i++)
     {
      data[i]=MathRandomNormal(mu,sigma,error_code1);
     }
//--- setzen wir den Index des Anfangswertes und die Anzahl der Daten für die Berechnung
   int start=0;
   int count=data_count;
//--- berechnen wir die ersten 4 Momente der erzeugten Werte
   double mean=MathMean(data,start,count);
   double variance=MathVariance(data,start,count);
   double skewness=MathSkewness(data,start,count);
   double kurtosis=MathKurtosis(data,start,count);
//--- Variablen für theoretische Momente
   double normal_mean=0;
   double normal_variance=0;
   double normal_skewness=0;
   double normal_kurtosis=0;
//--- geben wir die Werte der berechneten Momente aus
   PrintFormat("            Mean           Variance          Skewness           Kurtosis");
   PrintFormat("Calculated  %.10f   %.10f      %.10f      %.10f",mean,variance,skewness,kurtosis);
//--- berechnen wir theoretische Werte der Momente und vergleichen diese mit den erhaltenen
   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);
     }
  }