量化教育軟件策略:統(tǒng)計分布在交易者工作中的作用
簡介
本文是我的《用 MQL5 表示統(tǒng)計概率分布》一文的續(xù)篇,該文介紹了處理某些理論統(tǒng)計分布的類。我發(fā)現(xiàn),必須首先以分布類的形式打下基礎(chǔ)才能讓用戶更方便地在以后的實踐中運用它們。
現(xiàn)在,赫茲量化已經(jīng)有了理論基礎(chǔ),我建議我們應(yīng)直接進入實際數(shù)據(jù)集,并嘗試據(jù)此基礎(chǔ)獲得某些信息。同時,赫茲量化將闡明與數(shù)學(xué)統(tǒng)計有關(guān)的一些問題。

編輯
1. 指定分布下隨機數(shù)的生成
但是在考慮實際數(shù)據(jù)集之前,能夠獲得與需要的理論分布緊密相關(guān)的幾組值似乎非常重要。
換言之,用戶應(yīng)該只設(shè)置所需分布的參數(shù)和樣本大小。一個程序(在我們的例子中為類的層次結(jié)構(gòu))應(yīng)生成并輸出此類值樣本以供進一步處理。
另一個重要的細節(jié)是應(yīng)將按指定規(guī)律生成的樣本用于檢查各種統(tǒng)計測試。數(shù)學(xué)統(tǒng)計的領(lǐng)域 - 在不同分布規(guī)律下隨機變量的生成 - 是相當(dāng)有趣且充滿挑戰(zhàn)的。
對我而言,我使用《Numerical Recipes:The Art of Scientific Computing(數(shù)值算法:科學(xué)計算的藝術(shù))》一書 [2] 介紹的高質(zhì)量生成器。其期段約等于 3.138*1057。以很簡單的方式將 C 代碼傳遞到 MQL5 中。
因此,我創(chuàng)建了 Random 類,如下所示:
//+------------------------------------------------------------------+ //| ? ? ? ? ? ? ? ? ? ?Random class definition ? ? ? ? ? ? ? ? ? ? ? | //+------------------------------------------------------------------+ class Random ?{ private: ? ulong u, //unsigned 64-bit integers ? v, ? w; public: ? //+------------------------------------------------------------------+ ? //| The Random class constructor ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? | ? //+------------------------------------------------------------------+ ? void Random() ? ? { ? ? ?randomSet(184467440737095516); ? ? } ? //+------------------------------------------------------------------+ ? //| The Random class set-method ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?| ? //+------------------------------------------------------------------+ ? void randomSet(ulong j) ? ? { ? ? ?v=4101842887655102017; ? ? ?w=1; ? ? ?u=14757395258967641292; ? ? ?u=j^v; ? ? ?int64(); ? ? ?v = u; int64(); ? ? ?w = v; int64(); ? ? } ? //+------------------------------------------------------------------+ ? //| Return 64-bit random integer ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? | ? //+------------------------------------------------------------------+ ? ulong int64() ? ? { ? ? ?uint k=4294957665; ? ? ?u=u*2862933555777941757+7046029254386353087; ? ? ?v^= v>> 17; v ^= v<< 31; v ^= v>> 8; ? ? ?w = k*(w & 0xffffffff) +(w>> 32); ? ? ?ulong x=u^(u<<21); x^=x>>35; x^=x<<4; ? ? ?return(x+v)^w; ? ? }; ? //+------------------------------------------------------------------+ ? //| Return random double-precision value in the range 0. to 1. ? ? ? | ? //+------------------------------------------------------------------+ ? double doub() ? ? { ? ? ?return 5.42101086242752217e-20*int64(); ? ? } ? //+------------------------------------------------------------------+ ? //| Return 32-bit random integer ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? | ? //+------------------------------------------------------------------+ ? uint int32() ? ? { ? ? ?return(uint)int64(); ? ? } ?};
現(xiàn)在,赫茲量化可以為從一個分布取值的樣本創(chuàng)建類。
作為一個例子,讓我們看一看正態(tài)分布下的隨機變量。CNormaldev 類如下所示:
//+------------------------------------------------------------------+ //| ? ? ? ? ? ? ? ? ? ?CNormaldev class definition ? ? ? ? ? ? ? ? ? | //+------------------------------------------------------------------+ class CNormaldev : public Random ?{ public: ? CNormaldist ? ? ? N; //Normal Distribution instance ? //+------------------------------------------------------------------+ ? //| The CNormaldev class constructor ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? | ? //+------------------------------------------------------------------+ ? void CNormaldev() ? ? { ? ? ?CNormaldist Nn; ? ? ?setNormaldev(Nn,18446744073709); ? ? } ? //+------------------------------------------------------------------+ ? //| The CNormaldev class set-method ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?| ? //+------------------------------------------------------------------+ ? void setNormaldev(CNormaldist &Nn,ulong j) ? ? { ? ? ?N.mu=Nn.mu; ? ? ?N.sig=Nn.sig; ? ? ?randomSet(j); ? ? } ? //+------------------------------------------------------------------+ ? //| Return ?Normal deviate ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? | ? //+------------------------------------------------------------------+ ? double dev() ? ? { ? ? ?double u,v,x,y,q; ? ? ?do ? ? ? ?{ ? ? ? ? u = doub(); ? ? ? ? v = 1.7156*(doub()-0.5); ? ? ? ? x = u - 0.449871; ? ? ? ? y = fabs(v) + 0.386595; ? ? ? ? q = pow(x,2) + y*(0.19600*y-0.25472*x); ? ? ? ?} ? ? ?while(q>0.27597 ? ? ?&& (q>0.27846 || pow(v,2)>-4.*log(u)*pow(u,2))); ? ? ?return N.mu+N.sig*v/u; ? ? } ?}; //+------------------------------------------------------------------+
如您所見,類有一個數(shù)據(jù)成員 N,其類型為 CNormaldist。原來的 C 代碼缺少與分布的此類連接。對于此類(這里為 CNormaldev 類)生成的隨機變量而言,我認為與其分布之間存在一個有邏輯的編程式連接是必不可少的。
在最初的版本中,Normaldev 類型的定義如下:
typedef double Doub; typedef unsigned __int64 Ullong; struct Normaldev : Ran { Doub mu,sig; Normaldev(Doub mmu, Doub ssig, Ullong i) ... }
此處使用 Leva 的均勻比例法從正態(tài)分布生成隨機數(shù)。
幫助從各種分布計算隨機變量的所有其他類,都在包含 Random_class.mqh 文件中列出。
現(xiàn)在,赫茲量化將結(jié)束隨機數(shù)的生成,并在本文的實踐部分討論如何創(chuàng)建一個值數(shù)組以及測試一個樣本。
2. 分布參數(shù)的估計、統(tǒng)計假設(shè)
顯然我們將討論離散變量。然而在實踐中,如果離散變量的數(shù)量很多,則將此類離散變量的集合視為一組連續(xù)變量來考慮更加方便。這是數(shù)學(xué)統(tǒng)計中的一個標(biāo)準(zhǔn)方法。因此,要對它們進行分析,赫茲量化可以使用與連續(xù)變量有關(guān)的分析公式定義的分布。
那么,讓我們開始經(jīng)驗分布的分析。
假定一個一般群體分布樣本,其成員滿足所研究的代表性條件。此外,還滿足第 8.3 節(jié)指定的估值要求[9]??赏ㄟ^點估值和區(qū)間方法找出數(shù)值分布參數(shù)。
2.1 使用 CExpStatistics 類處理樣本
應(yīng)該首先從樣本中刪除所謂的異常值;異常值指顯著偏離樣本主要部分的觀察樣本(包括向上和向下偏離)。刪除異常值沒有萬能方法。
我建議使用在第 6.3 節(jié)中介紹的由 S.V. Bulashev 提出的方法 [5]。在 MQL4 論壇中已經(jīng)創(chuàng)建了一個由統(tǒng)計函數(shù)組成的庫,可以依據(jù)該庫輕松地解決該問題。這就是說,赫茲量化將肯定應(yīng)用 OOP 并對其稍微進行一些更新。
我將創(chuàng)建的統(tǒng)計特征的估值的類稱為 CExpStatistics(預(yù)期統(tǒng)計類)。
它大體如下所述:
//+------------------------------------------------------------------+ //| ? ? ? ? ? ? Expected Statistics class definition ? ? ? ? ? ? ? ? | //+------------------------------------------------------------------+ class CExpStatistics ?{ private: ? double ? ? ? ? ? ?arr[]; ? ? ?//initial array ? int ? ? ? ? ? ? ? N; ? ? ? ? ?//initial array size ? double ? ? ? ? ? ?Parr[]; ? ? //processed array ? int ? ? ? ? ? ? ? pN; ? ? ? ? //processed array size ? void ? ? ? ? ? ? ?stdz(double &outArr_st[],bool A); //standardization public: ? void ? ? ? ? ? ? ?setArrays(bool A,double &Arr[],int &n); //set array for processing ? bool ? ? ? ? ? ? ?isProcessed; ?//array processed? ? void ? ? ? ? ? ? ?CExpStatistics(){}; ?//constructor ? void ? ? ? ? ? ? ?setCExpStatistics(double &Arr[]); //set the initial array for the class ? void ? ? ? ? ? ? ?ZeroCheckArray(bool A); //check the input array for zero elements ? int ? ? ? ? ? ? ? get_arr_N(); ? ? ? ? ? //get the initial array length ? double ? ? ? ? ? ?median(bool A); ? ? ? ? //median ? double ? ? ? ? ? ?median50(bool A); //median of 50% interquantile range (midquartile range) ? double ? ? ? ? ? ?mean(bool A); ? ? //mean of the entire initial sample ? double ? ? ? ? ? ?mean50(bool A); ? //mean of 50% interquantile range ? double ? ? ? ? ? ?interqtlRange(bool A); //interquartile range ? double ? ? ? ? ? ?RangeCenter(bool A); //range center ? double ? ? ? ? ? ?meanCenter(bool A); ?//mean of the top five estimates ? double ? ? ? ? ? ?expVariance(bool A); //estimated variance ? double ? ? ? ? ? ?expSampleVariance(bool A); //shifted estimate of sample variance ? double ? ? ? ? ? ?expStddev(bool A); ? //estimated standard deviation ? double ? ? ? ? ? ?Moment(int index,bool A,int sw,double xm); //moment of distribution ? double ? ? ? ? ? ?expKurtosis(bool A,double &Skewness); ////estimated kurtosis and skewness ? double ? ? ? ? ? ?censorR(bool A); //censoring coefficient ? int ? ? ? ? ? ? ? outlierDelete(); //deletion of outliers from the sample ? int ? ? ? ? ? ? ? pArrOutput(double &outArr[],bool St); //processed array output ? void ? ? ? ? ? ? ?~CExpStatistics(){};//destructor ?}; //+------------------------------------------------------------------+
在包含 ExpStatistics_class.mqh 文件中可詳細討論各個方法的實施,因此在這里我不做詳細說明。
這個類做的重要事情是,它返回不含異常值的數(shù)組 (Parr[])(如果有的話)。此外,它有助于獲取采樣的某些描述性統(tǒng)計及其估值。
2.2 創(chuàng)建經(jīng)過處理的樣本直方圖
現(xiàn)在,數(shù)組已經(jīng)不含異常值,可以依據(jù)其數(shù)據(jù)繪制一個直方圖(頻率分布)。它幫助我們以可視方式估計隨機變量分布規(guī)律。有一個創(chuàng)建直方圖的分步過程。
應(yīng)該首先計算需要的類的數(shù)量。在此上下文中,術(shù)語“類”指分組、區(qū)間。按 Sturges 的公式計算類的數(shù)量:

