Python與金融:為你的電子表格加速(1)

Python与金融:为你的电子表格加速(1)

概要

  • 為什麼Python是金融專業人士需要學習的一種很棒的編程語言?

  • Python在金融領域有哪些應用實例?


“對於長期依賴電子表格的職業來說,Python是很有價值的。花旗集團,一家美國銀行,為它的實習分析師們引入了Python語言的速成課程。”——《經濟學人》

長期以來,金融專業人員都可以在Excel中使用VBA(Visual Basic宏語言)來構建自定義功能和自動化工作流。隨著近年來谷歌工作表成為電子表格領域的有力競爭者,谷歌應用程序腳本(Google Apps Script)現在提供了一個額外的選擇。

但是,我想提請大家關注第三種可行方案,Python編程語言,它在許多領域中都非常流行。

在這篇文章中,我將提供一些你可以使用的Python實現的例子,從語言本身概述開始,以及為什麼它在很多領域如此受歡迎,包括web開發、機器學習、金融、科學、和教育,僅舉幾例。第二部分由一個循序漸進的教程組成。

我寫這篇文章的目的是幫助你決定Python是否足夠吸引你,以便考慮將其添加到你的財務工具箱中。如果你想跨出這一步,有很多應用程序、課程、視頻、文章、書籍和博客文章等可以幫助你學習這門語言。在文章的最後,我列出了一些一路上對我很有幫助的資源。

用例:我使用Python處理任務的一些例子

上世紀80年代中期,我開始在Oricon1系統上學習BASIC編程語言的基礎知識。那時BASIC是最常見的初學者語言。我在80年代末到90年代中期涉獵的其他語言還有Pascal和C,但我從來沒有在任何專業領域使用過它們,我也不期望需要或使用編程技能。據我所知,在90年代末,金融和編程是兩個完全不同的領域,當時我選擇了金融這條職業道路。

直到2012年,我想把編程作為一種愛好,所以我開始研究當時可用的語言。事實證明已經發生了很多事情,當我遇到Python時,我被它迷住了,原因有很多,我將在下一節中概述。從那時起,我用Python完成了從小型腳本到大型項目的各種任務,包括個人的和專業的。其中許多(但不是全部)都涉及電子表格,這是許多金融專業人士的工作臺。

下面是一些電子表格和Python可以很好地結合在一起的例子:

1. 在併購整合PMO設置中跟蹤數百項活動

我的工作涉及企業併購(M&A,Mergers and Acquisitions)交易的方方面面,不僅僅是執行,還有整合。在最近的一個案例中, 除了在第一個100天計劃中運用看板跟蹤任何給定時間數以百計的活動外,項目管理部(PMO,Project Management Office)決定採用混合的項目和工程管理方法,為12個整合的工作流中每一個的高層計劃使用瀑布式規劃和Gantt charts (甘特圖)。所選擇的看板工具MeisterTask具有許多統計和報告特性,但是我們的需求不僅僅是分析和表示,這需要定製的解決方案。這是我使用Python自動化的工作流程:

  1. 1每週將整個板塊的狀態保存為一個CSV文件。

  2. 2.將所有歷史CSV文件讀入Pandas DataFrame中。

  3. 3.對數據進行排序、篩選、分組並將其處理成我們希望如何跟蹤進度的一致格式(根據活動、工作流等的狀態)。

  4. 4.將輸出寫入到Excel文件,每個表的分析的數據將輸出到其來源表,其格式可以簡單地複製和粘貼到think-cell圖表(一款圖表創建工具)中。

  5. 5.為每月的指導委員會會議報告包創建表格和圖表。

開發腳本需要幾個小時的前期投資,但是現在,為指導委員會會議或特別分析更新報告包只需要幾分鐘。從字面上講,大約需要30秒的時間進入正確的文件夾,用一行命令運行腳本,然後花幾分鐘將輸出複製粘貼到幻燈片組中。隨著大約500個活動(卡片)跨越12個工作流,差不多需要執行大約一個月,每週跟蹤它們如何移動,在兩年的規定時間軸中,你很快就會發現自己要處理很多文件中的數千個,甚至是數萬個數據點。沒有自動化,我們在這裡討論的就是一些非常乏味的任務。

在採用老辦法繼續工作還是通過設置自動化來增加初始工作量之間進行“金錢的時間價值”權衡是金融領域的一個永恆主題。在這個過程的第一步中,我也做了類似的決定,將數據導出為CSV文件。和許多現代web應用程序一樣,MeisterTask有一個API,可以連接到你的Python應用程序,但是設置它所花費的時間將遠遠超過我們這裡的用例所節省的時間。

因此,正如你所看到的,通常最佳解決方案是自動化工作流的某些步驟,並保持其他步驟是手動的。

