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日收市價的平均數。若設收市價為
至 ,則方程式為:
當計算連續的數值,一個新的數值加入,同時一個舊數值剔出,所以無需每次都重新逐個數值加起來:
在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 171871002010-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 NaN2010-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?