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

  • 2020 年 2 月 19 日
  • 筆記

歡迎來到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日均

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

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

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

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


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

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.

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


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:


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的知識。