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()
