绘制股票价格图 《Python数据可视化》的p131 python爬取雅虎财经股票交易数据

股票价格图

  1. 采用pandas_datareader包和获取Yahoo数据源

该书中说
采用matplotlib.mlab和matplotlib.finance的子包可以获取股票数据,但是matplotlib.finance已经用不了了。所以课本上的代码运行不通了。
所以我们换成pandas_datareader包获取Yahoo数据
旧版Pandas是通过pandas.io.data获取网络数据源,新版Pandas已将该子模块独立成了pandas_datareader包,须独立安装.(摘自老师给的某本书的截图,不知道叫什么)

目前可访问的网络数据服务商主要包括:Yahoo Finance(雅虎金融),Google Finance(谷歌金融)、Enigma(Enigma公共数据搜索的提供商)、World Bank(世界银行)、OECD(经合组织)、Eurostat(欧盟统计局)、Nasdaq Trader Symbol Definitions(纳斯达克)等。
绘制股票价格图   《Python数据可视化》的p131 python爬取雅虎财经股票交易数据

打开命令行(cmd)窗口,输入

pip install pandas_datareader

获取数据股票数据的方法

 r= webdata.get_data_yahoo(ticker,startdate,enddate)
 print(r.head())

光写这个实现的代码还是会报错,网上看到很多人用get_data_yahoo()方法都读取不出数据,因为雅虎在中国受到限制,程序会运行很久没有结果出来,还会报超时的错误,如下

runfile('H:/python/股票.py', wdir='H:/python')
Traceback (most recent call last):

timeout: The read operation timed out




  File "C:\Users\a\anaconda3\lib\contextlib.py", line 131, in __exit__
    self.gen.throw(type, value, traceback)

  File "C:\Users\a\AppData\Roaming\Python\Python38\site-packages\urllib3\response.py", line 443, in _error_catcher
    raise ReadTimeoutError(self._pool, None, "Read timed out.")

ReadTimeoutError: HTTPSConnectionPool(host='finance.yahoo.com', port=443): Read timed out.

During handling of the above exception, another exception occurred:

Traceback (most recent call last):

  File "C:\Users\a\AppData\Roaming\Python\Python38\site-packages\requests\models.py", line 760, in generate
    raise ConnectionError(e)

ConnectionError: HTTPSConnectionPool(host='finance.yahoo.com', port=443): Read timed out.

Figures now render in the Plots pane by default. To make them also appear inline in the Console, uncheck "Mute Inline Plotting" under the Plots pane options menu. 

别慌,解决办法在这里,看到网上很多人说再导入 fix_yahoo_finance 包,这个包里提供的pdr_overrider()可以修复不能读取的问题

import fix_yahoo_finance as yf

但我试过了,还是不行,搜了好多文章,终于在CSDN上找到了解决办法
原文:在CSDN上找到的解决办法
方法就是 fix_yahoo_finance包改名了,改成了yfinance包,所以只要导入yfinance包,用这个包里的pdr_override() 方法即可

import pandas_datareader.data as webdata
import yfinance as yf
yf.pdr_override()
r= webdata.get_data_yahoo(ticker,startdate,enddate)
#ticker表示股票代码,格式如下图,statedate是开始日期,必须为datatime格式,endate是结束日期

绘制股票价格图   《Python数据可视化》的p131 python爬取雅虎财经股票交易数据
这样就可以解决get_data_yahoo获取股票数据超时的问题啦
接下来观察r.head()函数输出的前五条记录,可以知道get_data_yahoo()方法返回的已经是数据框的格式了,所以我没有做把他存入csv,再读取csv的步骤,而且课本上的
m=mlab.csv2rec(fh)这个方法也用不了了,matplotlib.mlab包中已经没有这个函数了。

  1. 分析数据集r
    绘制股票价格图   《Python数据可视化》的p131 python爬取雅虎财经股票交易数据
    观察可知,首先这是个dataframe,所以课本上
prices=r.adj_close
ax.plot(r.date, prices, ,color=fillcolor,lw=2,label=ticker)

要改成

    prices = r['Adj Close']
    
    ###plot the price and volume data
    
    ax.plot(r.index,prices,color=fillcolor,lw=2,label=ticker)
  1. 最后一个要改的地方是
    #set the labels rotation and alignment
    for label in ax.get_xtickabels():    #get_xtickabels()也是用不了了,所以我直接注释了
        #To display date label slanting at 30 degreees
        label.set_rotation(30)
        label.set_horizontalalignment('right')

因为get_xtickabels()也是用不了了,但我还没找到解决的方式,我直接注释掉了,如果有会的朋友可以评论区教我一下,谢谢~~
这是我的第一篇博客,写的不太好,请见谅,希望对你们有帮助(如有侵权,请联系删除)

完整代码实现

import datetime
import numpy as np
import matplotlib.dates as mdates
import pandas_datareader.data as webdata
import pandas as pd
import mplfinance as mpf
import matplotlib.pyplot as plt
import matplotlib
import yfinance as yf
yf.pdr_override()      #因为雅虎在中国受限制的原因,需要引入另一个模块,“yfinance”

startdate = datetime.datetime(2014,4,12)
enddate = datetime.datetime(2015,5,12)
#today = enddate = datetime.date.today()
plt.rcParams['font.sans-serif'] = ['SimHei']  #允许中文
plt.rcParams['axes.unicode_minus'] = False   #允许有坐标轴中的正负号
plt.rc('axes',grid=True)
plt.rc('grid',color='0.75',linestyle='-',linewidth=0.5)
rect = [0.4,0.5,0.8,0.5]

fig =plt.figure(facecolor='white',figsize=(12,11))

#axescolor = '#f6f6f6' #the axes background color
ax = fig.add_axes(rect,facecolor='#f6f6f6')  #left, bottom, width, height =[0.4,0.5,0.8,0.5]
ax.set_ylim(10,800)

def plotTicker(ticker,startdate,enddate,fillcolor):
    r= webdata.get_data_yahoo(ticker,startdate,enddate)
    print(r.head())
    mpf.plot(r, type='candle', mav=(2, 5, 10), volume=True)
    ###plot the relative strength indicator
    ###adjusted close removes the impacts of splits and dividends
    prices = r['Adj Close']
    
    ###plot the price and volume data
    
    ax.plot(r.index,prices,color=fillcolor,lw=2,label=ticker)
    ax.legend(loc='upper right',shadow=True,fancybox=True) #shadow: 是否为图例边框添加阴影,fancybox: 是否将图例框的边角设为圆形
    '''
    #set the labels rotation and alignment
    for label in ax.get_xtickabels():    #get_xtickabels()也是用不了了,所以我直接注释了
        #To display date label slanting at 30 degreees
        label.set_rotation(30)
        label.set_horizontalalignment('right')
    '''  
    ax.fmt_xdata = mdates.DateFormatter('%Y-%m-%d')
    
#plot the tickers now
plotTicker('BIDU',startdate,enddate,'red')
plotTicker('GOOG',startdate,enddate,'#1066ee')
plotTicker('AMZN',startdate,enddate,'#506612')
               
plt.show()
上一篇:二叉树及其遍历方法---python实现


下一篇:一步步学敏捷开发:6、Scrum的3种工件