Python在Finance上的應用4 :處理股票數據進階

  • 2020 年 2 月 10 日
  • 筆記

歡迎來到Python for Finance教程系列的第4部分。 在本教程中,我們將基於Adj Close列創建燭形/ OHLC圖,這將允許我介紹重新取樣和其他一些數據可視化概念。

名為燭形圖的OHLC圖表是一種將開盤價,最高價,最低價和收盤價數據全部集中在一個很好的格式中的圖表。 另外,它有漂亮的顏色和前面提到的美麗的圖表?

在之前的教程中已經涉及的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(r"C:UsersHPDesktopTSLA.csv", parse_dates=True, index_col=0)

不幸的是,即使創建OHLC數據,也不能直接從Pandas利用內置函數製作燭形圖。我確信這個圖表類型終有一天將會被提供,現在不是沒關係,但我們會做到這一點! 首先,我們需要導入兩個庫

from matplotlib.finance import candlestick_ohlc  import matplotlib.dates as mdates

第一個導入是來自matplotlib的OHLC圖形類型,第二個導入是特殊的mdates類型,這是matplotlib圖形的日期類型。Pandas自動為你處理,但就像我說的那樣,我們沒有燭形圖的奢侈品。

首先,我們需要適當的OHLC數據。 目前的數據確實有OHLC的價值,除非我錯了,特斯拉從未有過送轉,但你永遠不會是這樣的幸運。 因此,我們將創建自己的OHLC數據,這也將使能夠顯示來自Pandas的另一個數據轉換:

df_ohlc = df['Adj Close'].resample('10D').ohlc()

我們在這裡所做的是創建一個基於df ['Adj Close']列的新數據框,重新封裝10天的窗口,並且重取樣是一個ohlc(開高低關閉)。我們也可以用.mean()或.sum()做10天的平均值或10天的總和。請記住,這10天的平均值是10天的平均值,而不是移動平均值。由於我們的數據是每日數據,因此將其重新取樣為10天的數據會顯著縮小數據的大小。這是你可以如何規範化多個數據集。有時,您可能會在每個月的一個月初記錄一次數據,每個月末記錄的其他數據,以可能終每周記錄一些數據。您可以將該數據框重新取樣到月末,每個月,並有效地將所有數據歸一化!如果你喜歡的話,這是更高級的Pandas功能,你可以從中了解更多。

我們想要繪製燭形數據以及成交量數據。我們不必重新取樣數據,應該,因為它與10D定價數據相比太細緻。

df_volume = df['Volume'].resample('10D').sum()

在這對成交量求和,因為我們確實想知道這10天內交易的總量,但也可以使用平均值。 現在如果我們這樣做:

print(df_ohlc.head())

得到:

open     high     low   closeDate  2015-01-01  222.410  222.410  191.87  191.93  2015-01-21  196.570  220.990  196.57  217.48  2015-02-10  216.290  217.110  202.88  203.34  2015-03-02  197.325  202.435  188.68  198.08  2015-03-22  199.630  210.900  185.00  210.90

正如之前想的一樣,現在想要將這些資訊移動到matplotlib中,並將日期轉換為mdates版本。 由於僅僅只要在Matplotlib中繪製列,所以實際上不希望日期成為索引,可以這樣做:

df_ohlc = df_ohlc.reset_index()

現在的日期只是一個普通的列。 接下來,我們要轉換它:

df_ohlc['Date'] = df_ohlc['Date'].map(mdates.date2num)

接下來開始製圖:

fig = plt.figure()  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.xaxis_date()

除了ax1.xaxis_date()之外,已經看到過的所有內容。 這對我們來說就是將軸從原始的生成號碼轉換為日期。

現在我們可以繪製燭形圖:

candlestick_ohlc(ax1, df_ohlc.values, width=2, colorup='g')

接著加上成交量:

ax2.fill_between(df_volume.index.map(mdates.date2num), df_volume.values, 0)

fill_between函數將繪製x,y,然後填充/之間的內容。 在我們的例子中,我們選擇0。

plt.show()