作者都是各自领域经过审查的专家,并撰写他们有经验的主题. 我们所有的内容都经过同行评审,并由同一领域的Toptal专家验证.
Stefan Thelin的头像

Stefan Thelin

Stefan是Cargotec数据驱动洞察和分析总监, 领先的货物和装载解决方案提供商. 他还曾担任硕士&一个是董事,一个是创业公司的CFO, 并在苏格兰皇家银行担任杠杆融资经理,领导金融建模和分析.

Previously At

Cargotec
Share

Executive Summary

为什么Python是一门非常适合金融专业人士学习的编程语言?
  • Python是一种高级编程语言, 这意味着它抽象并处理了编程的许多技术方面, 比如内存管理, 必须在其他语言中显式处理. 这使得Python对于没有技术背景的人来说很容易使用.
  • 因为这种语言在设计时就考虑了可读性和易用性, 它是最容易学习的语言之一. Python代码简洁,接近于简单的英语.
  • Python是原型和快速迭代开发的理想选择. 它的交互式解释器工具提供了可以独立编写和执行每行代码并立即查看结果的环境.
  • At the same time, Python健壮且高性能, 使其成为核心系统和大型应用程序的可行选择.
  • 除了它的大型标准库有用的工具, Python有很棒的用于财务分析和计算的第三方库, 例如本教程中使用的Pandas和NumPy库.
一起实现Python和财务的用例是什么?
  • Python脚本可用于自动执行重复性任务和工作流, 节省时间,减少人工错误的风险.
  • 脚本允许用户轻松地从电子表格中提取数据, databases, and APIs, 甚至是抓取网络数据, 然后可以使用强大的统计和分析工具对其进行处理和分析.
  • Excel的各种插件允许用户在电子表格和Python代码之间创建实时双向链接.
  • Python支持新的分析类型, 比如蒙特卡罗模拟, 这在标准电子表格中是不容易得到的.
  • 算法交易不再是对冲基金和大型投资银行的专属领域. With Python, you can develop, 在短时间内以低成本进行回测并部署您自己的交易策略.

对于那些长期依赖于电子表格的职业来说, Python尤其有价值. 美国花旗银行为其实习分析师开设了Python速成班. - The Economist

金融专业人士长期以来一直有机会 VBA (Visual Basic for Applications) 在Excel中构建自定义功能和自动化工作流. 随着近年来的出现 Google Sheets 作为电子表格领域的有力竞争者, 谷歌应用程序脚本 现在又多了一个选择.

然而,我想提请大家注意第三种选择, Python编程语言它在许多领域都非常受欢迎.

In this article, 我将提供一些示例,说明您可以在金融中使用Python完成什么, 从语言本身的概述以及为什么它在如此广泛的领域中如此受欢迎开始, 跨越web开发, machine learning, finance, science, and education, 仅举几个例子. 第二部分将包括一步一步的教程.

我写这篇文章的目的是帮助您确定Python是否足够吸引您考虑将其添加到您的财务工具箱中. 如果你迈出这一步, 有很多应用程序, courses, videos, articles, 学习语言的书籍和博客文章. 在这篇文章的最后,我列出了一些一路上帮助我的资源.

用例:我的Python金融项目

我对编程的入门是学习 BASIC on an Oric 1 in the mid-1980s. 那时BASIC是最常见的初学者语言. 在80年代末到90年代中期,我还涉猎过Pascal和C语言, 但我从未在任何专业工作中使用过它们, 我也没指望需要或使用编程技能. 据我所知,那是在90年代末, 金融和编程是完全不同的领域, 当我选择走上金融职业道路的时候.

快进到2012年, 我想重新把编程当成一种爱好, 所以我开始研究当时可用的语言. 原来发生了不少事, 当我接触到Python时,我被它迷住了, 原因很多,我将在下一节中概述. 从那以后,我使用Python完成了各种各样的任务, 从小脚本到大项目, 无论是个人还是职业. 其中许多(但不是全部)都涉及电子表格,这是许多金融专业人士的工作平台.

下面是几个例子,说明电子表格和Python可以很好地结合在一起:

1. 跟踪数百个活动随着时间的推移在M&集成PMO设置

