Python在Finance上的应用3:处理股票数据基础

2020-02-19 14:30:16 浏览数 (1)

欢迎来到Python for Finance教程系列的第3节。在本教程中,我们将使用股票数据进一步进行基本的数据处理和可视化。将要使用的开始代码(在前面的教程中已经介绍过)是:


import datetime as dt import matplotlib.pyplot as plt from matplotlib import style import pandas as pd import pandas_datareader.data as web style.use('ggplot') df = pd.read_csv('tsla.csv', parse_dates=True, index_col=0)


Pandas 模块 含有一系列的内置函数,以及自定义函数的方法。稍后我们将介绍一些自定义函数,但现在让我们对这些数据执行一个非常常见的操作:移动平均法。

简单移动平均(英语:simple moving average,SMA)是某变数之前n个数值的未作加权算术平均。例如,收市价的10日简单移动平均指之前10日收市价的平均数。若设收市价p1至pn

则方程式为

当计算连续的数值,一个新的数值加入,同时一个旧数值剔出,所以无需每次都重新逐个数值加起来:

Pandas 模块实现上述功能十分简单,例如100日均

代码语言:javascript复制
df['100ma'] = df['Adj Close'].rolling(window=100).mean()

这里df ['100ma']列等同于应用移动平均方法创建的df ['Adj Close']列,窗口时间为100,并且进行求平均值的操作。接着,尝试输出结果:

代码语言:javascript复制
print(df.head())

Date Date Open High Low Close Volume 2010-06-29 2010-06-29 19.000000 25.00 17.540001 23.889999 18766300 2010-06-30 2010-06-30 25.790001 30.42 23.299999 23.830000 17187100 2010-07-01 2010-07-01 25.000000 25.92 20.270000 21.959999 8218800 2010-07-02 2010-07-02 23.000000 23.10 18.709999 19.200001 5139800 2010-07-06 2010-07-06 20.000000 20.00 15.830000 16.110001 6866900 Date Adj_Close 100ma 2010-06-29 23.889999 NaN 2010-06-30 23.830000 NaN 2010-07-01 21.959999 NaN 2010-07-02 19.200001 NaN 2010-07-06 16.110001 NaN

发生了什么?在100ma列下,只看到NaN。我们选择了100个移动平均线,理论上需要100个之前的数据点进行计算,但是在这里却没有任何数据在前100行。 NaN的意思是“Not a Number”。利用Pandas,可以用来处理大量的缺失数据,但现在,只须改变其中的min_periods参数:

代码语言:javascript复制
df['100ma'] = df['Adj Close'].rolling(window=100,min_periods=0).mean()
print(df.head())


Date Date Open High Low Close Volume 2010-06-29 2010-06-29 19.000000 25.00 17.540001 23.889999 18766300 2010-06-30 2010-06-30 25.790001 30.42 23.299999 23.830000 17187100 2010-07-01 2010-07-01 25.000000 25.92 20.270000 21.959999 8218800 2010-07-02 2010-07-02 23.000000 23.10 18.709999 19.200001 5139800 2010-07-06 2010-07-06 20.000000 20.00 15.830000 16.110001 6866900 Date Adj Close 100ma 2010-06-29 23.889999 23.889999 2010-06-30 23.830000 23.860000 2010-07-01 21.959999 23.226666 2010-07-02 19.200001 22.220000 2010-07-06 16.110001 20.998000


太棒了,它生效了,现在我们想看看它!但是之前已经看到了简单的图表,那么我们让它稍微复杂一些呢?

代码语言:javascript复制
ax1 = plt.subplot2grid((6,1), (0,0), rowspan=5, colspan=1)
ax2 = plt.subplot2grid((6,1), (5,0), rowspan=1, colspan=1,sharex=ax1)

如果你想更进一步的了解subplot2grid, 请点击这里 subplots with Matplotlib tutorial.

这里我们想要创建两个子图,而这两个子图都将像6x1网格一样,有6行1列。第一个子图从该网格上的(0,0)开始,跨越5行,并跨越1列。下一个轴也在6x1网格上,但是从(5,0)开始,跨越1行和1列。第二个轴也有sharex = ax1,这意味着ax2将始终将其x轴与ax1的x轴对齐,反之亦然。现在开始制图:


代码语言:javascript复制
ax1.plot(df.index, df['Adj Close'])
ax1.plot(df.index, df['100ma'])
ax2.bar(df.index, df['Volume'])
plt.show()

上述code,绘制了第一轴上的close和100ma,第二轴上的volume。结果如下:

最后,附上全部codes:


代码语言:javascript复制
import datetime as dt
import matplotlib.pyplot as plt
from matplotlib import style
import pandas as pd
import pandas_datareader.data as web
style.use('ggplot')df = pd.read_csv('tsla.csv', parse_dates=True, index_col=0)
df['100ma'] = df['Adj Close'].rolling(window=100, min_periods=0).mean()
print(df.head())ax1 = plt.subplot2grid((6,1), (0,0), rowspan=5, colspan=1)
ax2 = plt.subplot2grid((6,1), (5,0), rowspan=1, colspan=1, sharex=ax1)ax1.plot(df.index, df['Adj Close'])
ax1.plot(df.index, df['100ma'])
ax2.bar(df.index, df['Volume'])plt.show(

在接下来的几个教程中,我们将学习如何通过Pandas数据重采样制作K线图,并学习更多关于使用Matplotlib的知识。

0 人点赞