国产精品天干天干,亚洲毛片在线,日韩gay小鲜肉啪啪18禁,女同Gay自慰喷水

歡迎光臨散文網 會員登陸 & 注冊

股票量化交易軟件-期貨量化交易:利用卡爾曼 (Kalman) 濾波器預測價格方向

2023-07-10 13:52 作者:bili_58743380139  | 我要投稿

導言

貨幣和股票價格的圖表總是包含價格波動, 其頻率和幅度有所不同。我們的任務是判斷基于這些短期和長期走勢的主要趨勢。一些交易者在圖表上繪制趨勢線, 而另一些人則使用指標。在這兩種情況下, 我們的目的是將真正的價格走勢從受到次要因素影響而導致的噪音中分離出來, 因為噪音只會產生短期效果。在本文中, 赫茲量化交易軟件提議利用卡爾曼濾波器將主要走勢與市場噪音分開。

在交易中使用數(shù)字濾波器的思路并不鮮見。例如, 我曾 描述過 運用低通濾波器。但追求完美是無止境的, 所以我們再考察一個策略, 比較一下結果。

1. 卡爾曼濾波器原理

那么, 什么是卡爾曼濾波器, 為什么我們感興趣呢?以下過濾器定義來自 維基百科 :

卡爾曼濾波器 是一種使用一系列隨時間觀測到的測量值的算法, 包含統(tǒng)計噪聲和其它不準確性。

這意味著該濾波器最初是為處理噪聲數(shù)據而設計的。還有, 它能夠處理不完整的數(shù)據。另一個優(yōu)點, 它是為動態(tài)系統(tǒng)設計并應用的; 我們的價格圖表恰好屬于這樣的系統(tǒng)。

濾波器算法的工作在兩個步驟中處理:

  1. 外推 (預測)

  2. 更新 (校正)

1.1. 外推, 系統(tǒng)數(shù)值的預測

濾波器操作算法的第一階段是利用已分析過程的基礎模型。在此模型基礎上, 形成單步前瞻預測。

編輯

(1.1)

其中:

  • xk 是動態(tài)系統(tǒng)在第 k 步的外推值,

  • Fk 是狀態(tài)轉換模型, 展體現(xiàn)當前系統(tǒng)狀態(tài)對先前狀態(tài)的依賴性,

  • x^k-1 是系統(tǒng)的前一個狀態(tài) (前一步中的濾波值),

  • Bk 是控制輸入模型, 展現(xiàn)控制對系統(tǒng)的影響,

  • uk 是系統(tǒng)上的控制向量。

例如, 控制效果可以是新聞因素。不過, 實際當中效果是未知的, 且被忽略, 而其影響是指噪聲。

之后預測系統(tǒng)的協(xié)方差誤差:

編輯

(1.2)

其中:

  • Pk 是動態(tài)系統(tǒng)狀態(tài)向量的外推協(xié)方差矩陣,

  • Fk 是狀態(tài)轉換模型, 展體現(xiàn)當前系統(tǒng)狀態(tài)對先前狀態(tài)的依賴性,

  • P^k-1 是狀態(tài)向量的協(xié)方差矩陣在前一步的更新,

  • Qk 是過程的協(xié)方差噪聲矩陣。

1.2. 系統(tǒng)值的更新

濾波器算法的第二步從測量實際系統(tǒng)的狀態(tài) zk 開始。考慮到真實系統(tǒng)狀態(tài)和測量誤差, 指定系統(tǒng)狀態(tài)的實際測量值。在赫茲量化交易軟件的案例中, 測量誤差是噪聲對動態(tài)系統(tǒng)的影響。

此刻, 我們已有兩個不同的數(shù)值代表單個動態(tài)過程的狀態(tài)。它們包括第一步計算的動態(tài)系統(tǒng)外推值, 和實際的測量值。這些具有一定的幾率度的數(shù)值, 當中的每一個均表征我們過程的真實狀態(tài), 因此, 該值介于這兩個值之間。因此, 我們的目標是確定信任度, 即此值或彼值的信任程度。為此目的, 執(zhí)行卡爾曼濾波器第二階段的迭代。

利用已有數(shù)據, 我們判斷實際系統(tǒng)狀態(tài)自外推值的偏差。

