用Python爬取股票数据,绘制K线和均线并用机器学习预测股价(来自我出的书)_gb4215287的博客-程序员宅基地

技术标签: pandas  python  

最近我出了一本书,《基于股票大数据分析的Python入门实战 视频教学版》,京东链接:https://item.jd.com/69241653952.html,在其中用股票范例讲述Python爬虫、数据分析和机器学习的技术,大家看了我的书,不仅能很快用比较热门的案例学好Python,更能了解些股票知识,不至于一入市就拍脑袋买卖。

    在本文里,将给出若干精彩范例,包括用爬虫获取股市数据,用matplotlib可视化控件绘制K线和均线,以及用sklean库里的方法,通过机器学习预测股价的走势。

1 通过pandas_datareader库的方法爬取股市数据

    pandas_datareader是一个能读取各种金融数据的库,在下面的getDataByPandasDatareader.py范例程序中演示了通过这个库获取股市数据的常规方法。    

1    # coding=utf-8
2    from pandas_datareader import data as pdr
3    import yfinance as yf
4    yf.pdr_override()
5    code='600895.ss'
6    stock = pdr.get_data_yahoo(code,'2019-01-02','2019-02-01')
7    print(stock)    # 输出内容
8    # 保存为excel和csv文件
9    stock.to_excel('D:\\stockData\\ch5\\'+code+'.xlsx')
10    stock.to_csv('D:\\stockData\ch5\\'+code+'.csv')

    从这个范例程序的代码上来看,不算复杂,从中没有见到爬取网站之类的代码。关键的是第6行,通过调用pdr.get_data_yahoo方法从雅虎网站获取数据,这个方法的参数分别是股票代码,开始日期和结束日期。第4行使用yf.pdr_override方法是为了防止雅虎网站修改获取历史数据的API接口而导致get_data_yahoo方法不可用。

    在这个范例程序中获取了600895(张江高科)2019-01-02到2019-01-31的数据,可以看出,获取的数据并不包括结束日期参数当天的数据。

    在第7行和第8行分别调用了to_excel和to_csv方法,把结果存入了指定目录下的文件中。这个范例程序运行后,我们首先能在控制台中看到输出,其次会在D:\stockData\ch5\目录中,看到600895.ss.xlsx和600895.ss.csv这两个保存股票数据的文件。打开600895.ss.xlsx文件,能看到如图5-4所示的数据内容,其实在控制台中和另一个csv文件中,可以看到一样的数据。

    在上述范例程序中,在调用get_data_yahoo方法时,传入的股票代码带有.ss的后缀,这表示该代码是沪股的。此外,还能通过.sz的后缀来表示深股,通过.hk的后缀表示港股。如果要获取美股的数据,则直接用美股的股票代码即可。在下面的printDataByPandasDatareader.py范例程序中演示了获取美股,港股和深股相关数据的方式。 

1    # coding=utf-8
2    from pandas_datareader import data as pdr
3    import yfinance as yf
4    yf.pdr_override()
5    stockCodeList = []
6    stockCodeList.append('600007.ss')      # 沪股“中国国贸”
7    stockCodeList.append('000001.sz')     # 深股“平安银行”
8    stockCodeList.append('2318.hk')       # 港股“中国平安”
9    stockCodeList.append('IBM')         # 美股,IBM,直接输入股票代码不带后缀
10    for code in stockCodeList:
11        # 为了演示,只取一天(2019-01-02)的交易数据
12        stock = pandas_datareader.get_data_yahoo(code,'2019-01-02','2019-01-03')
13        print(stock)

    这个范例程序运行后,就能从控制台中看到输出的4个股票在指定日期内的交易情况,由于数据量比较多,本书就不罗列具体的数据了。 

