最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

量化交易軟件:未知概率密度函數(shù)的核密度估計(jì)

2023-07-28 15:41 作者:bili_45793681098  | 我要投稿

簡介

隨著 MQL5 的性能改善及計(jì)算機(jī)效率的穩(wěn)步提升,赫茲量化平臺用戶能夠?qū)⑾喈?dāng)復(fù)雜和高深的數(shù)學(xué)方法用于市場分析中。這些方法可能來自經(jīng)濟(jì)學(xué)、計(jì)量經(jīng)濟(jì)學(xué)和統(tǒng)計(jì)學(xué)在內(nèi)的多個領(lǐng)域,但是在任何情形下,赫茲量化使用這些方法都無法繞開概率密度函數(shù)的理念。

很多常用的分析方法基于所用模型中數(shù)據(jù)分布正態(tài)性或錯誤正態(tài)性的假設(shè)而開發(fā)。此外,赫茲量化通常有必要知道所用模型中各部分的分布,以評估分析結(jié)果。在兩種情形下我們都有一個任務(wù),即創(chuàng)建一種“工具”(在理想情況下可通用)以估計(jì)未知概率密度函數(shù)。

本文試圖創(chuàng)建一個類,以或多或少實(shí)現(xiàn)用于估計(jì)未知概率密度函數(shù)的通用算法。最初的構(gòu)想是在估計(jì)過程中不使用外部方法,即僅通過 MQL5 實(shí)現(xiàn)所有一切。但最終,最初的構(gòu)想在一定程度上發(fā)生了變化。很明顯,概率密度函數(shù)的目測估計(jì)任務(wù)由兩個獨(dú)立的部分組成。

即,估計(jì)本身的計(jì)算及其可視化(以圖表或示意圖顯示)。計(jì)算自然已經(jīng)通過 MQL5 實(shí)現(xiàn),而可視化必須通過創(chuàng)建 HTML 頁面實(shí)施和在網(wǎng)頁瀏覽器中顯示。該解決方案用于最終獲得矢量形式的圖形。

但由于計(jì)算部分和結(jié)果顯示的分別實(shí)現(xiàn),讀者自然可使用其他任何可用的可視化方法。此外,赫茲量化希望各種庫,包括圖形庫,將出現(xiàn)在赫茲量化 中(據(jù)我們所知,此項(xiàng)工作正在進(jìn)行中)。變更建議解決方案的顯示部分并不困難,因?yàn)楹掌澚炕峁┝藰?gòu)建圖形和示意圖的進(jìn)階方法。

應(yīng)初步指出的是,創(chuàng)建真正的通用算法用于估計(jì)序列概率密度函數(shù)經(jīng)證明是一個無法實(shí)現(xiàn)的目標(biāo)。盡管建議解決方案的專門化程度不高,但也不能稱為是完全通用的。問題是,密度估計(jì)過程中的優(yōu)化準(zhǔn)則大相庭徑,例如對于鐘形分布,有正態(tài)分布和指數(shù)分布。

因此,如果有關(guān)于估計(jì)分布的一些初步信息,赫茲量化總是能夠?yàn)槊糠N特定情形選擇最合適的解決方案。但是,盡管如此,我們將假設(shè)我們對估計(jì)密度的本質(zhì)一無所知。這種方法無疑會影響估計(jì)的質(zhì)量,但我們希望它能夠?qū)Σ町愝^大的密度提供估計(jì)的可能。

由于在市場數(shù)據(jù)分析的過程中我們經(jīng)常要處理非平穩(wěn)序列,赫茲量化最感興趣的是較短和中等序列密度的估計(jì)。這是決定所使用估計(jì)方法的選取的關(guān)鍵時刻。

直方圖和 P 樣條曲線可成功用于包含超過一百萬個值的長序列。但是,當(dāng)我們嘗試為包含 10 至 20 個值的序列有效地構(gòu)建直方圖時,出現(xiàn)了一些問題。因此,我們將重點(diǎn)放在包含約 10 到 10 000 個值的序列上。


1. 概率密度函數(shù)估計(jì)方法

目前已知有大量的受歡迎程度不一的概率密度函數(shù)估計(jì)方法。這些方法在互聯(lián)網(wǎng)上可以很容易地搜索到,例如,通過使用諸如“概率密度估計(jì)”、“概率密度”、“密度估計(jì)”等關(guān)鍵詞。但遺憾的是,我們沒有在其中找到最佳的方法。這些方法都各有利弊。

直方圖在傳統(tǒng)上應(yīng)用于密度估計(jì) [1]。使用直方圖(包括平滑直方圖)可以提供高質(zhì)量的概率密度估計(jì),但這僅僅是針對長序列的處理情形。正如之前提到的,赫茲量化無法將一個短序列劃分為數(shù)量龐大的組,而由 2 到 3 個柱組成的直方圖無法說明這個序列的概率密度分布規(guī)律。因此,我們不得不放棄使用直方圖。

另一個非常有名的估計(jì)方法是核密度估計(jì) [2]。使用核平滑的理念在 [3] 中得到了很好的展現(xiàn)。因此,赫茲量化選擇了該方法,盡管它有這樣那樣的弊端。與此方法的實(shí)現(xiàn)相關(guān)的一些方面將在下文中簡單討論。

還有必要提及一個非常有趣的密度估計(jì)方法,該方法使用“期望最大化”算法 [4]。這個算法允許將序列劃分為具有比如正態(tài)分布規(guī)律的單獨(dú)部分。在確定單獨(dú)部分的參數(shù)后,有可能通過對得到的分布曲線進(jìn)行求和而獲得密度估計(jì)。此方法在 [5] 中進(jìn)行了說明。本文未涉及此方法以及其他許多方法的實(shí)現(xiàn)和檢驗(yàn)。在實(shí)踐中,赫茲量化無法對各種材料包含的大量密度估計(jì)方法一一進(jìn)行檢驗(yàn)。

我們繼續(xù)討論選定實(shí)現(xiàn)的核密度估計(jì)方法。


2. 概率密度函數(shù)的核密度估計(jì)

概率密度函數(shù)的核密度估計(jì)基于核平滑方法。該方法的原理可在 [6]、[7] 中找到。

核平滑的基本理念相當(dāng)簡單。赫茲量化用戶已熟悉移動平均線 (MA) 指標(biāo)。該指標(biāo)可以很容易地描繪成沿序列滑動的窗口,其加權(quán)值在窗口內(nèi)被平滑。窗口可以是矩形、指數(shù)或具有其他形狀。在核平滑過程中,赫茲量化可以很容易地看到同樣的滑動窗口(例如,[3])。但在這種情況下它是對稱的。

核平滑中最常用窗口的示例可在 [8] 中找到。如果核平滑中使用了零階回歸,到達(dá)窗口(核)的序列加權(quán)值便被平滑,就像 MA 中一樣。在我們處理濾波問題時,我們可以看到相同種類的窗口函數(shù)應(yīng)用程序。但現(xiàn)在,同一過程的表示有了一點(diǎn)不同。當(dāng)核(窗口)調(diào)用濾波器脈沖特性時,幅頻特性和相頻特性被使用。

這些例子表明,一個事物往往可以有不同的表現(xiàn)方式。自然 ,這對數(shù)學(xué)工具有所裨益。但在討論此類問題時也可能會導(dǎo)致混淆。

盡管核密度估計(jì)與前面提到的核平滑采用相同的原則,其算法稍有不同。

接下來我們看看定義密度估計(jì)的表達(dá)式。



其中

  • x - 長度為 n 的序列;

  • K - 對稱核;

  • h - 平滑參數(shù)范圍。

在接下來的密度估計(jì)中,我們僅使用高斯核:



根據(jù)上述表達(dá)式,點(diǎn) X 的密度通過對點(diǎn) X 和序列之間的差值定義的數(shù)量的核值求和計(jì)算得出。此外,用于密度計(jì)算的 X 點(diǎn)可能與序列本身的值不一致。