2. 使用Web抓取、谷歌Maps API和Excel分析房價統計數據

另一個例子是我出於個人興趣所做的事情,但是我想強調一下,因為它包含Python實用程序的其他一些有趣的元素:

  1. 1.蒐集某一地區的房產信息,包括地址、面積、房數、標價以及其他特性;總共有幾百到一千行信息。

  2. 2.保存到Python數據結構中。

  3. 3.連接到谷歌Maps API,併為每個列表檢索屬性與關鍵地標(如大海、城市中心、最近的火車站、最近的機場等)之間的距離。

  4. 4.將數據導出到一個Excel文件。

  5. 5.使用標準Excel功能來對數據運行迴歸,計算統計數據,並創建標準度量的圖表,例如每平方米的價格和到地標的距離。

這裡的結果可以結合你個人的偏好權重,以及在尋找房產時的財務限制。

這僅僅是兩個例子,重點是自動化與電子表格相關的工作和新添加特性,但是使用Python的機會幾乎是無窮無盡的。在下一節中,我將概述它變得如此流行的原因,然後再逐步學習Python中的Monte Carl模擬教程。

為什麼Python是金融專業人士的最佳選擇

Python編程語言從1990年左右就出現了,但是直到最近幾年它才開始流行起來。

Python与金融:为你的电子表格加速(1)

Python開始流行主要有以下幾個原因,我們依次來看一下。

1.Python是一種高級編程語言

高級編程語言是一種抽象化了計算機內部工作的許多細節的語言。內存管理就是一個很好的例子。低級編程語言需要 詳細瞭解計算機內存的佈局、分配和釋放的複雜性,以及處理任務所需的時間和代碼量。Python將這些進行了抽象並會自動處理這些細節,讓你專注於想要完成的事情。

2. 它是簡潔的

因為Python是一種高級編程語言,所以代碼更簡潔,幾乎只需要完全專注於你想要實現的業務邏輯,而不是技術實現細節。語言設計的選擇對此做出了貢獻:例如,Python不需要像許多其他語言那樣使用大括號或分號來描述函數、循環和行,這使得它更簡潔,正如一些人所認為的,提高了可讀性。

3.易於學習和理解

影響Python語言設計選擇的一個觀察結果是,程序的讀取頻率往往高於寫入頻率。Python在這點上非常出色,因為它的代碼看起來非常接近於普通的英語,特別是如果你以一種合理的方式命名腳本或程序的不同組件的話。

4. 適合快速迭代開發

“明智的嘗試和錯誤勝過完美的計劃。”——David Kelley

Python是構建原型和快速迭代開發(當然,還包括反覆嘗試和糾錯)的理想工具,因為交互式解釋器工具(如Python shell、IPython和Jupyter筆記本)是Python工具鏈的前端和中心。在這些交互環境中,你可以單獨編寫和執行每一行代碼,並立即看到結果(或有用的錯誤消息)。其他語言也有這種特性,但在大多數情況下,與 Python不在一個等級。

5. 可以用於原型和生產代碼

除了對原型設計非常有用之外,Python對於大型生產應用程序來說也是一種優秀而強大的語言。世界上一些大型的軟件公司在各種應用程序和用例中大量使用Python。

6. 附帶“內置的:”Python標準庫

基本操作所需的一切都內建在該語言中,但除此之外,Python標準庫還提供了處理文件、媒體、網絡、日期和時間信息等的工具。這允許你在不尋找第三方包的情況下可以完成各種各樣的任務。

7. 優秀的第三方金融分析庫

對於金融專業人員來說,Pandas及其DataFrameSeries對象,以及Numpy和它的ndarray都是使用Python進行金融分析的主力工具。結合matplotlib和其他可視化庫,你可以使用非常棒的工具來提高工作效率。

8. Python是免費的!

Python是在開放源碼許可下開發的,因此也可以免費用於商業用途。

將Python用於金融的入門教程

下面是一個入門教程,展示如何創建在我之前的博客文章中描述的Monte Carlo 模擬的簡化版本,但是使用的是Python而不是Excel的@RISK插件。

Monte Carlo方法依靠隨機抽樣來獲得數值結果。其中一個應用是從一個概率分佈中抽取隨機樣本,該概率分佈表示不確定的未來狀態,其中變量或假設可以取一系列的值。

在一個簡化的DCF估值模型上進行Monte Carlo模擬是很有幫助的,而不是使用更常見的例子來顯示選項或其他衍生品的估值,因為我們不需要任何計算財務報表和折現現金流相關的數學基本知識,這讓我們專注於Python的概念和工具。但是請注意,這個基本的教程模型是用來說明關鍵概念的,對於其他任何實際用途都不是很有用。我也不會涉及Monte Carlo模擬的任何學術方面的東西。

本教程假設你熟悉編程的基本構建塊,例如變量和函數。如果沒有,花10分鐘檢查一下本文簡介的關鍵概念可能會有幫助。

起點和期望的結果

我從Monte Carlo模擬教程中使用的非常簡單的DCF估值模型開始。它包含三個財務報表中的一些關鍵行項目,以及三個突出顯示的輸入單元格,在Excel版本中,這些單元格具有點值估算,我們現在希望用概率分佈替換它們,來開始研究可能的結果範圍。

Python与金融:为你的电子表格加速(1)

開發小腳本的兩步方法

運行它,改正它,優化它”——Kent Beck

本教程的目的是向剛接觸Python的金融專業人員介紹一下一個有用的程序可能是什麼樣的,以及可以用來開發它的迭代過程。因此,它包括兩部分:

  1. 首先,我使用一種簡單的方法開發了一個工作原型,我認為這種方法很容易遵循,並且與從頭開始這個項目所使用的過程並不完全相同。

  2. 然後,在開發了工作原型之後,我將遍歷重構的過程——在不更改代碼功能的情況下更改代碼的結構。你可能想繼續停留在這一部分———它比第一個解決方案更優雅,而且,作為額外的亮點,它的執行時間大約快75倍。

1. 開發工作原型

設置Jupyter 筆記本

Jupyter筆記本是與Python進行交互的一個很好的工具。它是一個交互式Python解釋器,其中的單元格可以包含代碼、標記文本、圖像或其他數據。在本教程中,我使用了Python Quant平臺,但我也推薦谷歌的Colaboratory,它是免費的,並在雲端運行。進入Jupyter筆記本後,只需在“文件”菜單中選擇“New python3 Notebook”,就可以開始了。

這樣做之後,下一步是導入我們需要的數據操作和可視化相關的第三方包,並告訴程序我們希望在我們的筆記本中看到圖表,而不是在單獨的窗口中:

Python与金融:为你的电子表格加速(1)

在開始命名第一個變量之前要注意一點。正如我已經強調的,可讀性是Python的優勢之一。語言設計在很大程度上支持這一點,但編寫代碼的每個人都有責任使其可讀和可理解,不僅對其他人,而且對他們自己。正如Eagleson’s Law所言,“任何你自己的代碼,如果你六個月或更長的時間都沒有看過,就好像是別人寫的。”

一個好的經驗法則是,為程序的組件命名時,要儘量避免使用單獨的註釋來解釋程序的功能。

記住這一點,讓我們繼續。

創建財務報表

在Python中,有許多方法可以處理現有的電子表格數據。例如,我們可以使用read_excel命令用一行代碼將一個工作表讀入Pandas DataFrame。如果你希望你的電子表格和Python代碼之間有更緊密的集成和實時鏈接,有其他免費和商業庫可以用來提供該功能。

由於這裡的模型非常簡單,為了將重點放在Python概念上,我們將在腳本中從頭創建它。在第一部分的最後,我將展示如何將我們創建的內容導出到電子表格中。

作為創建財務報表Python表示形式的第一步,我們需要一個合適的數據結構。有很多選擇,有些內置在Python中,有些來自各種庫,或者我們可以創建自己的庫。現在,讓我們使用Panda庫中的一個Series方法來看看它的功能:

Python与金融:为你的电子表格加速(1)

該輸入及其對應的輸出如下圖所示:

Python与金融:为你的电子表格加速(1)

前三行我們創建了一個數據結構,它的索引由年份(每一項進行標記來顯示它是實際、預算或預測),一個初始值(和最初的DCF模型中的值一樣。以百萬歐元為單位),和用於預測的空(NaN,“不是一個數字”)單元格。第4行打印數據的表示形式——通常,在交互式解釋器中鍵入變量或其他對象的名稱通常會得到它的一個合理的表示形式。

接下來,我們聲明一個變量來表示預期的年度銷售增長。在這個階段,它是一個點值估計,與我們原來的DCF模型中的數值相同。我們首先要使用這些相同的輸入,並確認我們的Python版本執行的操作和給出的結果與Excel版本相同,然後再考慮用概率分佈替換點值估計。使用這個變量,我們創建了一個循環,根據上一年度的銷售額和增長率計算預測的每一年的銷售額:

Python与金融:为你的电子表格加速(1)

我們現在得到了預期銷售額,而不是NaN:

Python与金融:为你的电子表格加速(1)

使用同樣的方法,我們繼續分析財務報表,根據需要聲明變量,並執行必要的計算,最終得到自由現金流。得到自由現金流後,我們就可以檢查我們所得到的結果和相對應的Excel版本的DCF模型所得到的結果之間的相關性。

Python与金融:为你的电子表格加速(1)