2 用matplotlib绘制k线和均线

    K线是由开盘价、收盘价、最高价和最低价这四个要素构成。在得到上述四个值之后,首先用开盘价和收盘价绘制成一个长方形实体。随后根据最高价和最低价,把它们垂直地同长方形实体连成一条直线,这条直线就叫影线。如果再细分一下,长方形实体上方的就叫上影线,下方的就叫下影线。通过K线可以形象地记录价格变动的情况,常用的有日K线,周K线和月K线。

    均线也叫移动平均线(Moving Average,简称MA),是指某段时间内的平均股价(或指数)连成的曲线,均线一般分为三类:短期、中期和长期。通常把5日和10日移动平均线称为短期均线,一般把20日、30日和60日移动平均线作为中期均线,一般120日和250日(甚至更长)移动平均线称为长期均线。

    在如下的drawKAndMAMore.py范例程序中,将用到上文提到的爬取股票数据的代码,从网络接口里获取股票数据,并绘制k线和均线,请大家不仅注意k线和均线的含义,还要重视matplotlib库里绘制图形、图例和坐标轴的做法,在这本书里,对应的知识点都有详细的说明。   

1    # !/usr/bin/env python
2    # coding=utf-8
3    from pandas_datareader import data as pdr
4    import pandas as pd
5    import matplotlib.pyplot as plt
6    from mpl_finance import candlestick2_ochl
7    from matplotlib.ticker import MultipleLocator
8    import yfinance as yf
9    yf.pdr_override()
10    # 根据指定代码和时间范围获取股票数据
11    code='600895.ss'
12    stock.drop(stock.index[len(stock)-1],inplace=True)
13    # 保存在本地
14    stock.to_csv('D:\\stockData\ch7\\600895.csv')
15    df = pd.read_csv('D:/stockData/ch7/600895.csv',encoding='gbk',index_col=0)
16    # 设置窗口大小
17    fig, ax = plt.subplots(figsize=(10, 8))
18    xmajorLocator   = MultipleLocator(5)     # 将x轴主刻度设置为5的倍数
19    ax.xaxis.set_major_locator(xmajorLocator)
20    # 调用方法绘制K线图 
21    candlestick2_ochl(ax = ax, opens=df["Open"].values,closes=df["Close"].values, highs=df["High"].values, lows=df["Low"].values,width=0.75, colorup='red', colordown='green')
22    # 如下是绘制3种均线
23    df['Close'].rolling(window=3).mean().plot(color="red",label='3日均线')
24    df['Close'].rolling(window=5).mean().plot(color="blue",label='5日均线')
25    df['Close'].rolling(window=10).mean().plot(color="green",label='10日均线')
26    plt.legend(loc='best')     # 绘制图例
27    ax.grid(True)     # 带网格线
28    plt.title("600895张江高科的K线图")
29    plt.rcParams['font.sans-serif']=['SimHei']
30    plt.setp(plt.gca().get_xticklabels(), rotation=30) 
31    plt.show()

    第一,从第9行到第15行通过调用之前介绍过的get_data_yahoo方法,传入股票代码、开始时间和结束时间这三个参数,从雅虎网站中获得股票交易的数据。

    第二,在第17行中调用figsize方法设置了窗口的大小。

    第三,第18行和第19行的程序代码设置了主刻度是5的倍数。之所以设置成5的倍数,是因为一般一周的交易日是5天。但这里不能简单地把主刻度设置成每周一,因为某些周一有可能是股市休市的法定假日。

    第四,由于无需在x轴上设置每天的日期,因此这里无需再调用plt.xticks方法,但是要调用如第30行所示的代码,设置x轴刻度的旋转角度,否则x轴显示的时间依然有可能会相互重叠。

    至于绘制K线的candlestick2_ochl方法和绘制均线的rolling方法与之前drawKAndMA.py范例程序中的代码是完全一致的。

    这个范例程序的运行结果如图7-5所示,从中可以看到改进后的效果。由于本次显示的股票时间段变长了(是3个月),因此与drawKAndMA.py范例程序相比,这个范例程序均线的效果更为明显,尤其是3日均线,几乎贯穿于整个时间段的各个交易日。

    另外,由于在第26行通过调用plt.legend(loc='best')方法指定了图例将“显示在合适的位置”,因此这里的图例显示在效果更加合适的左上方,而不是drawKAndMA.py范例程序中的右上方。

     