編輯
其中,k 是類的數(shù)量,n 是觀察樣本的數(shù)量。
在 MQL5 中,該公式可表示為:
int Sturges(int n) /* ? Function for determining the number of class intervals using Sturges' rule. ? Variables: ? ? y is the number of sampling observations. ? Returned value: ? ? number of class intervals. */ { ? double s; ? ? ? ?// Returned value ? s=1.+log2(y); ? if(s>15) ? ? ? ? // Empirical rule ? ? ?s=15; ? return(int) floor(s); }
在使用 Sturges 的公式得到需要的類(區(qū)間)的數(shù)量時,是將數(shù)組數(shù)據(jù)分成類的時候了。此數(shù)據(jù)被稱為觀察樣本(英文為 observation)。我們將使用 Allocate 函數(shù)進行,如下所示:
void ?Allocate(double &data[],int n,double &f[],double &b[],int k) /* ?Function for allocating observations to classes. ?Variables: ? 1) data — initial sample (array) ? 2) n — sample size ? 3) f — calculated array of observations allocated to classes ? 4) b — array of class midpoints ? 5) k — number of classes */ ?{ ? int i,j; ? ? ? ? ? ? ? ? ? ? // Loop counter ? double t,c; ? ? ? ? ? ? ? ? ?// Auxiliary variable ? t=data[ArrayMinimum(data)]; // Sample minimum ? t=t>0 ? t*0.99 : t*1.01; ? c=data[ArrayMaximum(data)]; // Sample maximum ? c=c>0 ? c*1.01 : c*0.99; ? c=(c-t)/k/2; ? ? ? ? ? ? ? ?// Half of the class interval ? b[0]=t+c; ? ? ? ? ? ? ? ? ? // Array of class interval midpoints ? f[0]= 0; ? for(i=1; i<k; i++) ? ? { ? ? ?b[i] = b[i - 1] + c + c; ? ? ?f[i] = 0; ? ? } // Grouping ? for(i=0; i<n; i++) ? ? ?for(j=0; j<k; j++) ? ? ? ? if(data[i]>b[j]-c && data[i]<=b[j]+c) ? ? ? ? ? { ? ? ? ? ? ?f[j]++; ? ? ? ? ? ?break; ? ? ? ? ? } ?}
如您所見,函數(shù)采用初始觀察樣本數(shù)組 (data)、其長度 (n)、類的數(shù)量 (k),并將觀察樣本分配到數(shù)組 f 的某個 f[i] 類,其中 b[i] 是 f[i] 類的中點。現(xiàn)在,直方圖的數(shù)據(jù)準(zhǔn)備就緒。
赫茲量化將使用在以前提過的一文中介紹的工具顯示直方圖。為此,我編寫了 histogramSave 函數(shù),該函數(shù)將在 HTML 中顯示所研究的序列的直方圖。函數(shù)采用 2 個參數(shù):類數(shù)組 (f) 和類的中點數(shù)組 (b)。
作為一個例子,我使用 volatilityTest.mq5 腳本建立了EURUSD 貨幣對在四小時時間框架上 500 根柱的最大點和最小點之間的絕對差值直方圖。

編輯切換為居中
圖 1. 數(shù)據(jù)直方圖(EURUSD H4 的絕對波動)
如直方圖(圖 1)所示,第一類有 146 個觀察樣本,第二類有 176 個觀察樣本,等等。直方圖函數(shù)對所研究的樣本的經(jīng)驗分布提供了一個看得見的概念。

編輯切換為居中
圖 2. 數(shù)據(jù)直方圖(EURUSD H4 標(biāo)準(zhǔn)化返回)
另一直方圖(圖 2)顯示 EURUSD 貨幣對在 H4 時間框架上的 500 根柱的標(biāo)準(zhǔn)化對數(shù)返回。您會注意到,第四類和第五類給人的印象最深刻,因為它們分別有 244 個和 124 個觀察樣本。此直方圖是使用 returnsTest.mq5 腳本建立的。
因此,直方圖讓我們能夠選擇將進一步估計其參數(shù)的分布規(guī)律。在不能明顯看出供分布的情形中,您可以估算幾種理論分布的參數(shù)。
我們考慮的兩種分布在外觀上都不像正態(tài)分布,尤其是第一種分布。然而,讓我們不要相信圖形,繼續(xù)處理數(shù)字。