下面是實(shí)現(xiàn)核密度估計(jì)算法的基本步驟。

  1. 估計(jì)平均值和輸入序列標(biāo)準(zhǔn)偏差。

  2. 正態(tài)化輸入序列。從它的每個值中減去先前獲得的平均值,再除以標(biāo)準(zhǔn)偏差值。在經(jīng)過這樣的正態(tài)化后,原始序列將具有 0 平均值和等于 1 的標(biāo)準(zhǔn)偏差。這種正態(tài)化不是計(jì)算密度所必需的,但它可以使結(jié)果圖表一致,因?yàn)榫?X 刻度上的任何序列而言,都是用標(biāo)準(zhǔn)偏差單位來表示的值。

  3. 找出正態(tài)化序列的最大值和最小值。

  4. 創(chuàng)建 2 個數(shù)組,數(shù)組的大小要和在所得圖表上顯示的預(yù)計(jì)點(diǎn)數(shù)相對應(yīng)。例如,如果圖表使用 200 個點(diǎn)構(gòu)建,則每個數(shù)組必須相應(yīng)地包含 200 個值。

  5. 保留一個創(chuàng)建的數(shù)組用于存儲結(jié)果。另一個數(shù)組用于形成為其執(zhí)行密度估計(jì)的點(diǎn)的值。為此,赫茲量化必須在之前準(zhǔn)備的最大值和最小值之間形成 200(在本例中)個等距的值,并將它們保存在準(zhǔn)備好的數(shù)組中。

  6. 使用上文提到的表達(dá)式,我們應(yīng)在 200 個(在本例中)檢驗(yàn)點(diǎn)中執(zhí)行密度估計(jì),將結(jié)果保存在步驟 4 準(zhǔn)備的數(shù)組中。

下面是這個算法的軟件實(shí)現(xiàn)。