3 用sklearn库的机器学习方法预测股票后市价格

    在下面的predictStockByLR.py范例程序中,根据股票历史的开盘价、收盘价和成交量等特征值,从数学角度来预测股票未来的收盘价。    

1    # !/usr/bin/env python
2    # coding=utf-8
3    import pandas as pd
4    import numpy as np
5    import math
6    import matplotlib.pyplot as plt
7    from sklearn.linear_model import LinearRegression
8    from sklearn.model_selection import train_test_split
9    # 从文件中获取数据
10    origDf = pd.read_csv('D:/stockData/ch13/6035052018-09-012019-06-01.csv',encoding='gbk')
11    df = origDf[['Close', 'High', 'Low','Open' ,'Volume']]
12    featureData = df[['Open', 'High', 'Volume','Low']]
13    # 划分特征值和目标值
14    feature = featureData.values
15    target = np.array(df['Close'])

    第10行的程序语句从包含股票信息的csv文件中读取数据,在第14行设置了特征值是开盘价、最高价、最低价和成交量,同时在第15行设置了要预测的目标列是收盘价。在后续的代码中,需要将计算出开盘价、最高价、最低价和成交量这四个特征值和收盘价的线性关系,并在此基础上预测收盘价。    

16    # 划分训练集,测试集
17    feature_train, feature_test, target_train ,target_test = train_test_split(feature,target,test_size=0.05)
18    pridectedDays = int(math.ceil(0.05 * len(origDf)))     # 预测天数
19    lrTool = LinearRegression()
20    lrTool.fit(feature_train,target_train)     # 训练
21    # 用测试集预测结果
22    predictByTest = lrTool.predict(feature_test)

    第17行的程序语句通过调用train_test_split方法把包含在csv文件中的股票数据分成训练集和测试集,这个方法前两个参数分别是特征列和目标列,而第三个参数0.05则表示测试集的大小是总量的0.05。该方法返回的四个参数分别是特征值的训练集、特征值的测试集、要预测目标列的训练集和目标列的测试集。

    第18行的程序语句计算了要预测的交易日数,在第19行中构建了一个线性回归预测的对象,在第20行是调用fit方法训练特征值和目标值的线性关系,请注意这里的训练是针对训练集的,在第22行中,则是用特征值的测试集来预测目标值(即收盘价)。也就是说,是用多个交易日的股价来训练lrTool对象,并在此基础上预测后续交易日的收盘价。至此,上面的程序代码完成了相关的计算工作。    

23    # 组装数据
24    index=0
25    # 在前95%的交易日中,设置预测结果和收盘价一致
26    while index < len(origDf) - pridectedDays:
27        df.ix[index,'predictedVal']=origDf.ix[index,'Close']
28        df.ix[index,'Date']=origDf.ix[index,'Date']
29        index = index+1
30    predictedCnt=0
31    # 在后5%的交易日中,用测试集推算预测股价
32    while predictedCnt<pridectedDays:
33        df.ix[index,'predictedVal']=predictByTest[predictedCnt]
34        df.ix[index,'Date']=origDf.ix[index,'Date']
35        predictedCnt=predictedCnt+1
36        index=index+1

    在第26行到第29行的while循环中,在第27行把训练集部分的预测股价设置成收盘价,并在第28行设置了训练集部分的日期。

    在第32行到第36行的while循环中,遍历了测试集,在第33行的程序语句把df中表示测试结果的predictedVal列设置成相应的预测结果,同时也在第34行的程序语句逐行设置了每条记录中的日期。    

