數(shù)據(jù)科學與機器學習11部分樸素貝葉斯交易中的概率論
概述
樸素貝葉斯分類器是一種概率算法,用于機器學習中的分類任務。 它基于貝葉斯定理,該定理根據(jù)給定證據(jù)計算假設的概率。 這種概率分類器在各種情況下都是一種簡單而有效的算法。 它假定進行分類的特征彼此獨立。 例如:如果您希望此模型在給定身高、腳大小、體重和肩長的情況下對人類(男性和女性)進行分類,則該模型將所有這些變量視為彼此獨立,在這種情況下,它甚至并不認可腳的大小和身高與人類有關。
由于這個模型不會費心去理解自變量之間的范式,我認為我們應該給它一個機會,嘗試用它來做出明智的交易決策。 我相信在交易領域,沒有人完全理解這些范式,所以,赫茲量化來看看樸素貝葉斯的表現(xiàn)如何。

編輯切換為居中
事不宜遲,赫茲量化調用模型實例并立即使用它。 稍后我們將討論這個模型是由什么組成的。

編輯切換為居中
準備訓練數(shù)據(jù)
對于此示例,我選擇了 5 個指標,其中大多數(shù)是振蕩器和交易量,因為我認為它們是很好的分類變量,而且它們具有有限數(shù)額,這令它們適合正態(tài)分布,這是該算法的核心思想之一,不過您不必受限于這些指標,如此請隨意探索您喜歡的各種指標和數(shù)據(jù)。
牛勢和熊勢
相對強弱指數(shù)
交易量
資金流動指數(shù)
最重要的先做:
matrix Matrix(TrainBars, 6); int handles[5]; double buffer[]; //+------------------------------------------------------------------+ //| Expert initialization function ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? | //+------------------------------------------------------------------+ int OnInit() ?{ //--- Preparing Data ? handles[0] = iBearsPower(Symbol(),TF, bears_period); ? handles[1] = iBullsPower(Symbol(),TF, bulls_period); ? handles[2] = iRSI(Symbol(),TF,rsi_period, rsi_price); ? handles[3] = iVolumes(Symbol(),TF,VOLUME_TICK); ? handles[4] = iMFI(Symbol(),TF,mfi_period,VOLUME_TICK ); //--- ? ? vector col_v; ? ? for (ulong i=0; i<5; i++) //Independent vars ? ? { ? ? ? CopyBuffer(handles[i],0,0,TrainBars, buffer); ? ? ? col_v = matrix_utils.ArrayToVector(buffer); ? ? ? ? ? ? Matrix.Col(col_v, i); ? ? } ? ? //-- Target var ? vector open, close; ? col_v.Resize(TrainBars); ? close.CopyRates(Symbol(),TF, COPY_RATES_CLOSE,0,TrainBars); ? open.CopyRates(Symbol(),TF, COPY_RATES_OPEN,0,TrainBars); ? for (int i=0; i<TrainBars; i++) ? ? ?{ ? ? ? ? if (close[i] > open[i]) //price went up ? ? ? ? ? ?col_v[i] = 1; ? ? ? ? else ? ? ? ? ? ?col_v[i] = 0; ? ? ?} ? ? Matrix.Col(col_v, 5); //Adding independent variable to the last column of matrix ? //---
變量 TF、bears_period 等。 在上述代碼頂端找到的輸入定義的變量:

編輯
由于這是監(jiān)督學習,我不得不編造目標變量,其邏輯很簡單。 如果收盤價高于開盤價,則目標變量設置為 class 1,否則 class 為 0。 這就是目標變量的設置方式。 下面是數(shù)據(jù)集矩陣外貌的概覽:
CS ? ? ?0 ? ? ? 13:21:15.457 ? ?Naive Bayes Test (EURUSD,H1) ? ?"Bears" ? ? ? ? ? "Bulls" ? ? ? ?"Rsi" ? ? ?"Volumes" "MFI" ? ? "Target Var" CS ? ? ?0 ? ? ? 13:21:15.457 ? ?Naive Bayes Test (EURUSD,H1) ? ?[-3.753148029472797e-06,0.008786246851970603,67.65238281791684,13489,55.24611392389958,0] CS ? ? ?0 ? ? ? 13:21:15.457 ? ?Naive Bayes Test (EURUSD,H1) ? ?[-0.002513216984025402,0.005616783015974569,50.29835423473968,12226,49.47293811405203,1] CS ? ? ?0 ? ? ? 13:21:15.457 ? ?Naive Bayes Test (EURUSD,H1) ? ?[-0.001829900272021678,0.0009700997279782353,47.33479153312328,7192,46.84320886771249,1] CS ? ? ?0 ? ? ? 13:21:15.457 ? ?Naive Bayes Test (EURUSD,H1) ? ?[-0.004718485947447171,-0.0001584859474472733,39.04848493977027,6267,44.61564654651691,1] CS ? ? ?0 ? ? ? 13:21:15.457 ? ?Naive Bayes Test (EURUSD,H1) ? ?[-0.004517273669240485,-0.001367273669240276,45.4127802340401,3867,47.8438816641815,0]
然后,我決定在分布圖中可視化數(shù)據(jù),看看它們是否遵循概率分布:

編輯

編輯

編輯

編輯

編輯
對于那些想要了解不同種類的概率分布的人來說,有一整篇文章鏈接在此。
如果您仔細查看所有自變量的相關系數(shù)矩陣:
? string header[5] = {"Bears","Bulls","Rsi","Volumes","MFI"}; ? matrix vars_matrix = Matrix; //Independent variables only ? matrix_utils.RemoveCol(vars_matrix, 5); //remove target variable ? ? ArrayPrint(header); ? Print(vars_matrix.CorrCoef(false));
輸出:
CS ? ? ?0 ? ? ? 13:21:15.481 ? ?Naive Bayes Test (EURUSD,H1) ? ?"Bears" ? "Bulls" ? "Rsi" ? ? "Volumes" "MFI" ? ? CS ? ? ?0 ? ? ? 13:21:15.481 ? ?Naive Bayes Test (EURUSD,H1) ? ?[[1,0.7784600081627714,0.8201955846987788,-0.2874457184671095,0.6211980865273238] CS ? ? ?0 ? ? ? 13:21:15.481 ? ?Naive Bayes Test (EURUSD,H1) ? ? [0.7784600081627714,1,0.8257210032763984,0.2650418244580489,0.6554288778228361] CS ? ? ?0 ? ? ? 13:21:15.481 ? ?Naive Bayes Test (EURUSD,H1) ? ? [0.8201955846987788,0.8257210032763984,1,-0.01205084357067248,0.7578863565293196] CS ? ? ?0 ? ? ? 13:21:15.481 ? ?Naive Bayes Test (EURUSD,H1) ? ? [-0.2874457184671095,0.2650418244580489,-0.01205084357067248,1,0.0531475992791923] CS ? ? ?0 ? ? ? 13:21:15.481 ? ?Naive Bayes Test (EURUSD,H1) ? ? [0.6211980865273238,0.6554288778228361,0.7578863565293196,0.0531475992791923,1]]
您會注意到,除了交易量與其它變量的相關性外,所有變量都彼此密切相關,有些是巧合,例如 RSI 與牛勢和熊勢的相關性約為 82%。 交易量和 MFI 都有共同的素材,它們都是由交易量組成的,所以它們有 62% 的相關性就很合情合理。 由于高斯樸素貝葉斯不關心這些素材,赫茲量化就繼續(xù)前進,但我認為檢查和分析變量是個好主意。
訓練模型
訓練高斯樸素貝葉斯很簡單,只需花費很短的時間。 赫茲量化先看看如何正確執(zhí)行此操作:
? ? Print("\n---> Training the Model\n"); ? ? ? ? matrix x_train, x_test; ? ? vector y_train, y_test; ? ? ? ? matrix_utils.TrainTestSplitMatrices(Matrix,x_train,y_train,x_test,y_test,0.7,rand_state); ? ? //--- Train ? ? ? gaussian_naive = new CGaussianNaiveBayes(x_train,y_train); ?//Initializing and Training the model ? ? ? ? vector train_pred = gaussian_naive.GaussianNaiveBayes(x_train); //making predictions on trained data ? ? vector c= gaussian_naive.classes; //Classes in a dataset that was detected by mode ? ? ? ? metrics.confusion_matrix(y_train,train_pred,c); ?//analyzing the predictions in confusion matrix //---
函數(shù) TrainTestSplitMatrices 將數(shù)據(jù)拆分為 x 訓練矩陣,和 x 測試矩陣,及其各自的目標向量。 就像 sklearn python 中的 train_test_split 一樣。 它的核心函數(shù)是這樣的:
void CMatrixutils::TrainTestSplitMatrices(matrix &matrix_,matrix &x_train,vector &y_train,matrix &x_test, vector &y_test,double train_size=0.7,int random_state=-1)
默認情況下,70% 的數(shù)據(jù)將被拆分為訓練數(shù)據(jù),其余數(shù)據(jù)將保留為測試數(shù)據(jù)集,請參閱有關此拆分的詳細信息。 很多人發(fā)現(xiàn),在這個函數(shù)中令人困惑的是 random_state,人們經常在 Python ML 社區(qū)中選擇 random_state=42,即使任何數(shù)字都可以,選取這個數(shù)字只是為了確保每次都生成相同的隨機/洗牌矩陣,以便于調試,因為它設置了 Random 種子用于生成隨機數(shù)字,從而將矩陣中的行洗牌。 您也許會注意到,此函數(shù)獲得的輸出矩陣并非默認順序。 關于選擇這個 42 數(shù)字有若干討論。