我与M的各个方面打交道&一个事务,不仅要执行,还要集成. In a recent case, PMO团队决定采用混合计划和项目管理方法, 使用瀑布计划和甘特图为12个集成工作流中的每一个制定高级计划, 除了一个看板板,用来跟踪在任何给定时间进行的数百项活动, 在第一个百日计划及以后. 选择的看板工具, MeisterTask, 有许多统计和报告特性, 但在分析和展示方面,我们的需求远不止于此, 哪一个需要定制的解决方案. 这是我使用Python自动化的工作流程:

  1. 将整个单板的每周状态保存为CSV文件.
  2. 将所有历史CSV文件读入 Pandas DataFrame.
  3. Sort, filter, 将数据分组并操作成我们希望如何跟踪进度的商定格式(通过活动的状态), workstream, etc.).
  4. 将输出写入Excel文件,其中包含每个分析的数据, 以这样的方式格式化,可以简单地复制和粘贴到 think-cell charts.
  5. 为每月指导委员会会议的报告制作表格和图表.

开发脚本需要几个小时的前期投资, but now, 更新指导委员会会议或特别分析的报告包需要几分钟的时间. Literally, 大约30秒,进入正确的文件夹,用一行命令运行脚本, 然后花几分钟将输出复制粘贴到幻灯片中. 在12个工作流中大约有500个活动(卡片)已经执行了大约一个月, 每周跟踪他们的活动情况, 在两年的项目时间内, 你很快就会发现自己要面对成千上万的人, 最终在数十个文件中获得数万个数据点. 如果没有自动化,我们在这里谈论的是一些非常乏味的任务.

在“金钱的时间价值”之间进行取舍, 或者通过设置自动化来增加更多的初始工作量是金融领域的常见主题. 在这个过程的第一步中,我也做了类似的决定,将数据导出为CSV文件. MeisterTask和许多现代web应用程序一样, has an API, 可以连接到您的Python应用程序, 但是设置它所花费的时间将远远超过我们这里用例所节省的时间.

So, as you see, 通常,最佳解决方案是自动化工作流的某些步骤,而保持其他步骤的手动操作.

2. 使用网络抓取、谷歌地图API和Excel分析房价统计数据

另一个例子是我出于个人兴趣而做的,但我想强调它,因为它包含了Python实用程序中其他一些有趣的元素:

  1. 抓取房地产列表数据, including address, size, number of rooms, asking price, 还有其他特点, for a given area; a few hundred to perhaps a thousand lines in total.
  2. 保存到Python数据结构中.
  3. 连接到谷歌地图API和, for each listing, 检索物业与关键地标(如大海)之间的距离, the city center, 最近的火车站, nearest airport, etc.
  4. 将数据导出为Excel文件.
  5. 使用标准的Excel功能运行 regressions, 计算统计数据和创建图表的标准指标,如每平方米的价格和距离地标.

这里的结果可以结合你自己的个人偏好权重, 以及在寻找房产时的经济限制.

这只是两个例子, 专注于自动化电子表格相关工作和添加功能, 但是使用Python的机会几乎是无穷无尽的. 在下一节中, 我将概述它变得如此受欢迎的原因, 然后再用Python逐步学习蒙特卡罗模拟教程.

为什么Python是金融专业人士的好选择

编程语言Python自1990年以来一直存在, 但直到最近几年,它才开始流行起来.

Python是搜索次数最多的编程语言

这有几个原因,让我们依次来看一下.

1. Python是一种高级编程语言

高级编程语言是一种抽象出计算机内部工作的许多细节的语言. 内存管理就是一个很好的例子. 低级编程语言需要对计算机内存布局的复杂性有详细的了解, 已分配和释放, 除了花费的时间和处理任务所需的代码行. Python将这些细节抽象出来并自动处理, 让你专注于你想要完成的事情.

2. It Is Concise

因为Python是一种高级编程语言, 代码更加简洁,并且几乎完全集中在您想要实现的业务逻辑上, 而不是技术实现细节. 语言设计选择有助于此:作为一个例子, Python不需要使用花括号或分号来描述函数, loops, 和其他语言一样, 哪个更简洁, as some argue, 提高可读性.

3. 易于学习和理解

在Python中影响语言设计选择的一个观察结果是,程序被读取的次数比被编写的次数要多. Python在这方面表现出色,因为它的代码看起来非常接近简单的英语, 特别是如果您以合理的方式命名脚本或程序的不同组件.

4. 适合快速迭代开发

明智的尝试和错误胜过完美的知识分子的计划. - David Kelley

Python是原型和快速迭代开发的理想选择 (and, yes, ),因为交互式解释器工具,如 the Python shell, 和Jupyter笔记本 是Python工具链的前沿和中心. 在这些互动环境中, 您可以单独编写和执行每一行代码,并立即查看结果(或有用的错误消息). 其他语言也有这个,但是 在大多数情况下与Python的程度不同.

5. 可以同时用于原型和产品代码吗

除了用于原型制作之外, 对于大型生产应用程序来说,Python也是一种优秀而强大的语言. 世界上一些最大的软件公司在各种应用程序和用例中大量使用Python.

6. 自带“电池:”Python标准库

基本操作所需的一切都内置在语言中, 但除此之外, the Python标准库 有处理文件、媒体、网络、日期和时间信息等的工具吗. 这允许您完成各种各样的任务,而不必寻找第三方包.

7. 伟大的第三方图书馆财务分析

对于金融专业人士来说,熊猫有它的 DataFrame and Series 对象,Numpy和它的 ndarray 是使用Python进行财务分析的主力吗. 结合matplotlib和其他可视化库, 你有很好的工具来帮助你提高工作效率.

8. Python Is Free!

Python是在开源许可下开发的,可以免费用于商业用途.

使用Python进行财务分析的分步教程

下面是一个循序渐进的教程,展示如何创建中描述的蒙特卡罗模拟的简化版本 我之前的博文,但使用Python代替Excel的@RISK插件.

蒙特卡罗方法依靠随机抽样来获得数值结果. 其中一种应用是从概率分布中抽取随机样本,该概率分布表示世界的不确定潜在未来状态,其中变量或假设可以取一定范围的值.

在简化的DCF估值模型上进行蒙特卡罗模拟,而不是您看到的显示期权或其他衍生品估值的更常见示例,这是有帮助的, 因为我们不需要任何数学,除了计算财务报表和贴现现金流的基本知识, 让我们专注于Python的概念和工具. 请注意,这个基本教程模型旨在说明关键概念, 并且对于任何实际目的都没有用处. 我也不会涉及蒙特卡罗模拟的任何学术方面.

本教程假定您熟悉编程的基本构建块, 比如变量和函数. 如果没有,花10分钟检查一下关键概念可能会有所帮助 this introduction.

起点和期望的结果

我从蒙特卡罗模拟教程中使用的非常简化的DCF估值模型开始. 它有一些关键的行项目 三份财务报表, 还有三个高亮的输入单元格, 在Excel版本中有点估计,我们现在想用概率分布取代,开始探索结果的潜在范围.

财务预测示例

开发小脚本的两步方法

让它工作,让它正确,让它快 Kent Beck

本教程的目的是向刚接触Python的金融专业人士介绍一个有用的程序可能是什么样子的, 同时也介绍了你可以用来开发它的迭代过程. 因此,它有两个部分:

  1. First, 我使用一种简单的方法开发了一个工作原型,我认为这种方法很容易遵循,并且与从头开始这个项目的过程并不完全不同.
  2. Then, 在开发出工作原型之后, 我介绍了重构的过程——在不改变代码功能的情况下改变代码的结构. 你可能想要继续看这一部分——这是一个比第一个更优雅的解决方案, and, as a bonus, 就执行时间而言,它大约快了75倍.

1. 开发工作原型

设置Jupyter Notebook

Jupyter笔记本是交互式使用Python的好工具. 它是一个交互式Python解释器,其单元格可以包含代码, Markdown text, images, or other data. 在本教程中,我使用了 Python量化平台,但我也可以推荐 谷歌合作,它是免费的,在云端运行. 只要在“文件”菜单中选择“新建Python 3笔记本”,就可以开始了.

Having done that, 下一步是导入数据操作和可视化所需的第三方包, 然后告诉程序,我们希望在笔记本中看到内联的图表, 而不是在单独的窗口中:

导入numpy为np
以pd方式导入熊猫
import matplotlib.pyplot as plt
% matplotlib内联

在我们开始命名第一个变量之前要注意. 正如我已经强调的,可读性是Python的优势之一. 语言设计在很大程度上支持了这一点, 但是每个编写代码的人都有责任使其可读性和可理解性, 不仅为别人,也为自己. As Eagleson’s Law states, “任何你自己写的代码,如果你六个月或更长时间没有看,就好像是别人写的一样.”

一个好的经验法则是,以这样一种方式来命名程序的组件,从而最大限度地减少对解释程序功能的单独注释的需求.

记住这一点,让我们继续.

Python金融建模

有很多方法可以在Python中处理现有的电子表格数据. 例如,我们可以用一行代码将一个工作表读入Pandas DataFrame中 read_excel command. 如果您想要电子表格和Python代码之间更紧密的集成和实时链接, there are both free and commercial 提供该功能的可用选项.

因为这里的模型很简单, 让我们关注Python的概念, 我们将在脚本中从头开始重新创建它. 在第一部分的末尾,我将展示如何将我们创建的内容导出到电子表格中.

作为创建财务报表Python表示的第一步, 我们需要一个合适的数据结构. 有很多选择, 有些是Python内置的, 其他来自不同的图书馆, 或者我们可以创造我们自己的. 现在,让我们使用Pandas库中的一个Series来看看它的功能:

年=(“2018”,“2019 b”,“2020 p”,“2021 p”,“2022 p”,“2023 p”)
sales = pd.系列(指数=年)
sales['2018A'] = 31.0  
sales

这个输入和对应的输出如下所示:

从python库创建一个系列

在前三行代码中,我们创建了一个数据结构,其索引由年份组成(每个年份都做了标记,以显示其是否为实际年份), 预算或计划), 起价(以百万欧元计), 和原来的DCF模型一样), and empty (NaN, “不是数字”)用于投影的单元格. 第四行打印数据的一般表示形式, 在交互式解释器中输入变量或其他对象的名称通常会给您一个合理的表示.

接下来,我们声明一个变量来表示预计的年销售增长. 在这个阶段,它是一个点估计,与我们最初的DCF模型中的数字相同. 我们希望首先使用相同的输入,并确认Python版本与Excel版本执行相同的操作并给出相同的结果, 在考虑用概率分布代替点估计之前. 使用这个变量, 我们创建一个循环,根据前一年的预测和增长率计算每年的销售额:

growth_rate = 0.1
(1,6)范围内年份:
    销售额[年]=销售额[年- 1]*(1 +增长率)
    
sales

我们现在有了预计销售额,而不是NaN:

Python和财务:预测销售数字

使用相同的方法, 我们继续看财务报表, 声明我们需要的变量,并执行必要的计算,最终达到自由现金流. 一旦我们到达那里,我们可以检查我们所拥有的与DCF模型的Excel版本相对应.

ebitda_margin = 0.14
depr_percent = 0.032
Ebitda =销售额* ebitda_利润率
折旧=销售额* depr_percent
Ebit = ebitda -折旧
nwc_percent = 0.24
NWC =销售额* nwc_%
Change_in_nwc = NWC.shift(1) - nwc 
Capex_percent = depr_percent
资本支出= -(销售额*资本支出百分比)
tax_rate = 0.25
Tax_payment = -ebit * tax_rate
Tax_payment = Tax_payment.Apply (lambda x: min(x, 0))
Free_cash_flow = ebit +折旧+纳税额+资本支出+变化
free_cash_flow

这给了我们自由现金流:

python的贴现现金流输出

在这个阶段,上面可能需要注释的一行是第二行 tax_payment reference. Here, 我们应用一个小函数来确保在税前利润为负的情况下, 这样我们就不会有正向的纳税了. 这展示了如何有效地将自定义函数应用于Pandas Series或DataFrame中的所有单元格. 当然,实际应用的函数是一个简化. 一个更现实的模型 larger 估值锻炼 会有一个单独的税收模型,根据公司特定的一些因素来计算实际支付的现金税吗.

执行DCF估值

达到预期的现金流量, 我们现在可以计算一个简单的终端价值,并将所有现金流贴现回现在,以得到DCF结果. 下面的代码介绍了索引和切片, 哪一种方法允许我们访问数据结构中的一个或多个元素, 例如Pandas系列对象.

我们通过在结构体名称后面直接写入方括号来访问元素. 简单索引按位置访问元素,从0开始,这意味着 free_cash_flow[1] 会得到第二个元素吗. [-1] 是访问最后一个元素的简写(上一年的现金流量用于计算终端值), 冒号给我们一个切片, meaning that [1:] 给出除第一个元素之外的所有元素,因为我们不想包含历史年份 2018A 在我们的DCF估值中.

Cost_of_capital = 0.12
Terminal_growth = 0.02
Terminal_value = ((free_cash_flow[-1] * (1 + terminal_growth)) / 
                 (cost_of_capital - terminal_growth))
Discount_factors = [(1 / (1 + cost_of_capital)) ** I for I in range (1,6)]
Dcf_value = (sum(free_cash_flow[1:] * discount_factors) +
            Terminal_value * discount_factors[-1]
dcf_value

python贴现现金流计算的DCF输出

这就结束了原型的第一部分——我们现在有了一个可工作的DCF模型, 虽然是非常简陋的, in Python.

导出数据

在继续进行实际的蒙特卡罗模拟之前, 现在可能是提及Pandas包中可用的导出功能的好时机. 如果您有一个Pandas DataFrame对象,那么您可以使用 to_excel method. 也有类似的功能可以导出到十几种其他格式和目的地.

output = pd.DataFrame([sales, ebit, free_cash_flow],
                     index=['Sales', 'EBIT', 'Free Cash Flow']).round(1)
output.to_excel('Python DCF模型输出.xlsx')
output

用python生成的excel表输出示例

为我们的蒙特卡罗模拟创建概率分布

现在我们准备处理下一个挑战:用概率分布替换一些点估计输入. 虽然与在Excel中构建相同的模型相比,到目前为止的步骤似乎有些繁琐, 接下来的几行将让您了解Python的强大程度.

我们的第一步是决定我们想要在模拟中运行多少次迭代. Using 1,000作为起点,在获得足够的数据点以获得合理的输出图之间取得平衡, 而不是在合理的时间框架内完成模拟. 接下来,我们生成实际的分布. 为了简单起见,我在这里生成了三个正态分布 NumPy库有大量的发行版 可供选择,还有其他地方可以看,包括 Python标准库. 在决定使用哪个发行版之后, 我们需要指定描述它们形状所需的参数, 比如均值和标准差, 以及期望结果的数量.

iterations = 1000
Sales_growth_dist = np.random.normal(loc=0.1, scale=0.01、大小=迭代)
Ebitda_margin_dist = np.random.normal(loc=0.14, scale=0.02年,大小=迭代)
Nwc_percent_dist = np.random.normal(loc=0.24, scale=0.01、大小=迭代)
plt.嘘(sales_growth_dist垃圾箱= 20)
plt.show()

蒙特卡罗模拟输出从python

在这里,你可以争辩说EBITDA不应该是一个独立于销售额的随机变量,而是在某种程度上与销售额相关. 我同意这一点, 并补充说,它应该由对成本结构(变量)动态的深刻理解驱动, 半可变成本和固定成本)和关键成本驱动因素(其中一些可能有自己的概率分布), 例如投入商品价格), 但是为了空间和清晰起见,我把这些复杂的东西放在一边.

你可以用来选择分布和参数的数据就越少, 你就越需要依赖各种尽职调查工作流程的结果, 结合经验, 对可能的情景范围形成一致的看法. In this example, 现金流预测, 会有很大的主观成分, 这意味着可视化概率分布变得很重要. Here, 我们可以得到一个基本的可视化, 显示销售增长分布, 只需要两行简短的代码. 通过这种方式,我们可以快速查看任何分布,找出最能反映团队集体观点的分布.

现在我们有了运行模拟所需的所有构建模块, 但是它们不是运行模拟的方便格式. 下面是我们到目前为止使用过的相同代码,但为了方便起见,所有代码都集中在一个单元格中并重新排列成一个函数:

def run_mcs():
    
    创建概率分布
    Sales_growth_dist = np.random.normal(loc=0.1, scale=0.01、大小=迭代)
    Ebitda_margin_dist = np.random.normal(loc=0.14, scale=0.02年,大小=迭代)
    Nwc_percent_dist = np.random.normal(loc=0.24, scale=0.01、大小=迭代)
    
    计算每组随机输入的DCF值
    Output_distribution = []
    对于I在范围内(迭代):
        (1,6)范围内年份:
            Sales [year] = Sales [year - 1] * (1 + sales_growth_dist[0])
        Ebitda = sales * ebitda_margin_dist[i]
        折旧=(销售额* depr_percent)
        Ebit = ebitda -折旧
        NWC = sales * nwc_percent_dist[i]
        Change_in_nwc = NWC.shift(1) - nwc 
        资本支出= -(销售额*资本支出百分比)
        Tax_payment = -ebit * tax_rate
        Tax_payment = Tax_payment.Apply (lambda x: min(x, 0))
        Free_cash_flow = ebit +折旧+纳税额+资本支出+变化
        
        # DCF valuation
        Terminal_value = (free_cash_flow[-1] * 1.2) / (cost_of_capital - 0.02)
        Free_cash_flow [-1] += terminal_value
        Discount_factors = [(1 / (1 + cost_of_capital)) ** I for I in range (1,6)]
        Dcf_value = sum(free_现金流[1:]* discount_factors)
        output_distribution.append(dcf_value)
    
    返回output_distribution

现在我们可以运行整个模拟并绘制输出分布, 这个公司在每1年的贴现现金流量值是多少,000 iterations, 使用以下代码. The %time 命令不是Python代码,而是一个笔记本速记,用于测量运行某些东西的时间(您可以使用 标准库中的Python函数). 这取决于你运行它的电脑, 但是这个版本需要1-2秒来运行1,000次迭代并可视化结果.

%time plt.Hist (run_mcs(), bins=20, color='r')
plt.show()

蒙特卡罗模拟输出从python脚本

2. 完善原型

对某些事情可以简化的潜在怀疑是世界上最有价值的挑战来源. - Edsger Dijkstra

重构是指在不改变功能的情况下,重写现有代码以改进其结构的过程, 它可能是编程中最有趣和最有价值的元素之一. 这样做可能有几个原因. It might be to:

  1. 以更合理的方式组织不同的部分.
  2. 重命名变量和函数,使它们的目的和工作更清晰.
  3. 允许并准备未来的功能.
  4. 提高执行速度、内存占用或其他资源利用率.

来展示这个过程中的一个步骤, 我通过在一个地方收集所有初始变量来清理我们刚刚走过的原型, 而不是像原型脚本那样分散在各处, 并通过一个名为 vectorization.

使用NumPy数组使您能够将多种数据处理任务表示为简洁的数组表达式,否则可能需要编写循环. 这种用数组表达式代替显式循环的做法通常被称为向量化. Wes McKinney

现在看起来更清晰,更容易理解:

# DCF模型的关键输入
years = 5
Starting_sales = 31.0
Capex_percent = depr_percent = 0.032
sales_growth = 0.1
ebitda_margin = 0.14
nwc_percent = 0.24
tax_rate = 0.25
# DCF assumptions
r = 0.12
g = 0.02
# For MCS model
iterations = 1000
sales_std_dev = 0.01
Ebitda_std_dev = 0.02
nwc_std_dev = 0.01
def run_mcs():
    
    #生成概率分布
    Sales_growth_dist = np.random.正常(loc = sales_growth, 
                                         规模= sales_std_dev, 
                                         大小=(年、迭代))
    Ebitda_margin_dist = np.random.正常(loc = ebitda_margin, 
                                          规模= ebitda_std_dev, 
                                          大小=(年、迭代))
    Nwc_percent_dist = np.random.正常(loc = nwc_percent, 
                                        规模= nwc_std_dev, 
                                        大小=(年、迭代))
    
    #计算自由现金流
    Sales_growth_dist += 1
    For I in range(1, len(sales_growth_dist)):
        Sales_growth_dist [i] *= Sales_growth_dist [i-1]
    Sales = sales_growth_dist * starting_sales
    Ebitda =销售额* ebitda_margin_dist
    Ebit = ebitda -(销售额* depr_百分比)
    税= -(ebit * tax_rate)
    np.clip(tax, a_min=None, a_max=0)
    NWC = nwc_percent_dist * sales
    Starting_nwc = starting_sales * nwc_percent
    pre_year_nwc = np.滚动(nwc, 1,轴=0)
    Prev_year_nwc [0] = starting_nwc
    Delta_nwc = prev_year_nwc - NWC
    资本支出= -(销售额*资本支出百分比)
    Free_cash_flow = ebitda + tax + delta_nwc + capex
    折现现金流以获得DCF值
    Terminal_value = free_cash_flow[-1] * (1 + g) / (r - g)
    Discount_rates = [(1 / (1 + r)) ** I for I in range (1,6)]
    Dcf_value = sum(自由现金流.T * discount_rates).T) 
    Dcf_value += terminal_value * discount_rates[-1]
        
    return dcf_value

您将注意到这个版本与前一个版本之间的主要区别是没有 对于I在范围内(迭代) loop. 使用NumPy的数组操作,这个版本运行时间为18毫秒.原型版本是35秒,大约快了75倍.

%time plt.hist(run_mcs(), bins=20, density=True, color="r")
plt.show()

NumPy数组操作示例

我相信进一步的优化是可能的, 因为我在很短的时间内将原型和精炼版本放在一起只是为了本教程的目的.

Taking it Further

本教程展示了Python的一些强大特性, 如果你进一步发展这一点,机会几乎是无穷无尽的. 你可以这样说:

  • 从网页或其他数据源抓取或下载相关公司或部门统计数据, 帮助你选择假设和概率分布.
  • 在定量金融应用中使用Python, 例如基于基本面和/或宏观经济因素的自动交易算法.
  • 构建以电子表格和/或演示格式生成输出的导出功能, 作为内部交易审查和批准流程的一部分, 或者用于外部演示.

我甚至还没有谈到你还可以用各种web、数据科学和 机器学习应用 为Python的成功做出了贡献.

总结:一门对你的财务工具箱有用的语言

本文介绍了Python编程语言, 列出了它在金融领域如此受欢迎的一些原因,并展示了如何构建一个小的Python脚本. 在一步一步的教程中, 我介绍了如何使用Python进行迭代原型和交互式财务分析, 以及如何使用Python编写估值模型的应用程序代码, 算法交易 programs and more.

For me, 在一天结束的时候, Python技术的杀手级特性是使用起来非常有趣! 如果你喜欢解决问题, 构建事物并使工作流程更高效, 那么我鼓励你尝试一下. 我很想听听你用它做了什么或者想用它做什么.

了解基本知识

  • Python在金融中是如何使用的?

    Python主要用于资产价格趋势和预测的定量和定性分析. 它还可以很好地实现跨不同数据源的工作流自动化.

  • Python是什么时候创建的??

    Python构思于20世纪80年代,并于1989年12月首次实现.

  • Python编程的用途是什么?

    Python是一种可塑性强、通用性强的编程语言,它的用例涵盖了许多领域. 通过关注应用程序的编程方面, 它允许程序员专注于他们创建的功能.

就这一主题咨询作者或专家.
Schedule a call
Stefan Thelin的头像
Stefan Thelin

Located in Lund, Sweden

Member since 2017年9月20日

About the author

Stefan是Cargotec数据驱动洞察和分析总监, 领先的货物和装载解决方案提供商. 他还曾担任硕士&一个是董事,一个是创业公司的CFO, 并在苏格兰皇家银行担任杠杆融资经理,领导金融建模和分析.

Toptal作者都是各自领域经过审查的专家,并撰写他们有经验的主题. 我们所有的内容都经过同行评审,并由同一领域的Toptal专家验证.

Previously At

Cargotec

世界级的文章,每周发一次.

订阅意味着同意我们的 privacy policy

世界级的文章,每周发一次.

订阅意味着同意我们的 privacy policy

金融专家

Join the Toptal® community.