37    plt.figure()
38    df['predictedVal'].plot(color="red",label='predicted Data')
39    df['Close'].plot(color="blue",label='Real Data')
40    plt.legend(loc='best')     # 绘制图例
41    # 设置x坐标的标签
42    major_index=df.index[df.index%10==0]
43    major_xtics=df['Date'][df.index%10==0]
44    plt.xticks(major_index,major_xtics)
45    plt.setp(plt.gca().get_xticklabels(), rotation=30)
46    # 带网格线,且设置了网格样式
47    plt.grid(linestyle='-.')
48    plt.show()

    在完成数据计算和数据组装的工作后,从第37行到第48行程序代码的最后,实现了可视化。

    第38行和第39行的程序代码分别绘制了预测股价和真实收盘价,在绘制的时候设置了不同的颜色,也设置了不同的label标签值,在第40行通过调用legend方法,根据收盘价和预测股价的标签值,绘制了相应的图例。

    从第42行到第45行设置了x轴显示的标签文字是日期,为了不让标签文字显示过密,设置了“每10个日期里只显示1个”的显示方式,并且在第47行设置了网格线的效果,最后在第48行通过调用show方法绘制出整个图形。运行本范例程序,即可看到如图13-7所示的结果。

    

 

     可以看出,蓝线表示真实的收盘价(图中完整的线),红线表示预测股价(图中靠右边的线。因为本书黑白印刷的原因,在书中读者看不到蓝色和红色,请读者在自己的计算机上运行这个范例程序即可看到红蓝两色的线)。虽然预测股价和真实价之间有差距,但涨跌的趋势大致相同。而且在预测时没有考虑到涨跌停的因素,所以预测结果的涨跌幅度比真实数据要大。

    股票价格不仅由技术面决定,还受政策面、资金量以及消息面等诸多因素的影响,这也能解释预测结果和真实结果间有差异的原因。

4 对书的介绍和版权说明

    本文给出的范例,仅是《基于股票大数据分析的Python入门实战 视频教学版》一书里的部分案例,该书京东链接:https://item.jd.com/69241653952.html

    这本书包括如下的内容,是本入门python的工具书。

    1 Python基本语法,集合,面向对象语法,异常处理,读写文件技能。

    2 Python操作数据库的技能。

    3 通过爬虫从网络接口爬取股票数据的技能。

    4 基于Numpy+Pandas+Matplotlib进行数据分析的技能

    5 基于TKinter的GUI编程技能+ 发送邮件的技能

    6 Django框架的用法

    7 线性回归+SVM的机器学习技能

    这本书里,像本文那样花花绿绿能吸引人的图真不少,而且还是通过python绘制出来的,用这类比较能吸引人的案例来入门python,一定非常高效。

    本文可以转载,转载时请全文转载,别有删节,并用链接的形式给出原文链接。否则的话,可能会遇到出版社的维权。

来源:https://blog.csdn.net/sxeric/article/details/107954299

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/gb4215287/article/details/108348501

智能推荐

openssl pkcs12_艾-小小雨的博客-程序员宅基地

