手把手教你使用Python绘制时间序列图
作者:Python进阶者 时间:2021-08-04 14:32:07
导读:分析时间序列数据的一种简单而有效的方法就是将时间序列数据可视化在一个图表上,这样我们就可以从中推断出某些假设。本文将以股价数据集为例,指导你从Quandl下载股价数据集,并将这些数据绘制在价格和成交量图表上。还将教大家绘制烛台图,比起直线图表,这将给我们更多的信息。
01从Quandl检索数据集
Quandl简介
Quandl是一个为金融、经济和另类数据服务的平台,这些数据由各种数据发布商提供,包括联合国、世界银行、中央银行、贸易交易所和投资研究公司。
使用Python的Quandl模块,你可以轻松地将金融数据导入Python中。Quandl提供免费的数据集,其中包括一些数据样本,但如果你需要访问一些优质的数据产品,就必须要先付费。
将数据从Quandl导入到Python中的过程非常简单,假如我们对泛欧交易所的荷兰银行集团感兴趣,只需要在Jupyter Notebook单元格中输入以下代码(这个数据集在Quandl上的代码为EURONEXT/ABN):
In[]:
import quandl
#Replace with your own Quandl API key QUANDL_API_KEY="BCzkk3NDWt7H9yjzx-DY'
quandl.ApiConfig.api_key=QUANDL_API_KEY
df =quandl.get('EURONEXT/ABN')
将Quandl的API密钥存储在常量变量中是一个很好的习惯,如果API密钥发生改变,只需要在这一个地方修改它!
导入quandl包后,我们将Quandl的 API密钥存储在常量变量QUANDL_API_KEY中。这个常量值用于设置Quandl模块的API密钥,并且只需要对quandl包的每个导入执行一次。最后一行调用quandl.get()指令,将ABN数据集从Quandl直接下载到df变量中。(注意:EURONEXT是数据提供者Euronext Stock Exchange的缩写。)
默认情况下,Quandl会将数据集导入到pandas模块的DataFrame中。我们可以用如下代码来检查DataFrame的头和尾:
In[]:
df:head()
out[]:
OPen High Low Last Volume Turnower
Date
2015-11-20 18.18 18.43 18.000 18.35 38392898.0 7.003281e+08
2015-11-23 18.45 18.70 18.215 18.61 3352514.0 6.186446e+07
2015-11-24 18.70 18.80 18.370 18.80 4871901.0 8.994087e+07
2015-11-25 18.85 19.50 18.770 19.45 4802607.0 9.153862e+07
2015-11-26 19.48 19.67 19.410 19.43 1648481.0 3.220713e+07
In[]:
df:tail()
Out []:
OPen High Low Last Volume Turnower
Date
2018-08-06 23.50 23.53 23.23 23.34 1126371.0 2.634333e+07
2018-08-07 23.59 23.60 23.31 23.33 1785613.0 4.177652e+07
2018-08-08 24.00 24.39 23.83 24.14 4165320.0 1.007085e+08
2018-08-09 24.40 24.46 24.15 24.37 2422470.0 5.895752e107
2018-08-10 23.70 23.94 23.28 23.51 3951850.0 9.336493e+07
默认情况下,head()和tail()命令分别显示的是DataFrame的前5行和最后5行,你可以把它传递的参数设置成一个具体的数字来定义要显示的行数。例如,head(100)将显示DataFrame中的前100行。
如果你没有为get()命令设置任何附加参数,那么它将会检索整个时间序列数据集,即从你进行操作时的前一个工作日一直到2015年11月。
要可视化这个DataFrame,我们可以通过plot()命令绘制一个图
In[]:
%matplotlib inline
import matplotlib.pyplot as plt
df.plot();
运行结果如下图所示。
pandas的plot()命令将返回一个Axis对象,此对象的字符串表示将与plot()命令一起显示在界面上。为了消除这个信息,我们在最后一条语句的末尾添加一个分号“;”。或者,我们也可以在单元格底部添加一条pass语句。除此之外,我们还可以将绘图函数分配给一个变量,这样也能消除这个输出。
默认情况下,pandas的plot()命令用matplotlib库来显示图像,如果系统报错的话,请检查你是否安装了这个库,并且%matplotlib inline命令至少被调用过一次。你可以自定义图表的外观,有关DataFrame中plot命令的更多信息,可在以下网页上找到:https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.plot.html
02绘制收盘价与成交量的关系图
当没有参数提供给plot()命令时,它会用DataFrame的所有列在同一图表上绘制折线图,我们无法从这个杂乱无章的图像中得到什么有用的信息。为了有效地从这些数据中提取信息,我们可以绘制一只股票的收盘价与成交量的关系图。
在单元格中输入以下命令:
In[]:
princes=df[‘Last']
volumes=df[‘Volume']
上述命令会将我们感兴趣的数据分别存储到closing_prices和volumes这两个变量中,我们可以继续使用head()和tail()命令查看由此产生的pandas数据类型的头部和底部:
In[]:
Prices .head()
out[]:
Date
...
2015-11-20 18.35
2015-11-23 18.61
2015-11-24 18.80
2015-11-25 19.45
2015-11-26 19.43
Name: Last,dtype:float64
In[]:
volumes.tail()
out[]:
Date
2018-08-031252024.0
2018-08-061126371.0
2018-08-071785613.0
2018-08-084165320.0
2018-08-09。2422470.0
Name:Volume,dtype:float64
如果你想知道某个特定变量的类型,可以使用type()命令。比如,type(volumes)命令的运行结果是 pandas.core.series.Series,这样我们就知道volumes是属于pandas序列数据类型的。
从2018年一直追溯到2015年都有数据可查,这样就可以绘制收盘价与成交量的关系图:
In[]:
#The top Plot consisting of daily closing Prices
top=plt.subplot2grid((4,4),(0,0),rowspan=3,colspan=4)
top .plot(Prices.index,Prices,1abel='Last')
Plt.title('ABN Last Price from 2015 - 2018')
plt.legend(loc=2)
#The bottom Plot consisting of daily trading volume
bottom=plt.subplot2grid((4,4),(3,0),rowspan=1,colspan=4)
bottom.bar(volumes.index,volumes)
plt.title('ABN Daily Trading Volume')
Plt.gcf () .set_size_inches(12,8)
plt.subplots_adjust(hspace=0.75)
运行结果如下图所示。
在第一行中,subplot2grid命令的第一个参数(4,4)将整个图划分为一个4x4的网格,第二个参数(0,0)表明绘图将锚定在图形的左上角。rowspan=3指示绘图将占据网格上4个可用行中的3行,即实际高度为图形的75%;colspan=4指示绘图将占用网格的所有4列,即使用其所有可用宽度。这个命令会返回一个matplotlib axis对象,我们将使用该对象绘制图形的上部。
在第二行中,使用plot()命令绘制上图表,x轴为日期值,y轴上的数值为收盘价格。在接下来的两行中,我们指定了当前图像的标题以及放置在左上角的时间序列数据的图例。
接下来,我们重复上述操作,在下部呈现每日交易量,这个图表锚定在下方1行4列的网格空间中。
为了让图像更清楚,我们调用set_size_inches()命令将图形设置为9英寸宽6英寸高,从而形成了一个矩形图形(前面的gcf()命令表示获取当前的尺寸)。最后,我们调用带有hspace参数的subplots_adjust()命令,在上部和下部的两个子图之间添加少量的空缺。
subplots_adjust()命令用来对各个子图的布局进行优化,它可以接受的参数有:left、right、bottom、top、wspace、hspace。
03绘制烛台图
烛台图是另一种流行的财务图表,它显示的信息比单一的价格图更多。烛台是每一个特定时间点的波动,其中包含四种重要的信息:开盘价、最高价、最低价和收盘价。
我们现在不再推荐使用以前的matplotlib.finance模块,用另一个由提取的代码组成的mpl_finance包来取代它,你可以在命令行窗口输入以下代码来获取这个包:
$pip install mpl-finance
为了更加方便地可视化烛台图,我们将使用ABN数据集的一个子集。在下面的例子中,我们在Quandl上检索2018年7月份的每日价格作为数据集,并绘制如下的烛台图:
In[]:
%matplotlib inline
import quandl
from mpl_finance import candlestick_ohlc
import matplotlib.dates as mdates
import matplotlib.pyplot as plt
quandl.ApiConfig.api kcy-QUANDL API KEY
df_subset-quandl.get('EURONEXT/ABN',
start_date='2018-07-01",
ena_date='2018-07-31')
df_subset['Date'"]=df_subset.indqex.map(mdates.dqate2num)
df_ohlc=df_subset[['Date','Open','High','Low','Last']]
figure,ax=plt.sSubPlots(figsize= =(8,4))
formatter=mdates.DateFormatter('%Y-%m-%d')
ax.xaxis.set_major_formatter(formatter)
candlestick_ohlc(ax
df_ohlc.values,
width=0.8,
colorup='green',
colordown='red')
plt.show()
烛台图如下图所示。
你可以在quandl.get()命令中定义start_date和end_date的值,从而指定数据集的时间范围。
从Quandl检索的价格会放在一个名为df_dataset的变量中,由于matplotlib的绘图函数需要自己的格式,我们用mdates.date2num命令转换包含日期和时间在内的索引值,并将它们放在名为Date的新列中。
烛台的日期、开盘价、最高价、最低价和收盘价等数据将被提取为一个DataFrame列存储在df_ohlc变量中。plt.subplots()函数会创建一个8英寸宽和4英寸高的图形,其中沿着x轴的标签将被转换为我们可读的格式。
调用candlestick_ohlc()命令来进行烛台图的绘制(烛台宽度为0.8或全天宽度的80%),收盘价高于开盘价的上涨用浅灰色表示,而收盘价低于开盘价的下跌则用深灰色表示。最后,用plt.show()命令来显示烛台图。
来源:https://blog.csdn.net/pdcfighting/article/details/120108244