如何为贷款建立基本的 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 中的财务编码是多么简单。