編輯

(2.1)

此處:

  • yk 是外推之后系統(tǒng)實際狀態(tài)在第 k 步的偏差,

  • zk 是第 k 步中系統(tǒng)的實際狀態(tài),

  • Hk 是顯示實際系統(tǒng)狀態(tài)對于所計算數(shù)據依賴性的測量矩陣 (在實際中經常取值一),

  • xk 是動態(tài)系統(tǒng)在第 k 步的外推值。

在下一步中, 計算誤差向量的協(xié)方差矩陣:

編輯

(2.2)

此處:

  • Sk 是在第 k 步的誤差矢量的協(xié)方差矩陣,

  • Hk 是顯示實際系統(tǒng)狀態(tài)對于計算數(shù)據依賴性的測量矩陣,

  • Pk 是動態(tài)系統(tǒng)狀態(tài)向量的外推協(xié)方差矩陣,

  • Rk 是測量噪聲的協(xié)方差矩陣。

然后檢測優(yōu)化增益。增益反映了計算值和經驗值的置信度。

?(2.3)

此處:

  • Kk 是卡爾曼增益值的矩陣,

  • Pk 是動態(tài)系統(tǒng)狀態(tài)向量的外推協(xié)方差矩陣,

  • Hk 是顯示實際系統(tǒng)狀態(tài)對于計算數(shù)據依賴性的測量矩陣,

  • Sk 是在第 k 步的誤差矢量的協(xié)方差矩陣。

現(xiàn)在, 我們使用卡爾曼增益來更新系統(tǒng)狀態(tài)值和狀態(tài)向量的協(xié)方差矩陣估值。


編輯

(2.4)

其中:

  • x^k 和 x^k-1 在在第 k 和 k-1 步的更新值,

  • Kk 是卡爾曼增益值的矩陣,

  • yk 是外推后在第 k 步的系統(tǒng)實際狀態(tài)的偏差。


編輯

(2.5)

其中:

  • P^k 是更新后的動態(tài)系統(tǒng)狀態(tài)向量的協(xié)方差矩陣,

  • I 是標識符矩陣,

  • Kk 是卡爾曼增益值的矩陣,

  • Hk 是顯示實際系統(tǒng)狀態(tài)對于計算數(shù)據依賴性的測量矩陣,

  • Pk 是外推的動態(tài)系統(tǒng)狀態(tài)向量的協(xié)方差矩陣。

以上所有可以概括為以下規(guī)劃


編輯


2. 卡爾曼濾波器的實現(xiàn)

現(xiàn)在, 我們已知曉了卡爾曼濾波器的工作原理。我們進入到實際實現(xiàn)。以上濾波器公式的矩陣形式允許接收若干個來源的數(shù)據。我建議在柱線收盤價基礎上構建一個濾波器, 并將矩陣形式簡化為離散的。

2.1. 輸入數(shù)據初始化

在開始編寫代碼之前, 赫茲量化交易軟件先定義輸入數(shù)據。

如上所述, 卡爾曼濾波器的基礎是一個動態(tài)過程模型, 用于預測過程的下一個狀態(tài)。該濾波器最初旨在協(xié)同線性系統(tǒng)一起使用的, 其當前狀態(tài)可輕易地通過前一狀態(tài)乘以一個系數(shù)來定義。我們的情況有很更困難: 赫茲量化交易軟件的動態(tài)系統(tǒng)是非線性的, 且比率在每一步都有變化。更甚的是, 我們不清楚該系統(tǒng)相鄰狀態(tài)之間的關系。這個任務似乎難以解決。這是一個棘手的解決方案: 我們將利用在這幾篇文章中 [1],[2],[3] 描述的自回歸模型。

我們開始吧。首先, 我們在這個類中聲明 CKalman 類和所需的變量

