统计

Statistical Library는 기초통계분포를 편리하게 작업할 수 있는 방법을 제공합니다.

라이브러리는 각 분포에 대해 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>
//+------------------------------------------------------------------+
//| 스크립트 프로그램 시작 함                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//--- 정규 분포의 매개변수를 설정
   double mu=5.0;
   double sigma=1.0;
   PrintFormat("Normal distribution with parameters mu=%G and sigma=%G, calculation examples:",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. Calculate probability of a random variable within the range of %.5f<x<%.5f",x1,x2);
      PrintFormat("  Answer: Probability = %5.8f",probability);
     }
 
//--- 95% 신뢰 수준에 해당하는 랜덤 변수 x의 값 범위 찾기
   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. For confidence interval = %.2f, find the range of random variable",probability);
      PrintFormat("  Answer: range is  %5.8f <= x <=%5.8f",x1,x2);
     }
 
   PrintFormat("3. Compute the first 4 calculated and theoretical moments of the distribution");
//--- 난수 배열을 생성하여 처음 네 모멘트를 계산하고 이론적 값과 비교 
   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;
//--- 생성된 값의 처음 네 모멘트를 계산
   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);
     }
  }