用一行Python代碼創(chuàng)建高級財務圖表
??點擊關注|選擇星標|干貨速遞??
今天帶大家一起學習一個小眾,但很厲害的可視化庫mplfinance,一起掌握最靈活的python庫來創(chuàng)建漂亮的金融可視化。
介紹
編程和技術應用于金融領域的激增是不可避免的,增長似乎從未下降。應用編程的最有趣的部分之一是歷史或實時股票數(shù)據(jù)的解釋和可視化。
現(xiàn)在,為了在 python 中可視化一般數(shù)據(jù),matplotlib、seaborn 等模塊開始發(fā)揮作用,但是,當談到可視化財務數(shù)據(jù)時,Plotly 將成為首選,因為它提供了具有交互式視覺效果的內置函數(shù)。在這里我想介紹一個無名英雄,它只不過是 mplfinance 庫 matplotlib 的兄弟庫。
我們都知道 matplotlib 包的多功能性,并且可以方便地繪制任何類型的數(shù)據(jù)。即使像燭臺這樣的金融圖表也可以使用 matplotlib 包繪制,但我們必須從頭開始。
最近,我開始知道有一個名為 mplfinance 的單獨模塊,專門用于創(chuàng)建高級金融可視化。在本文中,我們將深入研究這個 Python 庫,并探索其生成不同類型圖表的功能。
導入包
將所需的包導入到我們的 python 環(huán)境中是一個必不可少的步驟。在本文中,我們需要三個包,它們是處理數(shù)據(jù)幀的 Pandas、調用 API 和提取股票數(shù)據(jù)的requests,以及創(chuàng)建金融圖表的 mplfinance。對于尚未安裝這些軟件包的人,請將此代碼復制到你的終端中:
pip?install?pandas?
pip?install?requests
pip?install?mplfinance
完成安裝包后,是時候將它們導入到我們的 python 環(huán)境中了。
import?pandas?as?pd
import?requests
import?mplfinance?as?mf
提取股票數(shù)據(jù)
現(xiàn)在,我們已經導入了所有必要的包。讓我們使用12data.com[1]提供的 API 端點拉取亞馬遜的歷史股票數(shù)據(jù)。在此之前,12data.com上的一條說明:12data是領先的市場數(shù)據(jù)提供商之一,擁有適用于所有類型市場數(shù)據(jù)的大量 API 端點。與十二數(shù)據(jù)提供的 API 交互非常容易,并且擁有有史以來最好的文檔之一。此外,請確保你在12data.com上擁有一個帳戶,只有這樣,你才能訪問你的 API 密鑰(使用 API 提取數(shù)據(jù)的重要元素)。
Python實現(xiàn)
def?get_historical_data(symbol,?start_date):?
????api_key?=?'YOUR?API?KEY'?
????api_url?=?f'https://api.twelvedata.com/time_series?symbol={symbol}&interval=1day&outputsize=5000&apikey={api_key}'?
????raw_df?=?requests.?get(api_url).json()?
????df?=?pd.DataFrame(raw_df['values']).iloc[::-1].set_index('datetime').astype(float)?
????df?=?df[df.index?>=?start_date]?
????df.index?=?pd.to_datetime(df.index)?
????return?df?
amzn?=?get_historical_data('AMZN',?'2021-01-01')?
amzn.tail()
輸出:

代碼說明
我們做的第一件事是定義一個名為'get_historical_data'的函數(shù),該函數(shù)以股票代碼('symbol')和歷史數(shù)據(jù)的開始日期('start_date')為參數(shù)。
在函數(shù)內部,我們定義了 API 密鑰和 URL,并將它們存儲到各自的變量中。
接下來,我們使用'get'函數(shù)以 JSON 格式提取歷史數(shù)據(jù)并將其存儲到?'raw_df'變量中。在對原始 JSON 數(shù)據(jù)進行一些清理和格式化處理之后,我們以一個空的 Pandas DataFrame 的形式返回它。
最后,我們調用 created 函數(shù)來拉取亞馬遜從 2021 年初開始的歷史數(shù)據(jù),并將其存儲到"amzn"變量中。
OHLC圖
OHLC 圖表是一種條形圖,顯示每個時期的開盤價、最高價、最低價和收盤價。
OHLC 圖表很有用,因為它們顯示了一段時間內的四個主要數(shù)據(jù)點,許多交易者認為收盤價是最重要的。它也有助于顯示增加或減少的動量。開合相距較遠時表現(xiàn)強勁,開合相近時則表現(xiàn)優(yōu)柔寡斷或動能弱。
最高價和最低價顯示了該時期的完整價格范圍,有助于評估波動性1[2]。現(xiàn)在要使用 mplfinance 創(chuàng)建一個 OHLC 圖表,只需一行代碼:
mf.plot(amzn.iloc[:-50,:])
在上面的代碼中,我們首先調用該plot函數(shù),并在其中將我們之前提取的 Amazon OHLC 數(shù)據(jù)切片為最后 50 個讀數(shù),這樣做的目的只是使圖表更清晰,以便元素可見。上面的單行代碼將產生如下所示的輸出:

燭臺圖
交易者使用燭臺圖根據(jù)過去的模式確定可能的價格變動。燭臺在交易時很有用,因為它們在交易者指定的整個時間段內顯示四個價格點(開盤價、收盤價、最高價和最低價)。
這種類型的圖表最有趣的部分是它還可以幫助交易者閱讀情緒,這是市場本身的首要驅動因素?2[3]。要使用 mplfinance 生成燭臺圖,我們只需添加另一個參數(shù),即函數(shù)的type參數(shù)plot并candle在其中提及。代碼如下所示:
mf.plot(amzn.iloc[:-50,:],?type?=?'candle')
上面的代碼將生成一個如下所示的燭臺圖表:

磚形圖
磚形圖( Renko chart)是一種使用價格變動構建的圖表,而不是像大多數(shù)圖表那樣同時使用價格和標準化時間間隔。該圖表看起來像一系列磚塊,當價格移動指定的價格金額時會創(chuàng)建一個新磚塊,并且每個塊都與前一個磚塊成 45 度角(向上或向下)。Renko 圖表的主要用途是過濾掉噪音并幫助交易者更清楚地看到趨勢,因為所有小于框大小的運動都被過濾掉?3[4]?。
據(jù)我所知,mplfinance 是唯一提供 Renko 圖表的 Python 庫,也是我們接下來要看到的,這就是為什么這個包在金融可視化方面具有強大優(yōu)勢的原因。現(xiàn)在要創(chuàng)建一個 Renko,我們只需要在函數(shù)renko的type參數(shù)中指定plot。Renko 圖表的代碼如下所示:
mf.plot(amzn,?type?=?'renko')
我們還可以向plot函數(shù)添加一個額外的參數(shù),該參數(shù)是根據(jù)renko_params我們的需要和其他類似類型修改磚塊大小的參數(shù),但我更喜歡默認的。上面的代碼生成了一個看起來像這樣的磚形圖:

點數(shù)圖
點數(shù)圖,簡稱 P&F 圖,類似于 Renko 圖,它在不考慮時間流逝的情況下繪制資產的價格走勢。與其他一些類型的圖表(例如燭臺)相反,燭臺標志著資產在設定的時間段內的變動程度,而 P&F 圖表使用由堆疊的 X 或 O 組成的列,每個列代表一定數(shù)量的價格變動。X 代表價格上漲,而 O 代表價格下跌。當價格反轉反轉量?4[5]?時,會在 O 之后形成新的 X 列或在 X 之后形成新的 O 列。
支持點數(shù)圖的函數(shù)在其他地方找不到,只能在 mplfinance 庫中找到,而且它還使我們可以通過僅pnf在函數(shù)的type參數(shù)中指定來創(chuàng)建圖表的過程更容易plot。代碼如下所示:
mf.plot(amzn,?type?=?'pnf')

添加更多信息
mplfinance 包不僅限于生成不同類型的圖表,還使我們能夠通過添加簡單移動平均線 (SMA) 和交易量等附加指標使這些圖表更具洞察力。對于那些不知道這兩者的人來說,成交量是交易者在特定時間范圍內買賣的股票數(shù)量,而簡單移動平均線 (SMA) 只不過是特定時間段的平均價格。它是一種技術指標,廣泛用于創(chuàng)建交易策略。
用 matplotlib 繪制這些數(shù)據(jù)需要一千年,而 mplfinance 允許我們只用一行代碼就可以完成這項任務。除了type參數(shù)之外,我們只需要引入另外兩個參數(shù),一個是mav我們必須指定每個 SMA 的回溯期的參數(shù),另一個是volume我們必須提到的參數(shù),True?如果我們想將成交量圖添加到我們的圖表中,或者False?我們不想。這兩個指標的代碼如下所示:
mf.plot(amzn,?mav?=?(10,?20),?type?=?'candle',?volume?=?True)
可以通過兩種方式修改和試驗上述代碼。第一種方法顯然是嘗試不同類型的圖表。在上述代碼中,我們提到我們的圖表類型是燭臺,但你可以將其更改為 OHLC、Renko 甚至 P&F 圖表,并觀察每個圖表及其兩個附加指標的外觀。下一個方法是使用mav我們可以添加任意數(shù)量的具有不同回顧期的 SMA的參數(shù)。上述代碼的輸出如下所示:

保存圖片
如果你想知道如何保存這些財務可視化中的任何一個,只需添加另一個參數(shù),savefig即你只需提及其文件名的參數(shù),其余部分將被處理。假設你想保存上面的圖,那么你必須遵循的代碼如下所示:
mf.plot(amzn,?
????????mav?=?(10,?20),?
????????type?=?'candle',?
????????volume?=?True,?
????????savefig?=?'amzn.png')
這就是你為保存精彩的財務可視化所需要做的全部工作。很容易,對吧?
寫在最后
在我看來,與Plotly或Altair等庫相比,mplfinance是繪制金融數(shù)據(jù)最強大的庫。本文只是簡單介紹了使用mplfinance可以實現(xiàn)的功能,但是這個了不起的庫附帶了許多新特性。它允許我們添加自定義的技術指標數(shù)據(jù),并與實際的圖表一起繪制,我們可以自定義整個模板,甚至圖表中的每一個元素,添加趨勢線,等等。
這個庫最好的部分是它的易用性,并幫助我們用一行代碼生成高級的財務可視化。雖然像Plotly這樣的包有創(chuàng)建這些圖表的內置函數(shù),但不可能在一行代碼中完成。
mplfinance現(xiàn)在唯一的缺點是它糟糕的文檔,這使得人們甚至不知道這個包是關于什么的。文檔是一個至關重要的方面,當涉及到開源項目時,文檔應該被認為是至關重要的。特別像mplfinance這樣的關鍵和有用的項目必須有清晰文檔,對其提供的工具和功能有明確的解釋。
到這里,你看完了這篇文章。如果你忘記了圖表的代碼,不要擔心,最后我提供了完整的源代碼。你也可以收藏本文,等需要用到的時候再查看。
完整代碼
import?pandas?as?pd
import?requests
import?mplfinance?as?mf
#?Extracting?stock?data
def?get_historical_data(symbol,?start_date):
????api_key?=?'YOUR?API?KEY'
????api_url?=?f'https://api.twelvedata.com/time_series?symbol={symbol}&interval=1day&outputsize=5000&apikey={api_key}'
????raw_df?=?requests.get(api_url).json()
????df?=?pd.DataFrame(raw_df['values']).iloc[::-1].set_index('datetime').astype(float)
????df?=?df[df.index?>=?start_date]
????df.index?=?pd.to_datetime(df.index)
????return?df
amzn?=?get_historical_data('AMZN',?'2021-01-01')
amzn.tail()
#?1.?OHLC?Chart
mf.plot(amzn.iloc[:-50,:])
#?2.?Candlestick?Chart
mf.plot(amzn.iloc[:-50,:],?type?=?'candle')
#?3.?Renko?Chart
mf.plot(amzn,?type?=?'renko')
#?4.?Point?and?Figure?Chart
mf.plot(amzn,?type?=?'pnf')
#?5.?Technical?chart
mf.plot(amzn,?mav?=?(10,?20),?type?=?'candle',?volume?=?True)
#?6.?Plot?customization
mf.plot(amzn,?mav?=?(5,?10,?20),?type?=?'candle',?
????????volume?=?True,?figratio?=?(10,5),?
????????style?=?'binance',?title?=?'AMZN?STOCK?PRICE',?
????????tight_layout?=?True)
#?7.?Saving?the?plot
mf.plot(amzn,?mav?=?(5,?10,?20),?type?=?'candle',?
????????volume?=?True,?figratio?=?(10,5),?
????????style?=?'binance',?title?=?'AMZN?STOCK?PRICE',?
????????tight_layout?=?True,?savefig?=?'amzn.png')參考資料
12data.com:?https://twelvedata.com/
[2]?1:?https://www.investopedia.com/terms/o/ohlcchart.asp
[3]?2:?https://www.investopedia.com/trading/candlestick-charting-what-is-it
[4]?3:?https://www.investopedia.com/terms/r/renkochart.asp
[5]?4:?https://www.investopedia.com/terms/p/pointandfigurechart.asp