class CKalman ?{ private: //--- ? uint ? ? ? ? ? ? ?ci_HistoryBars; ? ? ? ? ? ? ? //用于分析的柱線數(shù)量 ? uint ? ? ? ? ? ? ?ci_Shift; ? ? ? ? ? ? ? ? ? ? //計算自回歸的偏移 ? string ? ? ? ? ? ?cs_Symbol; ? ? ? ? ? ? ? ? ? ?//品名 ? ENUM_TIMEFRAMES ? ce_Timeframe; ? ? ? ? ? ? ? ? //時間幀 ? double ? ? ? ? ? ?cda_AR[]; ? ? ? ? ? ? ? ? ? ? //自回歸系數(shù) ? int ? ? ? ? ? ? ? ci_IP; ? ? ? ? ? ? ? ? ? ? ? ?//自回歸系數(shù)的數(shù)量 ? datetime ? ? ? ? ?cdt_LastCalculated; ? ? ? ? ? //最后計算時間; ? ? bool ? ? ? ? ? ? ?cb_AR_Flag; ? ? ? ? ? ? ? ? ? //自回歸計算的標志 //--- 卡爾曼濾波器的數(shù)值 ? double ? ? ? ? ? ?cd_X; ? ? ? ? ? ? ? ? ? ? ? ? // X ? double ? ? ? ? ? ?cda_F[]; ? ? ? ? ? ? ? ? ? ? ?// F 數(shù)組 ? double ? ? ? ? ? ?cd_P; ? ? ? ? ? ? ? ? ? ? ? ? // P ? double ? ? ? ? ? ?cd_Q; ? ? ? ? ? ? ? ? ? ? ? ? // Q ? double ? ? ? ? ? ?cd_y; ? ? ? ? ? ? ? ? ? ? ? ? // y ? double ? ? ? ? ? ?cd_S; ? ? ? ? ? ? ? ? ? ? ? ? // S ? double ? ? ? ? ? ?cd_R; ? ? ? ? ? ? ? ? ? ? ? ? // R ? double ? ? ? ? ? ?cd_K; ? ? ? ? ? ? ? ? ? ? ? ? // K ? public: ? ? ? ? ? ? ? ? ? ? CKalman(uint bars=6240, uint shift=0, string symbol=NULL, ENUM_TIMEFRAMES period=PERIOD_H1); ? ? ? ? ? ? ? ? ? ?~CKalman(); ? void ? ? ? ? ? ? ?Clear_AR_Flag(void) ?{ ?cb_AR_Flag=false; } ?};

我們在類的初始化函數(shù)中為變量分配初值。

CKalman::CKalman(uint bars, uint shift, string symbol, ENUM_TIMEFRAMES period) ?{ ? ci_HistoryBars = ?bars; ? cs_Symbol ? ? ?= ?(symbol==NULL ? _Symbol : symbol); ? ce_Timeframe ? = ?period; ? cb_AR_Flag ? ? = ?false; ? ci_Shift ? ? ? = ?shift; ? cd_P ? ? ? ? ? = ?1; ? cd_K ? ? ? ? ? = ?0.9; ?}

我使用了來自文章 [1] 的算法創(chuàng)建一個自回歸模型。為此目的, 需要在類中添加兩個私有函數(shù)。

? bool ? ? ? ? ? ? ?Autoregression(void); ? bool ? ? ? ? ? ? ?LevinsonRecursion(const double &R[],double &A[],double &K[]);

LevinsonRecursion 函數(shù)按原樣使用。Autoregression 函數(shù)有略微修改, 所以我們來仔細考察這個函數(shù)。在函數(shù)伊始, 我們檢查分析所需的歷史數(shù)據的可用性。如果沒有足夠的歷史數(shù)據, 則返回 false。

bool CKalman::Autoregression(void) ?{ ? //--- 檢查數(shù)據不足 ? if(Bars(cs_Symbol,ce_Timeframe)<(int)ci_HistoryBars) ? ? ?return false;

現(xiàn)在, 我們加載所需的歷史數(shù)據并填充實際狀態(tài)轉移模型系數(shù)的數(shù)組。

//--- ? double ? cda_QuotesCenter[]; ? ? ? ? ? ? ? ? ? ? ? ? ?//計算的數(shù)據 //--- 令所有價格可用 ? double close[]; ? int NumTS=CopyClose(cs_Symbol,ce_Timeframe,ci_Shift+1,ci_HistoryBars+1,close)-1; ? if(NumTS<=0) ? ? ?return false; ? ArraySetAsSeries(close,true); ? if(ArraySize(cda_QuotesCenter)!=NumTS) ? ? { ? ? ?if(ArrayResize(cda_QuotesCenter,NumTS)<NumTS) ? ? ? ? return false; ? ? } ? for(int i=0;i<NumTS;i++) ? ? ?cda_QuotesCenter[i]=close[i]/close[i+1]; ? ? ? ? ? // 計算系數(shù)

在準備操作之后, 我們檢測自回歸模型的系數(shù)個數(shù), 并計算它們的值。

? ci_IP=(int)MathRound(50*MathLog10(NumTS)); ? if(ci_IP>NumTS*0.7) ? ? ?ci_IP=(int)MathRound(NumTS*0.7); ? ? ? ? ? ? ? ? ? ? ? ? // 自回歸模型的順序 ? ? double cor[],tdat[]; ? if(ci_IP<=0 || ArrayResize(cor,ci_IP)<ci_IP || ArrayResize(cda_AR,ci_IP)<ci_IP || ArrayResize(tdat,ci_IP)<ci_IP) ? ? ?return false; ? double a=0; ? for(int i=0;i<NumTS;i++) ? ? ?a+=cda_QuotesCenter[i]*cda_QuotesCenter[i]; ? ? ? for(int i=1;i<=ci_IP;i++) ? ? { ? ? ? ?double c=0; ? ? ?for(int k=i;k<NumTS;k++) ? ? ? ? c+=cda_QuotesCenter[k]*cda_QuotesCenter[k-i]; ? ? ?cor[i-1]=c/a; ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?// 自回歸 ? ? } ? ? if(!LevinsonRecursion(cor,cda_AR,tdat)) ? ? ? ? ? ? ? ? ? ? // 萊文森-德賓 (Levinson-Durbin) 遞歸 ? ? ?return false;

現(xiàn)在我們將自回歸系數(shù)的總和降低到 "1", 并將計算執(zhí)行的標志設置為 'true'。

? double sum=0; ? for(int i=0;i<ci_IP;i++) ? ? { ? ? ?sum+=cda_AR[i]; ? ? } ? if(sum==0) ? ? ?return false; ? ? double k=1/sum; ? for(int i=0;i<ci_IP;i++) ? ? ?cda_AR[i]*=k; ? cb_AR_Flag=true;

接下來, 我們初始化濾波器所需的變量。為了計算噪聲協(xié)方差, 我們使用所在分析周期的 Close 值的偏差的均方根值。

? cd_R=MathStandardDeviation(close);

為了確定過程噪聲協(xié)方差的值, 赫茲量化交易軟件首先計算自回歸模型值的數(shù)組, 并找出模型值的均方根偏差。

? double auto_reg[]; ? ArrayResize(auto_reg,NumTS-ci_IP); ? for(int i=(NumTS-ci_IP)-2;i>=0;i--) ? ? { ? ? ?auto_reg[i]=0; ? ? ?for(int c=0;c<ci_IP;c++) ? ? ? ?{ ? ? ? ? auto_reg[i]+=cda_AR[c]*cda_QuotesCenter[i+c]; ? ? ? ?} ? ? } ? cd_Q=MathStandardDeviation(auto_reg);

然后, 我們將實際的狀態(tài)轉換系數(shù)復制到 cda_F 數(shù)組, 從其可以進一步使用它們來計算新的系數(shù)。

? ArrayFree(cda_F); ? if(ArrayResize(cda_F,(ci_IP+1))<=0) ? ? ?return false; ? ArrayCopy(cda_F,cda_QuotesCenter,0,NumTS-ci_IP,ci_IP+1);

對于我們系統(tǒng)的初始值, 我們使用的是最后 10 個值的算術平均值。

? cd_X=MathMean(close,0,10);

2.2. 價格走勢預測

在收到濾波器操作所需的所有初始數(shù)據之后, 我們可以繼續(xù)進行實際實現(xiàn)。卡爾曼濾波器操作的第一步是 單步前瞻系統(tǒng)狀態(tài)預測。我們創(chuàng)建一個 Forecast 公有函數(shù), 在其內我們會實現(xiàn)函數(shù) 1.1 和 1.2。

double ? ? ? ? ? ?Forecast(void);

在函數(shù)伊始, 我們檢查回歸模型是否已經被計算。應在必要時調用其計算函數(shù)。在模型重新計算出錯的情況下返回 EMPTY_VALUE,

double CKalman::Forecast() ?{ ? if(!cb_AR_Flag) ? ? { ? ? ?ArrayFree(cda_AR); ? ? ?if(Autoregression()) ? ? ? ?{ ? ? ? ? return EMPTY_VALUE; ? ? ? ?} ? ? }

之后, 赫茲量化交易軟件計算狀態(tài)轉換系數(shù)并將其保存到 cda_F 數(shù)組的 "0" 單元中, 隨后數(shù)值依次順移一個單元。

? Shift(cda_F); ? cda_F[0]=0; ? for(int i=0;i<ci_IP;i++) ? ? ?cda_F[0]+=cda_F[i+1]*cda_AR[i];

然后我們重新計算系統(tǒng)狀態(tài)和出錯概率。

? cd_X=cd_X*cda_F[0]; ? cd_P=MathPow(cda_F[0],2)*cd_P+cd_Q;

該函數(shù)在最后返回預測的系統(tǒng)狀態(tài)。在我們的情況中, 這是一根新柱線的預測收盤價。

? return cd_X; ?}

2.3. 校正系統(tǒng)狀態(tài)

在下一個階段, 在收到實際的柱線收盤價之后, 我們校正系統(tǒng)狀態(tài)。為此目的, 我們來創(chuàng)建 Correction 公有函數(shù)。在函數(shù)參數(shù)中, 我們將傳遞實際的系統(tǒng)狀態(tài)值, 即實際的柱線收盤價格。

double ? ? ? ? ? ?Correction(double z);

在該函數(shù)中實現(xiàn)了文章給出的 理論部分1.2。其完整代碼可在附件中找到。在操作結束時, 該函數(shù)返回系統(tǒng)狀態(tài)的更新 (校正) 值。

3. 卡爾曼濾波器的實際演示

我們來測試這個基于卡爾曼濾波器的類是如何工作的。我們創(chuàng)建一個基于這個類的指標。在新的蠟燭條開盤時, 指標調用系統(tǒng)更新函數(shù), 然后調用函數(shù)來預測當前柱線的收盤價。類函數(shù)的調用順序是相反的, 因為我們要為前一根收盤柱線調用更新 (校正) 函數(shù), 再來預測當前的新柱線, 而其收盤價尚未得知。

指標有兩個緩沖區(qū)。系統(tǒng)狀態(tài)的預測值將被添加到第一個緩沖區(qū)之中, 更新的數(shù)值將被添加到第二個緩沖區(qū)中。我有意使用兩個緩沖區(qū), 令指標不會重繪, 我們可以看到系統(tǒng)在第二個濾波器的操作階段是如何更新 (校正) 地。指標代碼很簡單, 可以在下面的附件中找到。這是指標操作的結果。


編輯切換為居中


圖表上顯示三條虛線:


  • 黑線顯示實際的柱線收盤價

  • 紅線顯示預測值

  • 藍線是由卡爾曼濾波器更新的系統(tǒng)狀態(tài)


如您所見, 兩條線都接近實際的收盤價, 且其顯示的翻轉點幾率優(yōu)良。請注意, 指標不會重繪, 并且在收盤價格尚不明了時, 紅線在柱線開盤時即已繪制。

此圖表顯示了此濾波器的一致性, 以及利用此濾波器創(chuàng)建交易系統(tǒng)的可行性。

股票量化交易軟件-期貨量化交易:利用卡爾曼 (Kalman) 濾波器預測價格方向的評論 (共 條)

分享到微博請遵守國家法律
天全县| 惠来县| 保定市| 涟水县| 太保市| 昆山市| 河南省| 磴口县| 黄平县| 临泉县| 城市| 含山县| 仁布县| 五寨县| 陆丰市| 岢岚县| 泌阳县| 永平县| 巨鹿县| 油尖旺区| 枝江市| 台中市| 安溪县| 来安县| 渝北区| 隆德县| 景洪市| 鄯善县| 阜新| 巨鹿县| 巴青县| 陵水| 宿州市| 交城县| 余庆县| 泸溪县| 永丰县| 南江县| 天祝| 鄂托克前旗| 德安县|