以预测股票涨跌案例入门基于SVM的机器学习

    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方法的要求。     

1

2

3

4

5

6

7

8

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)#获取-25,间距是1的若干数据

17  lineY = slope*lineX-(svmTool.intercept_[0])/sample[1]

  在第11行里,我们创建了基于SVM的对象,并指定该SVM模型采用比较常用的“线性核”来实现分类操作。

      在第14行,通过fit训练样本。这里fit方法和之前基于线性回归案例中的fit方法是一样的,只不过这里是基于线性核的相关算法,而之前是基于线性回归的相关算法(比如最小二乘法)。训练完成后,通过第14行和第15行的代码,我们得到了能分隔两类样本的直线,包括直线的斜率和截距,并通过第16行和第17行的代码设置了分隔线的若干个点。    

1

2

3

4

5

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

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

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

2

3

1   [[-0.26726124 -1.22474487 -1.37281295]

2    [-1.06904497  0.          0.39223227]

3    1.33630621  1.22474487  0.98058068]]

   

3 预测股票涨跌

    在之前的案例中,我们用基于SVM的方法,通过一维直线来分类二维的点。据此可以进一步推论:通过基于SVM的方法,我们还可以分类具有多个特征值的样本。

    比如可以通过开盘价、收盘价、最高价、最低价和成交量等特征值,用SVM的算法训练出这些特征值和股票“涨“和“跌“的关系,即通过特征值划分指定股票“涨”和“跌”的边界,这样的话,一旦输入其它的股票特征数据,即可预测出对应的涨跌情况。在如下的PredictStockBySVM.py案例中,我们给出了基于SVM预测股票涨跌的功能。     

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

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/6035052018-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,在后继的代码里,将根据预测结果填充这列的值。    

1

2

3

4

5

6

7

8

9

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行,设置了训练集的数量是总量的80%,在第23行则设置了训练的特征值,请注意这里去掉了日期这个不相关的列,而且,在第25行,对特征值进行了标准化处理。    

1

2

3

4

5

26  #训练集的特征值和目标值

27  featureTrain=feature[1:trainNum-1]

28  targetTrain=target[1:trainNum-1]

29  svmTool = svm.SVC(kernel='liner')

30  svmTool.fit(featureTrain,targetTrain)

  在第27行和第28行里,我们通过截取指定行的方式,得到了特征值和目标值的训练集,在第26行里,以线性核的方式创建了SVM分类器对象svmTool。

     在第30行里,通过fit方法,用特征值和目标值的训练集训练svmTool分类对象。从上文里我们已经看到,训练所用的特征值是开盘收盘价、最高最低价和成交量,训练所用的目标值是描述涨跌情况的up列。在训练完成后,svmTool对象中就包含了能划分股票涨跌的相关参数。

1

2

3

4

5

6

7

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列中。      

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

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]

50  major_xtics=dfWithPredicted['Date'][dfWithPredicted.index%2==0]

51  plt.xticks(major_index,major_xtics)

52  plt.setp(plt.gca().get_xticklabels(), rotation=30)

53  plt.title("通过SVM预测603505的涨跌情况")

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 总结和版权说明

    本文是给程序员加财商系列,之前还有两篇博文

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/63460.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

GPT2中文新闻标题生成

向AI转型的程序员都关注了这个号&#x1f447;&#x1f447;&#x1f447; 机器学习AI算法工程 公众号&#xff1a;datayx 项目描述 本项目是一个带有超级详细中文注释的基于GPT2模型的新闻标题生成项目。本项目参考了GPT2-Chinese、GPT2-chitchat、CDial-GPT、GPT2等多个GPT…

中文新闻文本标题分类(基于飞桨、Text CNN)

目录 一、设计方案概述 二、具体实现 三、结果及分析 四、总结 一、设计方案概述 主要网络模型设计&#xff1a; 设计所使用网络模型为TextCNN,由于其本身就适用于短中句子&#xff0c;在标题分类这一方面应该能发挥其优势。 TextCNN是Yoon Kim在2014年提出的模型&#xff…

