数据科学与机器学习11部分朴素贝叶斯交易中的概率论
概述
朴素贝叶斯分类器是一种概率算法,用于机器学习中的分类任务。 它基于贝叶斯定理,该定理根据给定证据计算假设的概率。 这种概率分类器在各种情况下都是一种简单而有效的算法。 它假定进行分类的特征彼此独立。 例如:如果您希望此模型在给定身高、脚大小、体重和肩长的情况下对人类(男性和女性)进行分类,则该模型将所有这些变量视为彼此独立,在这种情况下,它甚至并不认可脚的大小和身高与人类有关。
由于这个模型不会费心去理解自变量之间的范式,我认为我们应该给它一个机会,尝试用它来做出明智的交易决策。 我相信在交易领域,没有人完全理解这些范式,所以,赫兹量化来看看朴素贝叶斯的表现如何。

编辑切换为居中
事不宜迟,赫兹量化调用模型实例并立即使用它。 稍后我们将讨论这个模型是由什么组成的。

编辑切换为居中
准备训练数据
对于此示例,我选择了 5 个指标,其中大多数是振荡器和交易量,因为我认为它们是很好的分类变量,而且它们具有有限数额,这令它们适合正态分布,这是该算法的核心思想之一,不过您不必受限于这些指标,如此请随意探索您喜欢的各种指标和数据。
牛势和熊势
相对强弱指数
交易量
资金流动指数
最重要的先做:
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 等。 在上述代码顶端找到的输入定义的变量:

编辑
由于这是监督学习,我不得不编造目标变量,其逻辑很简单。 如果收盘价高于开盘价,则目标变量设置为 class 1,否则 class 为 0。 这就是目标变量的设置方式。 下面是数据集矩阵外貌的概览:
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]
然后,我决定在分布图中可视化数据,看看它们是否遵循概率分布:

编辑

编辑

编辑

编辑

编辑
对于那些想要了解不同种类的概率分布的人来说,有一整篇文章链接在此。
如果您仔细查看所有自变量的相关系数矩阵:
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% 的相关性就很合情合理。 由于高斯朴素贝叶斯不关心这些素材,赫兹量化就继续前进,但我认为检查和分析变量是个好主意。
训练模型
训练高斯朴素贝叶斯很简单,只需花费很短的时间。 赫兹量化先看看如何正确执行此操作:
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 //---
函数 TrainTestSplitMatrices 将数据拆分为 x 训练矩阵,和 x 测试矩阵,及其各自的目标向量。 就像 sklearn python 中的 train_test_split 一样。 它的核心函数是这样的:
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% 的数据将被拆分为训练数据,其余数据将保留为测试数据集,请参阅有关此拆分的详细信息。 很多人发现,在这个函数中令人困惑的是 random_state,人们经常在 Python ML 社区中选择 random_state=42,即使任何数字都可以,选取这个数字只是为了确保每次都生成相同的随机/洗牌矩阵,以便于调试,因为它设置了 Random 种子用于生成随机数字,从而将矩阵中的行洗牌。 您也许会注意到,此函数获得的输出矩阵并非默认顺序。 关于选择这个 42 数字有若干讨论。