用途:pkcs12命令能生成和分析pkcs12文件语法:openssl pkcs12[-export] [-chain] [-inkey filename] [-certfile filename] [-CApath arg] [-CAfile arg] [-name name] [-caname name] [-in filename] [-out filename] [-noout] [-no

Python的shutil模块_zheng_lan_fang的博客-程序员宅基地

shutil.copyfile(src,dst)::oldfile和newfile都只能是文件。    shutil.copy(src,dst): 复制一个文件到一个文件或一个目录shutil.copy2(src,dst): 在copy上的基础上再复制文件最后访问时间与修改时间也复制过来了shutil.copymode( src, dst) : 只是会复制其权限其他的东西是不会被复制的

10个jQuery可爱插件_dingshi7798的博客-程序员宅基地

让你的网页设计的可爱和功能与这些可爱的选择jQuery插件。 1.类似的Skype按钮 Skype正在广泛当今世界使用。 这个插件可以帮助您创建一个按钮,看起来完全在Skype的相同。 见现场演示 资源 2.动画窗帘 了解如何在jQuery的动画帷幕开幕式现场。 见现场演示 资源 3.熄灯 添加弹出消息框完整的灰色背景。 见现场演示 资源 4. iPhone解锁 模拟...

Java for Web学习笔记(七一):Service和Repository(6)在Spring框架中使用Listener_恺风的博客-程序员宅基地

目的Listener是Servlet的,不属于Spring framework,也就是说我们无法在Listener中主动注入Spring bean。本学习将解决这个问题。进一步了解Spring的bean注入在解决之前,我们先进一步了解Spring的注入机制。在Spring中,我们可以使用@Inject,@Anwired,@Resource等方式实现对自动扫描和自动注入。同一上下

阻塞赋值和非阻塞赋值的区别_dajunzhi的博客-程序员宅基地_阻塞赋值和非阻塞赋值的区别

在阻塞赋值和非阻塞赋值问题当中有一个概念叫做正规延迟和内定延迟,这是两个比较重要的概念。其中正规延迟是指延迟信号在赋值语句之外,#N sun=a+b.(#N sun&lt;=a+b)正规延迟的定义为,在T时刻满足赋值语句执行的条件时,需要在T+N时刻正式执行,也就是说,如果在时序电路中,满足具体情况之后还需要在等待N时刻才能完成执行,且执行时数据为T+N时刻数据。always () #1.5 y=x;always () #1.5 y&lt;=x;他们的结果是一样的内定延迟可表示为: sun=

POJ 3764 The xor-longest Path 01字典树+dfs_chen_minghui的博客-程序员宅基地

题目链接http://poj.org/problem?id=3764题意给定一颗树,要求找出一条路径,其边的权值异或和最大。思路求出各节点到根的异或和,假设两结点u,v到根的异或和为a[u],a[v] 那么u到v的异或和为a[u]^a[v] ,u,v的lca到根因为重复被去掉了。插入字典树中查询就行了。#include<cstdio>#include<iostream>#include<algo

随便推点

合并两个数组_coder_chenwei的博客-程序员宅基地

https://www.cnblogs.com/gester/p/5458405.html

《数据库系统》(二) 关系数据库_天才程序YUAN的博客-程序员宅基地

我的妹妹小埋18岁,成绩优异体育万能。然而,只有我知道,小埋经常让我帮她辅导功课。今天她想学习关系数据库。本篇教程通过我与小埋的对话的方式来谈一谈关系数据库。

笔记本电脑蓝牙怎么连接蓝牙音箱_蓝牙便携音箱怎么选择?_weixin_39537397的博客-程序员宅基地

“不要试图填满生命的空白,因为音乐就在那空白的深处。”本内容中涉及的信息及数据来源于公开可获得资料蓝牙音箱的分类蓝牙音箱的选择主因:使用场景,主要考虑室内还是户外。1、室内蓝牙音箱分两种第一是传统2.0音箱加蓝牙功能,这类音箱个人觉得还是应该归类到传统音箱里(有关这类产品参考以往文章:公众号主界面点击“泥土香”—“好物”进入目录找);第二是桌面蓝牙音箱,这类音箱要求外观设计符合整体家居...

Learning Castor_悟sphenic_新浪博客_悟V-SpHeNIC的博客-程序员宅基地

1. Castor是什么    Castor是一种将Java对象和XML自动绑定的开源软件.它可以在Java对象,XML文本,SQL数据表以及LDAP目录之间绑定.    ²网址: http://www.castor.org/    2. Castor使用    ²Java对象指的是具有setX和getX方法的JavaBean,将Castor用于JavaBean具体使用方...

win10 基于GPU的anaconda3+tensorflow深度学习环境搭建(简易搭建)_Fly-kite6的博客-程序员宅基地

win10 基于GPU的anaconda3+tensorflow深度学习环境搭建(简易搭建)第一步:安装anaconda3,选择window版64位下载&lt;https://www.anaconda.com/distribution/#download-section&gt;:安装界面,选择路径:选择第一个框勾选,python待会我们另外安装。第二步:搭建tensorflow的py...

字节最爱问的智力题,你会几道?_骨灰级收藏家的博客-程序员宅基地

面试中的各种高频智力题,看这种题性价比很高,看一遍记住个思路就能在面试时说出来,并且会让面试官觉得你很聪明。不像算法题,可能你刷了三遍,在面试时也不一定能写对。1.你现在有一根金条,有一个工人为你工作了七天,他们的工资是金条的七分之一,并且需要当天结清,你只能对金条切割两次,请问需要怎么做。这个问题和平时用的纸币金额是一个道理,将一根金条切割两次可以得到三根金条,这三根金条必须可以组合出1-7之间的任意金额。将金条分两次切成长度为1、2、4的金条即可。第一天,将长度为1的金条支付给工人。第二天,将