前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python在Finance上的应用3:处理股票数据基础

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

作者头像
用户6021891
发布2020-02-19 14:30:16
6930
发布2020-02-19 14:30:16
举报
文章被收录于专栏:万能的小草万能的小草

欢迎来到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的知识。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-01-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 小草学Python和SQL 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档