Python在經濟方面的妙用!

點擊上方關注,All in AI中國

在本系列的第1部分(https://towardsdatascience.com/python-for-finance-stock-portfolio-analyses-6da4c3e61054)中,我討論瞭如何使用pandas來顯著地增加Python在財務分析方面的能力。在第1部分中,我們回顧瞭如何利用pandas和Yahoo Finance API來自動跟蹤和評量(多種)股票組合表現的基準。在那篇文章的末尾,你生成了一個豐富的數據集,可以計算出在相同的持有期內,投資組合頭寸相對於同等大小的標準普爾500指數頭寸的相對百分比和美元價值回報。如果你投資標準普爾500 指數基金的話,你還可以確定每個頭寸對你的整體投資回報有多大的貢獻。最後,你使用Ploely進行可視化,這使你更容易理解哪些頭寸驅動了最大的價值,它們的YTD(YTD:一定時期的資產負債表應反映年初至今的經營情況)相對於標準普爾500指數而言是什麼樣子的,如果有任何頭寸下跌,你可能會考慮拋售,也就是遇到了"尾盤止損"。

Python在經濟方面的妙用!

我參與了在Jupyter筆記本上構建的部分初始過程,我學到了很多東西。我也發現寫一個在Jupyter筆記本的"心路歷程"很有幫助。這既解釋了代碼,也將我的想法與可視化聯繫了起來。這樣一來,我所做的將比原來花費的時間更短,其目的也將更加直接。我一直在尋找/創建一個更加有用的筆記本來跟蹤我的股票投資組合,我打算學習合併一個Python構建分析儀表盤/web應用程序的框架。對我來說,這樣做最重要的一個目的是能夠選擇特定的位置和所需的時間框架,並評估每個位置的相對性能。在未來,我很可能會將這個評估案例擴展到我並不擁有但考慮收購的位置。在今年剩下的時間裡,我希望通過學習Flask並使用Heroku部署應用程序,並儘可能地開發某種類型的數據管道來自動提取和加載最終web應用程序的新數據,進一步加深對構建web應用程序的理解。雖然我在這個過程中還處於探索階段,但在這篇文章中,我將討論上次討論過的筆記本的擴展,最初使用的是Dash by Plotly,在這裡簡稱為Dash。

Dash by Plotly

如果你已經閱讀或參考了第1部分,你將會看到,一旦創建了主要dataframe,你會使用Ploly生成可視化,用於評估相對於標準普爾500指數的投資組合績效。Plotly是一個非常豐富的庫,相對於其他Python可視化庫(如Seaborn和Matplotlib),我更喜歡用它來創建可視化。在此基礎上,最終目標是為我的投資組合分析提供一個交互式儀表盤/ web應用程序。我一直在為這個問題尋找最優解,同時我已經開始探索如何使用Dash。明確地將Dash(https://plot.ly/products/dash/)定義為用於構建web應用程序的Python框架,因為這樣做是不需要JavaScript的。正如我鏈接到的登陸頁面所顯示的,它構建在Plotly.js、Reaction和Flask之上。

到目前為止,我認為這樣做的好處是,一旦你熟悉並適應了Plotly,你對Dash的使用就會如魚得水。相較於簡單地將你的可視化放在Jupyter筆記本中進行分析,我認為創建一個獨立的、交互式的web應用程序是有價值的。Dash提供了更多的交互性,以及展現了使用"下拉、滑塊和圖形等現代UI元素"操作數據的能力。這些功能非常有利於我對股票投資組合的分析,比如說進行"如果怎樣,會發生什麼"的推斷,以及交互研究潛在機會,並迅速瞭解關鍵的驅動因素和場景。考慮到所有這些,Dash的學習曲線,至少對我來說,並不是微不足道的。

Jose Portilla的"交互式Python儀表盤和Plotly and Dash"

為了縮短我閱讀和廣泛查找Dash文件所需的時間,我參加了Jose Portilla(https://medium.com/@josemarcialportilla)教授在Udemy是講述的Plotly and Dash課程(https://www.udemy.com/interactive-python-dashboards-with-plotly-and-dash/)。該課程的詳細頁面可以在這裡找到。我已經學習教授的一些課程,現在正在學習他的Flask課程。我認為他是一位非常出色和有幫助的講師——儘管他通常不把豐富的編程經驗作為課程的先決條件,但在這門Dash課程中,他確實建議至少要對Python有一定的瞭解。特別強烈建議對Plotly用於可視化的語法有一個紮實的理解,包括使用pandas。需要強調的是,即便上完這門課之後,你對如何使用Dash來構建的理解依舊很淺。但是,這門課程非常有幫助,因為Jose在他的例子中使用了datareader,也使用了財務數據,包括動態提取股票價格圖表。

移植來自Jupyter筆記本的數據,以便在Dash中與其進行交互

開始

與第1部分類似,我在GitHub上創建了另一個repo(https://github.com/kdboller/pythonsp500-plotly-dash),其中包含創建最終儀表盤所需的所有文件和代碼。

下面是對所包含內容的總結,以及如何開始:

1.Investment Portfolio Python Notebook_Dash_blog_example.ipynb ,這與第1部分中的Jupyter筆記本非常相似;新增的部分包括最後兩個部分:"股票回報比較"部分(我在使用Dash之前構建了這個部分作為概念驗證)和"數據輸出"部分(我創建分析生成的數據的csv文件);它們作為儀表盤中使用的數據源。

2.Sample stocks acquisition dates_costs.xlsx,你可以使用它修改你的組合評估。

3.requirements.txt,這應該包含你需要的所有庫。我建議在Anaconda中創建一個虛擬環境,後面將進一步討論。

4.Mock_Portfolio_Dash.py ,這是儀表盤的代碼,我們將在下面介紹。

根據repo的自述文件(https://github.com/kdboller/pythonsp500-plotly-dash/blob/master/README.md),我建議使用Anaconda創建一個虛擬環境。

我推薦使用Python 3.6或更高版本,這樣你就可以使用提供的csv文件在本地運行Dash儀表盤了(https://medium.freecodecamp.org/why-you-need-python-environments-and-how-to-manage-them-with-conda-85f155f4353c)。這裡有一個關於如何在Anaconda中建立虛擬環境的非常詳盡的解釋。

最後,如第1部分中所提到的,一旦你的環境設置好了,除了需求文件中的庫之外,如果你希望在筆記本中運行Yahoo Finance datareader的部分片段,你還需要在虛擬環境中安裝fix-yahoo-finance。

和Dash一起工作

如果你已經使用Python 3.6創建了一個虛擬環境,並且已經安裝了必要的庫,那麼你應該能夠使用代碼運行Python文件。

對於那些不太熟悉的人:一旦進入虛擬環境,你將需要將目錄CD更改為保存repo文件的位置。舉一個簡單的例子,如果你打開Anaconda提示符,並且你在文檔文件夾中,並且文件保存在你的桌面上,你可以執行以下操作。

Python在經濟方面的妙用!

Python在經濟方面的妙用!

如果你想要對Jupyter筆記本進行完整的解釋並生成投資組合數據集,請參閱第1部分。在Jupyter筆記本的末尾,你將在"數據輸出"一節中看到下面的代碼。這些小的添加將把CSV文件發送到你的本地目錄。第一個是完整的投資組合數據集,你可以從中生成所有的可視化,第二個數據集提供了在第一個新股票圖表的下拉選擇中使用的代碼列表。

Python在經濟方面的妙用!

我將重點介紹Mock Portfolio Python文件的一些關鍵方面,並分享如何在本地運行儀表盤。

作為參考,當我們分解.py文件時,下面是運行這個儀表盤時應該看到的前三個圖表的屏幕抓取。

Python在經濟方面的妙用!

在.py文件的開頭,導入requments.txt文件中包含的庫,然後編寫

Python在經濟方面的妙用!

為了實例化Dash應用程序,然後創建兩個dataframe對象、tickers和data。tickers將用於圖表中的一個下拉列表中的股票代碼,(data)Dataaframe將是用於所有可視化評估的最終數據集。

你將整個儀表盤封裝在一個Div中,然後開始在這個Div中添加圖表組件。py文件中的第35-72行生成"相對回報比較"圖表,包括股票符號下拉、開始/結束日期範圍、提交按鈕和圖表的輸出。為了簡潔起見,我將在.py文件的這一部分中分解這三個部分中的第一個部分。

Python在經濟方面的妙用!

Python在經濟方面的妙用!

如前所述,使用Dash意味著不需要嚮應用程序添加JavaScript。在上面的代碼塊中,我們用H1標記標記輸出,創建另一個Div,然後使用dash_core_components庫中的下拉列表。將id設置為"my_ticker_symbol",我們將簡要地回顧一下它的作用,從tickers dataframe中設置"SPY"的默認值,然後將multi-select設置為True。這裡要聯繫到學習曲線,至少對我來說是這樣,這就是Jose Portilla的課程通過提供概括總結具體例子來縮短你的學習週期的地方。Jose實際上在他的課程中使用了一個類似於股票列表下拉列表和日期範圍選擇器的例子。

在下面的第75-93行中,你將看到儀表盤上的左下角圖表的代碼。此圖表與第1部分中的Jupyter筆記本提供的相同,但我發現dash與Jupyter筆記本相比,儀表盤佈局中的所有這些輸出都是更好的方便用戶體驗。

Python在經濟方面的妙用!

Python在經濟方面的妙用!

Python在經濟方面的妙用!

對於喜歡使用Plotly的人來說,在創建繪製Plotly圖形所需的數據和佈局對象以及語法方面應該很熟悉。上面所包含的語法與筆記本中用於圖表的語法不同,因為我更喜歡創建跟蹤,基於這些跟蹤生成數據對象,並使用dict語法在佈局對象中。在學習Jose的課程時,我發現在dash中,出現括號,大括號時,它有時會變得"笨拙",因此我將重點放在了適應這種結構上。

Python在經濟方面的妙用!

Python在經濟方面的妙用!

Python在經濟方面的妙用!

第229-252行(上面提供)驅動第一個"相對回報比較"圖表的交互性。下面是這段代碼的簡要概述:

為了創建交互式圖表,Dash使用了回調修飾符:我們的應用程序接口的"輸入"和"輸出"是通過app.callback decorator。(https://dash.plot.ly/getting-started-part-2)

在應用程序回調中,我們輸出前面用id'my_gram'指定的dcc.gram。

你使用Submit按鈕作為輸入,我們有三個默認狀態,"my_ticker_symbol",dcc.Dropdown中聲明瞭默認的"SPY"值。以及默認的開始日期1/1/2018和結束日期,即今天。

回調下面是回調裝飾器包裝的函數。正如Dash文件中所描述的,當輸入屬性發生變化時,裝飾器包裝的函數將自動調用。Dash為函數提供輸入屬性的新值作為輸入參數,Dash用函數返回的內容更新輸出組件的屬性。

在for循環中,y值除以任意一天的收盤價,df['Close'],按所提供的日期範圍生成的系列中的第一個收盤價(df['Close'].iloc[0]).

我這樣做是為了查看兩個或更多股票的相對錶現。指數為0,這是日期範圍的開始。鑑於股票價格的巨大差異,這使得比較1800美元以上的股票交易(例如AMZN)與低於100美元的另一種交易(如WMT)的相對錶現更為容易。

有時會有一種誤解,即如果一隻股票的交易價格較低,那麼它就是"便宜"的;如果它的交易價格低於AMZN,那麼它就是"昂貴"的。鑑於這種誤解,公司有時會拆分他們的股票,以便讓小投資者更能負擔得起股價,儘管公司的市值保持不變。

不管怎樣,這張圖表的好處是,它允許你使用動態日期快速地發現相對於標準普爾500指數,那些股票表現不佳。這提供了有關整體投資組合的有用信息,以及考慮何時剝離表現不佳的持股依據。

Python在經濟方面的妙用!

結論和未來的考慮

這結束了我對Dash股票投資組合分析的初步回顧。和以前一樣,你有一個可擴展的Jupyter筆記本和組合數據集,你現在可以將其作為CSV文件讀取並在交互式儀表盤中查看。正如前面在第一部分中討論的那樣,這一辦法仍然有一些需要改進的領域,包括需要將股利作為股東總回報的一部分,以及需要能夠同時評估活躍的和全部(包括已被剝離的)頭寸。

我發現這種方法最重要的好處比如額外的交互性,亦或者我更喜歡所有圖表的儀表盤佈局,而不是Jupyter筆記本中單獨的單元格。在未來,我計劃納入更多的互動性,包括更多的"如果怎樣,會怎樣"的分析,以評估個人股票對整體表現的貢獻。

我目前正在考慮的使用數據管道交付端到端web應用程序的其他選項包括:

使用谷歌BigQuery的模式分析:模式的好處包括它已經支持豐富的可視化(不需要編碼),包括內置在Python筆記本中。然而,我不相信在模式中有一種方法可以從一個金融API中提取數據,包括YahooFinance和IEX。這些API源的數據可以讀入私有數據庫,例如,使用谷歌BigQuery,你可以連接到該模式。然而,就目前而言,這似乎是一個限制,因為我相信更多的未來圖表和用例將需要從API中提取數據(而不是存儲在數據庫中)。

帶有Postgres和Pipeline(管道)的Heroku:作為Jose課程的一部分,他向你展示瞭如何將Dashapp部署到Heroku。到目前為止,我相信利用Heroku是一種潛在的長期解決方案。這是我選擇Jose的FlaskCourse的另一個原因;我從未構建過Web應用程序,他展示瞭如何使用SQLAlchemy作為Flask應用程序的數據庫。進一步加深了我對在Heroku上部署帶有數據庫的應用程序的理解,我的重點將是確定在交互式Web應用程序中分析金融API數據的最佳方法,我可以在指定的時間表上使用新的數據刷新該應用程序。

Python在經濟方面的妙用!


分享到:


相關文章: