秒秒时时彩是正规的吗_以预测股票涨跌案例入门基于SVM的机器学习
- 时间:
- 浏览:0
- 来源:森七博客 - 专注共享张凯博客资讯
SVM是Support Vector Machine的缩写,中文叫支持向量机,通过它还不想 对样本数据进行分类。以股票为例,SVM能根据若干形态学 样本数据,把待预测的目标结果划分成“涨”和”跌”一种生活,从而实现预测股票涨跌的效果。
1 通过简单案例了解SVM的分类作用
在Sklearn库里,封装了SVM分类的相关最好的法律依据 ,也全都我说,我们我们我们我们我们我们 不想了解其中比较复杂的算法,即可用它实现基于SVM的分类。通过如下SimpleSVMDemo.py案例,我们我们我们我们我们我们 来看下通过SVM库实现分类的做法,以及相关最好的法律依据 的调用最好的法律依据 。
1 #!/usr/bin/env python 2 #coding=utf-8 3 import numpy as np 4 import matplotlib.pyplot as plt 5 from sklearn import svm 6 #给出平面上的若干点 7 points = np.r_[[[-1,1],[1.5,1.5],[1.8,0.2],[0.8,0.7],[2.2,2.8],[2.5,3.5],[4,2]]] 8 #按0和1标记成两类 9 typeName = [0,0,0,0,1,1,1]
在第5行里,我们我们我们我们我们我们 引入了基于SVM的库。在第7行,我们我们我们我们我们我们 定义了若干个点,并在第9行把哪几种点分成了两类,比如[-1,1]点是第一类,而[4,2]是第二类。
这里请注意,在第7行定义点的之后,是通过np.r_最好的法律依据 ,把数据转打上去“列矩阵”,全都我做的目的是让数据形态学 满足fit最好的法律依据 的要求。
10 #建立模型 11 svmTool = svm.SVC(kernel='linear') 12 svmTool.fit(points,typeName) #传入参数 13 #确立分类的直线 14 sample = svmTool.coef_[0] #系数 15 slope = -sample[0]/sample[1] #斜率 16 lineX = np.arange(-2,5,1)#获取-2到5,间距是1的若干数据 17 lineY = slope*lineX-(svmTool.intercept_[0])/sample[1]
在第11行里,我们我们我们我们我们我们 创建了基于SVM的对象,并指定该SVM模型采用比较常用的“线性核”来实现分类操作。
在第14行,通过fit训练样本。这里fit最好的法律依据 和之后基于线性回归案例中的fit最好的法律依据 是一样的,只不过这里是基于线性核的相关算法,而之后是基于线性回归的相关算法(比如最小二乘法)。训练完成后,通过第14行和第15行的代码,我们我们我们我们我们我们 得到了能分隔两类样本的直线,包括直线的斜率和截距,并通过第16行和第17行的代码设置了分隔线的若干个点。
18 #画出划分直线 19 plt.plot(lineX,lineY,color='blue',label='Classified Line') 20 plt.legend(loc='best') #绘制图例 21 plt.scatter(points[:,0],points[:,1],c='R') 22 plt.show()
计算完成后,我们我们我们我们我们我们 通过第19行的plot最好的法律依据 绘制了分隔线,并在第21行通过scatter最好的法律依据 绘制所有的样本点。不可能 points是“列矩阵”的数据形态学 ,全都是用points[:,0]来获取绘制点的 x坐标,用points[:,1]来获取y坐标,最后是通过第22行的show最好的法律依据 绘制图形。运行上述代码,我们我们我们我们我们我们 能看一遍如下图13.8的效果,从中我们我们我们我们我们我们 能看一遍,天蓝色的边界线能有效地分隔两类样本。
从这俩例子中我们我们我们我们我们我们 能看一遍,SVM的作用是,根据样本,训练出能划分不同种类数据的边界线,由此实现“分类”的效果。否则,在根据训练样本选泽好边界线的参数后,还能根据其它这么明确种类样本,计算出它的种类,以此实现“预测”效果。
2 数据标准化处里
标准化(normalization)处里是将形态学 样本按一定算法进行缩放,让它们落在某个范围比较小的区间,同時 打上去单位限制,让样本数据转打上去无量纲的纯数值。
在用机器学习最好的法律依据 进行训练时,一般还要进行标准化处里,原困是Sklearn等库封装的许多机器学习算法对样本有一定的要求,不可能 许多形态学 值的数量级次要大多数形态学 值的数量级,不可能 有形态学 值次要正态分布,这么预测结果会不准确。
还要说明的是,我随便说说在训练前对样本进行了标准化处里,改变了样本值,但不可能 在标准化的过程中是用同一六个多 算法对完全样本进行转换,属于“数据优化”,不想对后继的训练起到不好的作用。
这里我们我们我们我们我们我们 是通过sklearn库提供的preprocessing.scale最好的法律依据 实现标准化,该最好的法律依据 是让形态学 值减去平均值否则除以标准差。通过如下ScaleDemo.py案例,我们我们我们我们我们我们 实际用下preprocessing.scale最好的法律依据 。
1 #!/usr/bin/env python 2 #coding=utf-8 3 from sklearn import preprocessing 4 import numpy as np 5 6 origVal = np.array([[10,5,3], 7 [8,6,12], 8 [14,7,15]]) 9 #计算均值 10 avgOrig = origVal.mean(axis=0) 11 #计算标准差 12 stdOrig=origVal.std(axis=0) 13 #减去均值,除以标准差 14 print((origVal-avgOrig)/stdOrig) 15 scaledVal=preprocessing.scale(origVal) 16 #直接输出preprocessing.scale后的结果 17 print(scaledVal)
在第6行里,我们我们我们我们我们我们 初始化了一六个多 长宽各为3的矩阵,在第10行,通过mean最好的法律依据 计算了该矩阵的均值,在第12行则通过std最好的法律依据 计算标准差。
第14行是用原始值减去均值,再除以标准差,在第17行,是直接输出preprocessing.scale的结果。第14行和第17行的输出结果相同,均是下值,从中我们我们我们我们我们我们 验证了标准化的具体做法。
1 [[-0.26726124 -1.22474487 -1.37281295] 2 [-1.06904497 0. 0.39223227] 3 [ 1.336200621 1.22474487 0.9200520068]]
3 预测股票涨跌
在之后的案例中,我们我们我们我们我们我们 用基于SVM的最好的法律依据 ,通过一维直线来分类二维的点。据此还不想 进一步推论:通过基于SVM的最好的法律依据 ,我们我们我们我们我们我们 还还不想 分类具有多个形态学 值的样本。
比如还不想 通过开盘价、收盘价、最高价、最低价和成交量等形态学 值,用SVM的算法训练出哪几种形态学 值和股票“涨“和“跌“的关系,即通过形态学 值划分指定股票“涨”和“跌”的边界,全都我的话,一旦输入其它的股票形态学 数据,即可预测出对应的涨跌具体情况。在如下的PredictStockBySVM.py案例中,我们我们我们我们我们我们 给出了基于SVM预测股票涨跌的功能。
1 #!/usr/bin/env python 2 #coding=utf-8 3 import pandas as pd 4 from sklearn import svm,preprocessing 5 import matplotlib.pyplot as plt 6 origDf=pd.read_csv('D:/stockData/ch13/200320052018-09-012019-05-31.csv',encoding='gbk') 7 df=origDf[['Close', 'Low','Open' ,'Vol','Date']] 8 #diff列表示本日和上日收盘价的差 9 df['diff'] = df["Close"]-df["Close"].shift(1) 10 df['diff'].fillna(0, inplace = True) 11 #up列表示本日是否上涨,1表示涨,0表示跌 12 df['up'] = df['diff'] 13 df['up'][df['diff']>0] = 1 14 df['up'][df['diff']<=0] = 0 15 #预测值暂且初始化为0 16 df['predictForUp'] = 0
第6行里,我们我们我们我们我们我们 从指定文件读取了中含股票信息的csv文件,该csv格式的文件我我随便说说是从网络数据接口获取得到的,具体做法还不想 参考前面博文。
从第9行里,我们我们我们我们我们我们 设置了df的diff列为本日收盘价和前日收盘价的差值,通过第12行到第14行的代码,我们我们我们我们我们我们 设置了up列的值,具体是,不可能 当日股票上涨,即本日收盘价大于前日收盘价,则up值是1,反之不可能 当日股票下跌,up值则为0。
在第16行里,我们我们我们我们我们我们 在df对象里新建了表示预测结果的predictForUp列,该列的值暂且都设置为0,在后继的代码里,将根据预测结果填充这列的值。
17 #目标值是真实的涨跌具体情况 18 target = df['up'] 19 length=len(df) 20 trainNum=int(length*0.8) 21 predictNum=length-trainNum 22 #选泽指定列作为形态学 列 23 feature=df[['Close', 'High', 'Low','Open' ,'Volume']] 24 #标准化处里形态学 值 25 feature=preprocessing.scale(feature)
在第18行里,我们我们我们我们我们我们 设置训练目标值是表示涨跌具体情况的up列,在第20行,设置了训练集的数量是总量的200%,在第23行则设置了训练的形态学 值,请注意这里打上去了日期这俩不相关的列,否则,在第25行,对形态学 值进行了标准化处里。
26 #训练集的形态学 值和目标值 27 featureTrain=feature[1:trainNum-1] 28 targetTrain=target[1:trainNum-1] 29 svmTool = svm.SVC(kernel='liner') 200 svmTool.fit(featureTrain,targetTrain)
在第27行和第28行里,我们我们我们我们我们我们 通过截取指定行的最好的法律依据 ,得到了形态学 值和目标值的训练集,在第26行里,以线性核的最好的法律依据 创建了SVM分类器对象svmTool。
在第200行里,通过fit最好的法律依据 ,用形态学 值和目标值的训练集训练svmTool分类对象。从上文里我们我们我们我们我们我们 不可能 看一遍,训练所用的形态学 值是开盘收盘价、最高最低价和成交量,训练所用的目标值是描述涨跌具体情况的up列。在训练完成后,svmTool对象中就中含了能划分股票涨跌的相关参数。
31 predictedIndex=trainNum 32 #逐行预测测试集 33 while predictedIndex<length: 34 testFeature=feature[predictedIndex:predictedIndex+1] 35 predictForUp=svmTool.predict(testFeature) 36 df.ix[predictedIndex,'predictForUp']=predictForUp 37 predictedIndex = predictedIndex+1
在第33行的while循环里,我们我们我们我们我们我们 通过predictedIndex索引值,依次遍历测试集。
在遍历过程中,通过第35行的predict最好的法律依据 ,用训练好的svmTool分类器,逐行预测测试集中的股票涨跌具体情况,并在第36行里,把预测结果设置到df对象的predictForUp列中。
38 #该对象只中含预测数据,即只中含测试集 39 dfWithPredicted = df[trainNum:length] 40 #现在现在开始绘图,创建一六个多 子图 41 figure = plt.figure() 42 #创建子图 43 (axClose, axUpOrDown) = figure.subplots(2, sharex=True) 44 dfWithPredicted['Close'].plot(ax=axClose) 45 dfWithPredicted['predictForUp'].plot(ax=axUpOrDown,color="red", label='Predicted Data') 46 dfWithPredicted['up'].plot(ax=axUpOrDown,color="blue",label='Real Data') 47 plt.legend(loc='best') #绘制图例 48 #设置x轴坐标标签和旋转深层 49 major_index=dfWithPredicted.index[dfWithPredicted.index%2==0] 200 major_xtics=dfWithPredicted['Date'][dfWithPredicted.index%2==0] 51 plt.xticks(major_index,major_xtics) 52 plt.setp(plt.gca().get_xticklabels(), rotation=200) 53 plt.title("通过SVM预测20032005的涨跌具体情况") 54 plt.rcParams['font.sans-serif']=['SimHei'] 55 plt.show()
不可能 在之后的代码里,我们我们我们我们我们我们 只设置测试集的predictForUp列,并这么设置训练集的该列数据,全都在第39行里,用切片的手段,把测试集数据放置到dfWithPredicted对象中,请注意这里切片的起始和现在现在开始值是测试集的起始和现在现在开始索引值。至此完成了数据准备工作,在之后的代码里,我们我们我们我们我们我们 将用matplotlib库现在现在开始绘图。
在第43行里,我们我们我们我们我们我们 通过subplots最好的法律依据 设置了一六个多 子图,并通过sharex=True让这六个多 子图的x轴具有相同的刻度和标签。在第44行代码里,在axClose子图中,我们我们我们我们我们我们 用plot最好的法律依据 绘制了收盘价的走势。在第45行代码里,在axUpOrDown子图中,我们我们我们我们我们我们 绘制了预测到的涨跌具体情况,而在第46行里,还是在axUpOrDown子图里,绘制了哪几种天的股票真实的涨跌具体情况。
在第49行到第52行的代码里,我们我们我们我们我们我们 设置了x标签的文字以及旋转深层,全都我做的目的是让标签文字看上去不至于太密集。在第53行里,我们我们我们我们我们我们 设置了中文标题,不可能 要显示中文,全都还要第54行的代码,最后在55行通过show最好的法律依据 展示了图片。运行上述代码,能看一遍如下图所示的效果。
其中上图展示了收盘价,下图的天蓝色线条表示真实的涨跌具体情况,0表示跌,1表示上涨,而红色则表示预测后的结果。
4 结论
对比一下,虽有偏差,但大体相符。综上所述,本案例是数学深层,演示了通过SVM分类的做法,包括不可能 划分形态学 值和目标值,怎样才能对样本数据进行标准化处里,怎样才能用训练数据训练SVM,还有怎样才能用训练后的结果预测分类结果。
5 总结和版权说明
本文是给守护进程池池员加财商系列,之后还有两篇博文
本文的内容即将出书,在出版的书里,是用股票案例和我们我们我们我们我们我们 讲述Python入门时的知识点,敬请期待
有不少前老外转载和我应该 转载我的博文,我个人所有所有感到十分荣幸,这也是我个人所有所有不断写博文的动力。关于本文的版权有如下统一的说明,抱歉就不逐一回复了。
1 本文可转载,不想告知,转载时请用链接的最好的法律依据 ,给出原文出处,别简单地通过文本最好的法律依据 给出,同時 写明原作者是hsm_computer。
2 在转载时,请原文转载 ,谢绝洗稿。否则我个人所有所有保留追究法律责任的权利。