如何為貸款建立基本的 Python 現金流模型

已發表: 2022-03-11

許多金融專家擅長使用 Excel 構建金融模型。 但是,由於同行評審、版本控制和無法形成遞歸函數的困難,Excel 可能不是更複雜模型的最佳選擇。 儘管存在這些缺點,但許多金融專業人士仍然使用 Excel,因為他們對 Python 等編程語言缺乏信心。

Python 是最容易學習的編程語言之一。 因為它的設計考慮到了可讀性和易用性,所以它的代碼簡潔並且接近於簡單的英語。 在本文中,我展示了使用最基本的函數、包和數據結構來構建用於貸款支付的 Python 現金流模型是多麼容易。

要繼續學習,您將需要使用 Colaboratory(簡稱“Colab”),這是 Google 的免費基於 Web 的筆記本應用程序,可讓您編寫和執行代碼。 Colab 是一個 Python 解釋器,它使用的單元格可以包含代碼、Markdown(用於輕鬆設置樣式的文本)、圖像或其他數據。 Colab 在您編寫代碼時會持續存儲您的代碼值,以便在出現錯誤或錯誤時快速簡單地發現它們。 (如果您還不想參與進來,請按照這個 Colab 筆記本示例進行操作。)

首先,確保您擁有所需的工具

我們將建立一個攤銷貸款模型,該模型對貸款的本金和利息都有定期的定期付款。 每個時期都有固定的分期付款,付款的利息部分會隨著時間的推移而減少。 對於這個模型,您將需要三個 Python 庫,即防止開發人員不得不從頭開始編寫代碼的軟件例程集合——NumPy、Pandas 和 Matplotlib:

  • numpy-financial==1.0.0
  • pandas==1.2.3
  • matplotlib==3.2.2

在 Colab 中,默認安裝了 Pandas 和 Matplotlib 包,因此您只需要安裝 numpy-financial 庫,您可以直接從 Colab 進行安裝。 要安裝 numpy-financial 並導入稍後需要的所有三個庫,請從文件菜單中打開一個新的 Colab 筆記本,並將以下內容粘貼到第一個代碼單元中:

 # initial set-up !pip install numpy_financial import pandas as pd import numpy_financial as npf import matplotlib.pyplot as plt from collections import namedtuple

在我們繼續下一步之前,讓我解釋一下前面的代碼以及為什麼它是這樣編寫的。 即使 numpy-financial 的名稱包含連字符,安裝和導入時也必須在名稱中使用下劃線。 (有關安裝 numpy_financial 的更多信息和說明,請查看文檔。)您也可能會注意到縮寫詞。 包通常使用預定義的別名——NumPy 寫成 np,Pandas 寫成 pd。 這些別名用於使您不必在每次想要使用它時都編寫包的全名,並且還有助於使您的代碼更具可讀性。

現在,使用 NumPy 設置貸款特徵

NumPy 是最流行的 Python 庫之一,它增加了對大型多維數組的支持,以及對這些數組進行操作的大量高級數學函數。 numpy-financial 庫是一個相對較新的包,由一組常用的財務函數組成,這些函數已從 NumPy 主庫中分離出來,並擁有自己的驕傲。

計算我們的攤銷貸款期限的預定利息和本金向量的最簡單方法是使用 numpy-financial 包中的 PMT、IPMT 和 PPMT 函數。 PMT 功能提供固定貸款分期付款,以便在給定數量的期限內全額支付貸款。 IPMT 和 PPMT 函數分別提供利息和本金支付。 根據周期的輸入,IPMT 和 PPMT 函數可以返回單個週期或多個週期的值。

對於這個例子,我們將提供一個以貸款的整個生命週期作為周期輸入的範圍。 因此,我們將獲得包含貸款期限每個時期的本金支付利息的向量數組:

 # loan characteristics original_balance = 500_000 coupon = 0.08 term = 120 # payments periods = range(1, term+1) interest_payment = npf.ipmt( rate=coupon / 12, per=periods, nper=term, pv=-original_balance) principal_payment = npf.ppmt( rate=coupon / 12, per=periods, nper=term, pv=-original_balance)

輸入代碼後,您不會“看到” Colab 文件中發生任何事情——這是完成本練習其餘部分所需的基本貸款信息。 (我使用的所有 numpy-financial 函數的列表、它們的定義和它們的輸入,可以在官方文檔中找到。)

接下來,使用 Matplotlib 創建圖表

雖然將向量作為輸出很好,但最好以圖表的形式可視化輸出,特別是作為堆棧圖。 要設置圖表,我們將使用plt ,它是 matplotlib 庫中 pyplot 函數集合的別名。 在我們的示例中,我們將在左上角添加一個圖例,並為 x 軸和 y 軸添加標題。 由於我們不想要內部邊框,我們將邊距設置為 0。

添加另一個代碼單元,並插入以下代碼:

 plt.stackplot(periods, interest_payment, principal_payment, labels=['Interest', 'Principal']) plt.legend(loc='upper left') plt.xlabel("Period") plt.ylabel("Payment") plt.margins(0, 0) 

正如我們所看到的,興趣隨著時間的推移而降低。 由於每個期間的本金支付,貸款餘額也會減少。 為了維持固定的分期付款,本金必須增加。

最後,使用 Pandas 創建表

Pandas 包是最常用的用於處理數值表和時間序列的 Python 包。 它提供了快速、靈活和富有表現力的數據結構,旨在使處理關係或標記數據既簡單又直觀。 我們將創建一個表格,其中包括本金和利息支付,以及每個時期的期初和期末貸款餘額:

 _# pandas float formatting_ pd.options.display.float_format = '{:,.2f}'.format _# cash flow table_ cf_data = {'Interest': interest_payment, 'Principal': principal_payment} cf_table = pd.DataFrame(data=cf_data, index=periods) cf_table['Payment'] = cf_table['Interest'] + cf_table['Principal'] cf_table['Ending Balance'] = original_balance - \ cf_table['Principal'].cumsum() cf_table['Beginning Balance'] = [original_balance] + \ list(cf_table['Ending Balance'])[:-1] cf_table = cf_table[['Beginning Balance', 'Payment', 'Interest', 'Principal', 'Ending Balance']] cf_table.head(8)

第一行代碼應用顯示格式規則,通過添加千位分隔符並將數字顯示到小數點後兩位,使表格更具可讀性。

第二段代碼指示 Colab 包括每個貸款期間的利息支付、本金支付、期末餘額和原始餘額。 反斜杠充當換行符,因為單行中的字符不能超過 79 個。

圖表中顯示的金額已縮短到小數點後兩位。

如果您一直在自己的 Colab 筆記本中跟踪,那麼恭喜! 您現在已經使用 Python 編寫了一個簡單的計劃攤銷貸款組合配置文件。

你可以用 Python 做更多的金融工作,包括為具有與基準利率和其他貸款結構相關的可變息票的貸款建模。 希望這個貸款模型讓您體驗到 Python 中的財務編碼是多麼簡單。