進而我們就得到了折現現金流:

Python与金融:为你的电子表格加速(1)

在此階段,最上面一行代碼可能需要註釋的是第二個tax_payment引用。在這裡,我們使用一個小函數來確保在稅前利潤為負的情況下,我們不會得到正的納稅。這展示瞭如何有效地在Pandas Seried或DataFrame中將自定義函數應用於所有單元格。當然,實際應用的函數是一種簡化。對於更大規模的估值操作,一個更現實的模型應該是一個單獨的稅務模型,它根據一些公司特定的因素計算實際支付的現金稅。

執行DCF估值

在得到預期現金流之後,我們現在可以計算一個簡單的終值,並將所有現金流折現到當前,從而得到DCF結果。下面的代碼介紹了索引和切片,它允許我們訪問數據結構中的一個或多個元素,比如Pandas的 Series對象。

我們通過在結構名稱後面直接寫方括號來訪問元素。簡單索引根據元素的位置訪問元素,從0開始,這意味著free_cash_flow[1]將給出第二個元素。[-1]是訪問最後一個元素的縮寫形式(去年的現金流用於計算終值),並使用一個冒號給我們一個切片,這意味著[1:]將返回除第一個元素之外的所有元素,因為我們不想在我們的DCF估值包括過去的2018A年。

Python与金融:为你的电子表格加速(1)
Python与金融:为你的电子表格加速(1)

這就結束了原型的第一部分——我們現在有了一個在Python中工作的DCF模型,儘管是一個非常基礎的模型。

導出數據

在繼續進行實際的Monte Carlo 模擬之前,現在可能是介紹Pandas包中提供的導出功能的好時機。如果你有一個Pandas DataFrame對象,你可以使用to_excel方法用一行代碼將數據寫入Excel文件。還有類似的功能可以導出到十幾種其他格式和目的地。

Python与金融:为你的电子表格加速(1)
Python与金融:为你的电子表格加速(1)

為我們的Monte Carlo模擬創建概率分佈

現在我們準備處理下一個挑戰:用概率分佈替換一些點估計輸入。雖然與在Excel中構建相同的模型相比,到目前為止的步驟似乎有些麻煩,但下面幾行代碼將讓你一窺Python的強大。

我們的第一步是決定我們希望在模擬中運行的迭代次數。使用1,000作為起點可以在獲得足夠的數據點來獲得合理的輸出圖表與在合理的時間框架內完成模擬之間取得平衡。接下來,我們生成實際的分佈。為了簡單起見,我在這裡生成了三個正態分佈,但是NumPy庫有很多種分佈可供選擇,還有其他一些地方也可以查看,包括Python標準庫。在確定使用哪種分佈之後,我們需要指定描述其形狀所需的參數,如平均值和標準差,以及期望的結果的數量。

Python与金融:为你的电子表格加速(1)Python与金融:为你的电子表格加速(1)

這裡你可以說EBITDA不應該是一個獨立於銷售額的單獨的隨機變量,而應該在某種程度上與銷售額相關。我同意這一點,並認為它應該由對成本結構的動態性充分理解(變量、半可變和固定成本)和關鍵成本動因(其中一些可能有自己的概率分佈,如例如輸入商品價格)來驅動,出於篇幅和清晰的原因,我在這裡暫將這些複雜性放一邊。

你對所選擇的分佈和參數的數據越少,你就越需要依賴各種盡職調查工作流的結果,以及經驗,以形成對可能場景範圍的一致看法。在這個例子中,對於現金流預測,會有一個很大的主觀成分,這意味著可視化概率分佈變得很重要。在這裡,通過兩行簡短的代碼,我們可以得到一個基本的可視化,來顯示銷售增長分佈。通過這種方式,我們可以快速地查看任何分佈,來得到最能反映團隊收款視圖的分佈。

現在我們已經有了運行模擬所需的所有構建塊,但是它們的格式並不適合運行模擬。下面是我們到目前為止使用的相同代碼,但為了方便起見,所有代碼都聚集在一個單元中,並重新排列成一個函數:

Python与金融:为你的电子表格加速(1)

使用以下代碼,現在我們可以運行整個模擬並繪製輸出分佈圖表,它將是該公司在1000次迭代中每一次的貼現現金流值。%time命令不是Python代碼,而是一個筆記本簡寫,用於度量運行某個東西所需的時間(你也可以使用標準庫中的Python函數)。這取決於你運行它的計算機,但是這個版本需要1-2秒來運行這1000次迭代並輸出可視化結果。

Python与金融:为你的电子表格加速(1)Python与金融:为你的电子表格加速(1)

(待續,見下文)

英文原文:https://www.toptal.com/finance/financial-modeling/python-and-finance
譯者:天天向上


分享到:


相關文章: