如何为贷款建立一个基本的Python现金流模型

480 阅读7分钟

如何为贷款建立一个基本的Python现金流模型

Python已经在金融编程领域掀起了风暴,对能够使用它的金融专家的需求也在飙升。在这里,一位Toptal金融专家和Python专家向初学者展示了如何用Python建立一个贷款支付现金流模型。

Miklos是现金流模型和Python编程方面的专家,曾为摩根斯坦利和DBRS晨星公司工作。他是Toptal金融专家和结构性金融咨询公司Pylink Ltd.的董事。

许多金融专家善于使用Excel来建立金融模型。然而,由于同行评审、版本控制方面的困难,以及无法形成递归函数,Excel可能不是更复杂模型的最佳选择。尽管有这些缺点,许多金融专业人士仍然使用Excel,因为他们对Python这样的编程语言不太自信。

Python是最容易学习的编程语言之一。因为它的设计考虑到了可读性和易用性,所以它的代码很简洁,接近于纯英语。在这篇文章中,我展示了通过使用最基本的函数、包和数据结构来建立一个用于贷款支付的Python现金流模型是多么容易。

为了跟上进度,你需要使用Colaboratory(简称 "Colab"),这是Google的免费网络笔记本应用程序,可以让你编写和执行代码。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中的金融编码是多么简单。

了解基础知识

Python如何用于金融领域?

Python 可以用来从电子表格和数据库中提取数据,然后用统计工具来处理这些数据。你可以创建和分析从简单的贷款现金流模型到算法交易策略等一切。

Python适合于金融建模吗?

Python是一种用于金融建模的优秀编程语言。除了庞大的标准工具库外,它还提供了对金融专用的第三方库的简单访问,如NumPy和Pandas。

学习Python用于金融需要多长时间?

Python是最容易学习的编码语言之一,因为它的设计考虑到了可读性和易用性。它的代码简明扼要,接近于普通英语。你练习得越多,学习Python的速度就越快。一些编码员建议在学习过程中,每天用Python工作一小时。