標籤:

Python在Finance上的應用3:處理股票數據基礎

歡迎來到Python for Finance教程系列的第3節。在本教程中,我們將使用股票數據進一步進行基本的數據處理和可視化。將要使用的開始代碼(在前面的教程中已經介紹過)是:

import datetime as dtnimport matplotlib.pyplot as pltnfrom matplotlib import stylenimport pandas as pdnimport pandas_datareader.data as webnstyle.use(ggplot)nndf = pd.read_csv(tsla.csv, parse_dates=True, index_col=0)n

Pandas 模塊 含有一系列的內置函數,以及自定義函數的方法。稍後我們將介紹一些自定義函數,但現在讓我們對這些數據執行一個非常常見的操作:移動平均法。

簡單移動平均(英語:simple moving average,SMA)是某變數之前n個數值的未作加權算術平均。例如,收市價的10日簡單移動平均指之前10日收市價的平均數。若設收市價為 p_{1}

p_{n} ,則方程式為:

SMA=frac{p_{1}+p_{2}+...+p_{n}}{n}

當計算連續的數值,一個新的數值加入,同時一個舊數值剔出,所以無需每次都重新逐個數值加起來:

{displaystyle SMA_{t1,n}=SMA_{t0,n}-{p_{1} over n}+{p_{n+1} over n}}

在Pandas 模塊實現上述功能十分簡單,例如100日均線

df[100ma] = df[Adj Close].rolling(window=100).mean()n

這裡df [100ma]列等同於應用移動平均方法創建的df [Adj Close]列,窗口時間為100,並且進行求平均值的操作。接著,嘗試輸出結果:

print(df.head())n

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參數:

df[100ma] = df[Adj Close].rolling(window=100,min_periods=0).mean()nprint(df.head())n

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

太棒了,它生效了,現在我們想看看它!但是之前已經看到了簡單的圖表,那麼我們讓它稍微複雜一些呢?

ax1 = plt.subplot2grid((6,1), (0,0), rowspan=5, colspan=1)nax2 = plt.subplot2grid((6,1), (5,0), rowspan=1, colspan=1,sharex=ax1)n

如果你想更進一步的了解subplot2grid, 請點擊這裡 subplots with Matplotlib tutorial.

這裡我們想要創建兩個子圖,而這兩個子圖都將像6x1網格一樣,有6行1列。第一個子圖從該網格上的(0,0)開始,跨越5行,並跨越1列。下一個軸也在6x1網格上,但是從(5,0)開始,跨越1行和1列。第二個軸也有sharex = ax1,這意味著ax2將始終將其x軸與ax1的x軸對齊,反之亦然。現在開始製圖:

ax1.plot(df.index, df[Adj Close])nax1.plot(df.index, df[100ma])nax2.bar(df.index, df[Volume])nplt.show()n

上述code,繪製了第一軸上的close和100ma,第二軸上的volume。結果如下:

最後,附上全部codes:

import datetime as dtnimport matplotlib.pyplot as pltnfrom matplotlib import stylenimport pandas as pdnimport pandas_datareader.data as webnstyle.use(ggplot)nndf = pd.read_csv(tsla.csv, parse_dates=True, index_col=0)ndf[100ma] = df[Adj Close].rolling(window=100, min_periods=0).mean()nprint(df.head())nnax1 = plt.subplot2grid((6,1), (0,0), rowspan=5, colspan=1)nax2 = plt.subplot2grid((6,1), (5,0), rowspan=1, colspan=1, sharex=ax1)nnax1.plot(df.index, df[Adj Close])nax1.plot(df.index, df[100ma])nax2.bar(df.index, df[Volume])nnplt.show()n

在接下來的幾個教程中,我們將學習如何通過Pandas數據重採樣製作K線圖,並學習更多關於使用Matplotlib的知識。本節原文請戳Basic stock data Manipulation - Python Programming for Finance p.3


推薦閱讀:

Python 滲透測試工具集
Python編程(bbb四):兩個實用的Python的裝飾器
如何從Python 3.4 升級到 Python 3.5?

TAG:Python | stock |