“无法登陆到你的账户”的问题解决方案

电脑打开后&#xff0c;winR打开命令窗口 输入&#xff1a;netplwiz 点击添加 ​​​​​​​点击添加方框内 点击本地账户 输入你要创建的账号那些&#xff1a; 我当时已经创建好了&#xff0c;就是user. 然后需要将该用户设置为管理员权限即可。 重回回到&#xff0c;此时你…

聚观早报 | 美国又一家银行要暴雷;腾讯T13技术黄希彤被曝遭裁员

今日要闻&#xff1a;暴跌 62%&#xff01;美国又一家银行要暴雷&#xff1b;三星上半年量产第三代 4nm 工艺&#xff1b;腾讯T13技术大佬黄希彤被曝遭裁员&#xff1b;华为 P60 系列将于 3 月 23 日发布&#xff1b;苹果公司CEO库克减薪40% 暴跌 62%&#xff01;美国又一家银…

蓝筹股连环爆雷!这些蓝筹股哪些最容易爆雷?(最全名单)

幸福的股民总是相似的&#xff0c;不幸的股民去而各有各的不幸。天雷滚滚的2019年报季尚不去不远&#xff0c;不少股民们尚未从那场暗雷中疗伤正骨&#xff0c;2020年中报的雷声又开始拉响。 7月14日&#xff0c;有着“药中茅台”之称的东阿阿胶半年度业绩公布&#xff0c;作为…

我问自己代言,甄嬛篇

你只看到本宫的寿康宫 却没看到本宫的凌云峰 你有你的气度 本宫有本宫的本事 你嘲笑本宫菀菀类卿 本宫可怜你留得住人留不住心 你可以轻视本宫的存在 本宫会让你见识糙米薏仁汤的口感 回宫 注定是一段孤独的旅程 路上少不了三姑六婆 但 那又怎样&#xff1f;即使是滑胎 也要滑的…

淘宝618每日一猜6月6日答案-甄嬛在横店哪里参加的选秀?

淘宝6月6日每日一猜答案是什么&#xff1f;&#xff0c;接下来也会给大家来介绍一下6月6日淘宝大赢家每日一猜的答案。 淘宝每日一猜6月6日答案分享 活动问题&#xff1a;甄嬛在横店哪里参加的选秀 活动答案&#xff1a;【交泰殿】 还有打开手机淘宝&#xff0c;搜索“能省就…

吴忠军 - 《甄嬛传》宜修到死都不知道,这个和甄嬛无关的人帮了甄嬛一个大忙...

《甄嬛传》在甄嬛把华妃扳倒后&#xff0c;皇后便甩开手开始对付甄嬛了&#xff0c;比起华妃和甄嬛的眼里皇后是最好对付的&#xff0c;因为皇后手中掌握扳倒甄嬛的法宝&#xff0c;这便是皇后的亲姐姐纯元&#xff0c;皇后设计甄嬛穿错纯元故衣后&#xff0c;不仅是皇上大发雷…

专利战争:IT界的甄嬛传

分享到 本文来自腾讯大讲堂(DJT.QQ.COM)&#xff0c;转载请注明出处。      近期热播电视剧“甄嬛传”完美收官&#xff0c;剧中女猪脚甄嬛的经历堪称一部女人的奋斗史诗&#xff0c;一方面要讨皇上的欢心&#xff0c;一方面又要跟华妃、皇后等后宫各方势力做斗争&…

熹贵妃竟是这种隐藏属性,从MBTI来看甄嬛“三姐妹”的爱恨情仇?

就在不久前的5月17日&#xff0c;农历四月十七&#xff0c;是熹贵妃的农历生日&#xff0c;这一天为了给嬛嬛庆生&#xff0c;朋友圈微博等各大平台&#xff0c;可热闹了起来&#xff0c;这盛况堪比那年果郡王为嬛嬛庆生&#xff5e; 如今&#xff0c;距《甄嬛传》首播已经有1…