//+------------------------------------------------------------------+ //| ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?CDens.mqh | //| ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?2012, victorg | //| ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "2012, victorg" #property link ? ? ?"https://www.mql5.com" #include <Object.mqh> //+------------------------------------------------------------------+ //| Class Kernel Density Estimation ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?| //+------------------------------------------------------------------+ class CDens:public CObject ?{ public: ? double ? ? ? ? ? ?X[]; ? ? ? ? ? ? ?// Data ? int ? ? ? ? ? ? ? N; ? ? ? ? ? ? ? ?// Input data length (N >= 8) ? double ? ? ? ? ? ?T[]; ? ? ? ? ? ? ?// Test points for pdf estimating ? double ? ? ? ? ? ?Y[]; ? ? ? ? ? ? ?// Estimated density (pdf) ? int ? ? ? ? ? ? ? Np; ? ? ? ? ? ? ? // Number of test points (Npoint>=10, default 200) ? double ? ? ? ? ? ?Mean; ? ? ? ? ? ? // Mean (average) ? double ? ? ? ? ? ?Var; ? ? ? ? ? ? ?// Variance ? double ? ? ? ? ? ?StDev; ? ? ? ? ? ?// Standard deviation ? double ? ? ? ? ? ?H; ? ? ? ? ? ? ? ?// Bandwidth public: ? void ? ? ? ? ? ? ?CDens(void); ? int ? ? ? ? ? ? ? Density(double &x[],double hh); ? void ? ? ? ? ? ? ?NTpoints(int n); private: ? void ? ? ? ? ? ? ?kdens(double h); ?}; //+------------------------------------------------------------------+ //| Constructor ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?| //+------------------------------------------------------------------+ void CDens::CDens(void) ?{ ? NTpoints(200); ? ? ? ? ? ?// Default number of test points ?} //+------------------------------------------------------------------+ //| Setting number of test points ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?| //+------------------------------------------------------------------+ void CDens::NTpoints(int n) ?{ ? if(n<10)n=10; ? Np=n; ? ? ? ? ? ? ? ? ? ?// Number of test points ? ArrayResize(T,Np); ? ? ? ?// Array for test points ? ArrayResize(Y,Np); ? ? ? ?// Array for result (pdf) ?} //+------------------------------------------------------------------+ //| Density ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?| //+------------------------------------------------------------------+ int CDens::Density(double &x[],double hh) ?{ ? int i; ? double a,b,min,max,h; ? N=ArraySize(x); ? ? ? ? ? ? ? ? ? ? ? ? ? // Input data length ? if(N<8) ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?// If N is too small ? ? { ? ? ?Print(__FUNCTION__+": Error! Not enough data length!"); ? ? ?return(-1); ? ? } ? ArrayResize(X,N); ? ? ? ? ? ? ? ? ? ? ? ? // Array for input data ? ArrayCopy(X,x); ? ? ? ? ? ? ? ? ? ? ? ? ? // Copy input data ? ArraySort(X); ? Mean=0; ? for(i=0;i<N;i++)Mean=Mean+(X[i]-Mean)/(i+1.0); // Mean (average) ? Var=0; ? for(i=0;i<N;i++) ? ? { ? ? ?a=X[i]-Mean; ? ? ?X[i]=a; ? ? ?Var+=a*a; ? ? } ? Var/=N; ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?// Variance ? if(Var<1.e-250) ? ? ? ? ? ? ? ? ? ? ? ? ? // Variance is too small ? ? { ? ? ?Print(__FUNCTION__+": Error! The variance is too small or zero!"); ? ? ?return(-1); ? ? } ? StDev=MathSqrt(Var); ? ? ? ? ? ? ? ? ? ? ?// Standard deviation ? for(i=0;i<N;i++)X[i]=X[i]/StDev; ? ? ? ? ?// Data normalization (mean=0,stdev=1) ? min=X[ArrayMinimum(X)]; ? max=X[ArrayMaximum(X)]; ? b=(max-min)/(Np-1.0); ? for(i=0;i<Np;i++)T[i]=min+b*(double)i; ? ?// Create test points //-------------------------------- Bandwidth selection ? h=hh; ? if(h<0.001)h=0.001; ? H=h; //-------------------------------- Density estimation ? kdens(h); ? return(0); ?} //+------------------------------------------------------------------+ //| Gaussian kernel density estimation ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? | //+------------------------------------------------------------------+ void CDens::kdens(double h) ?{ ? int i,j; ? double a,b,c; ? c=MathSqrt(M_PI+M_PI)*N*h; ? for(i=0;i<Np;i++) ? ? { ? ? ?a=0; ? ? ?for(j=0;j<N;j++) ? ? ? ?{ ? ? ? ? b=(T[i]-X[j])/h; ? ? ? ? a+=MathExp(-b*b*0.5); ? ? ? ?} ? ? ?Y[i]=a/c; ? ? ? ? ? ? ? ? // pdf ? ? } ?} //--------------------------------------------------------------------

NTpoints() 方法允許設(shè)置所需的等距檢驗(yàn)點(diǎn)數(shù),將為這些點(diǎn)執(zhí)行密度估計(jì)。此方法必須在調(diào)用 Density() 方法之前調(diào)用。當(dāng)調(diào)用 Density() 方法時,指向包含輸入數(shù)據(jù)和范圍值(平滑參數(shù))的數(shù)組的鏈接作為該方法的參數(shù)傳遞至該方法。


量化交易軟件:未知概率密度函數(shù)的核密度估計(jì)的評論 (共 條)

分享到微博請遵守國家法律
江达县| 沛县| 兰西县| 武穴市| 普宁市| 合江县| 通河县| 丰台区| 西乡县| 白朗县| 图们市| 通榆县| 营口市| 舟曲县| 柏乡县| 于田县| 封丘县| 民丰县| 平利县| 盖州市| 开原市| 米易县| 永安市| 云浮市| 宾阳县| 玉屏| 诸城市| 云霄县| 泰州市| 台中县| 东源县| 晋中市| 喀喇| 平江县| 额济纳旗| 玛沁县| 台州市| 久治县| 牡丹江市| 太仓市| 鄂尔多斯市|