《后宫•甄嬛传》火爆背后的秘密

“I pity the empress. Poor empress.” “我很同情皇后&#xff0c;她很可怜。” “Do you think Zhen Huan really loves the emperor?” “你认为甄嬛真的爱皇帝吗&#xff1f;” From campuses to offices, from shopping malls to the streets, talk about Legend of Zhe…

李东学计算机在哪学的,被人遗忘的果郡王,从《甄嬛传》出来的李东学如今只能奋进的旋律...

作者/ 卡茜 编辑/ 冯寅杰 (本文原载于《创业人》杂志 原标题《李东学&#xff1a;《甄嬛传》让我沉迷于演戏》) 183公分的海拔跟“高”贴合无误&#xff0c;俊朗轮廓与“帅”亲密无间&#xff0c;招牌式如阳笑容把“谦和”、“绅士”逐字融入。他自己却说真正的“高富帅”应该是…

《甄嬛传》被日本网友热赞

近期《甄嬛传》开始在日本电视台播出&#xff0c;日本网友说&#xff1a;“孙俪美得让人惊叹&#xff0c;但又是脚踏实地的美&#xff0c;不像如今演艺圈的美女&#xff0c;都带着点小太妹的坏坏的美一样&#xff0c;我喜欢她这种稳重大气的美。 转载于:https://www.cnblogs.co…

《甄嬛传》影评(整理)

这部戏似乎将人物的性格变化以及人物之间的互动把握得很好&#xff0c;让人觉得这部戏里每个人物都栩栩如生&#xff0c;似乎就是生活中之人。我比较讨厌看一部戏中&#xff0c;很明显地将人物分为正面和反面角色。这部戏中&#xff0c;自然也会有正面和反面角色&#xff0c;但…

推荐电视剧 后宫甄嬛传 2012

后宫甄嬛传 百科名片 《后宫甄嬛传》海报 电视剧《后宫甄嬛传》改编自流潋紫所著的同名小说。由郑晓龙导演&#xff0c;孙俪、陈建斌、蔡少芬等人主演&#xff0c;由北京电视艺术中心制作。该剧是一部宫廷情感大戏&#xff0c;更注重描写"后宫女人"的真实情感&am…

《甄嬛传》解读--后宫女人的心酸血泪史之腹黑学

最近看了一部电视剧&#xff0c;叫做《甄嬛传》&#xff0c;虽然它的主体讲述的是雍正皇帝后宫的故事&#xff0c;但是故事里面的人物性格各个鲜明&#xff0c;在他们的身上总是能够或多或少的看到一丝丝自己的影子&#xff0c;当然我不是说要大家去争男人争宠什么的。 这部76集…

甄嬛传趣玩系统数据可视化分析

文章目录 前言一、角色情况基本概览二、1723-1730年大事件统计三、主要角色事件统计分析四、发生事件频繁角色统计总结 前言 本文在完成SQL Server和vb.net结合创建的甄嬛传趣玩数据管理系统为基础的前提下&#xff0c;继续采用vs 2019中商业智能模块中的Reporting Services进…

chatgpt赋能python:用Python轻松给手机用户发送短信——优秀的工具在手,无限可能!

用Python轻松给手机用户发送短信——优秀的工具在手&#xff0c;无限可能&#xff01; 作为一个有10年Python编程经验的工程师&#xff0c;我想分享一下如何用Python给手机用户发送短信。Python是目前非常流行的编程语言之一&#xff0c;它可以轻松地完成很多任务。而给用户发…

汪子熙趣味成语接龙游戏的设计初衷

我国的汉语博大精深&#xff0c;其中数以万计的四字成语更是汉语中一颗颗璀璨的明珠&#xff0c;凝聚着中华民族几千年文明的精华。从小接触这些成语&#xff0c;对于小学生积累语汇&#xff0c;提高文学素养&#xff0c;和学习文言文方面有着很大的帮助。 本作品以益智游戏的…