Python 和金融——为您的电子表格提供动力

已发表: 2022-03-11

执行摘要

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

对于长期依赖于电子表格拖网的职业来说,Python 尤其有价值。 美国银行花旗集团为其实习分析师开设了 Python 速成课程。 - 经济学家

财务专业人员长期以来一直可以访问 Excel 中的 VBA(Visual Basic for Applications)来构建自定义功能和自动化工作流程。 随着近年来 Google Sheets 成为电子表格领域的有力竞争者,Google Apps Script 现在提供了额外的选择。

但是,我想提请注意第三种选择,即 Python 编程语言,它在许多领域都非常流行。

在这篇文章中,我将提供一些例子来说明你可以用 Python 完成什么,首先是对语言本身的概述,以及为什么它在如此广泛的领域如此受欢迎,包括 Web 开发、机器学习、金融、科学和教育,仅举几例。 下半部分将包括一个分步教程。

我写这篇文章的目的是帮助您确定 Python 是否看起来足够吸引您考虑将其添加到您的财务工具箱中。 如果你迈出这一步,有许多应用程序、课程、视频、文章、书籍和博客文章可用于学习该语言。 在文章的最后,我列出了一些对我有帮助的资源。

用例:我使用 Python 的示例

我对编程的介绍是在 1980 年代中期在 Oric 1 上学习 BASIC。 当时 BASIC 是最常见的初学者语言。 我在 80 年代后期到 90 年代中期涉足的其他语言是 Pascal 和 C,但我从未以任何专业身份使用过它们,而且我没想到需要或使用编程技能。 据我当时所知,在 90 年代后期,当我选择走上金融职业道路时,金融和编程是截然不同的领域。

快进到 2012 年,我希望将编程作为一种爱好,所以我开始研究当时可用的语言。 结果发生了很多事情,当我遇到 Python 时,我被迷住了,原因有很多,我将在下一节中概述。 从那时起,我将 Python 用于各种任务,从小型脚本到大型项目,无论是个人还是专业。 许多(但不是全部)都涉及电子表格,这是许多金融专业人士的工作台。

以下是电子表格和 Python 可以很好地结合使用的几个示例:

1. 在并购整合 PMO 设置中随时间跟踪数百项活动

我处理并购交易的各个方面,不仅仅是执行,还有整合。 在最近的一个案例中,PMO 团队决定采用混合计划和项目管理方法,使用瀑布规划和甘特图为 12 个集成工作流中的每一个提供高级计划,此外还使用看板来跟踪数百个正在进行的活动在任何给定时间,在第一个 100 天计划及以后。 选择的看板工具 MeisterTask 具有许多统计和报告功能,但我们的需求超出了分析和呈现方面的需求,这需要定制解决方案。 这是我使用 Python 自动化的工作流程:

  1. 每周将整个董事会的状态保存为 CSV 文件。
  2. 将所有历史 CSV 文件读入 Pandas DataFrame。
  3. 对数据进行排序、过滤、分组和操作,以我们希望如何跟踪进度的约定格式(通过活动状态、工作流等)。
  4. 将输出写入 Excel 文件,其中每个分析的数据都包含在其自己的工作表中,其格式可以简单地复制并粘贴到 think-cell 图表中。
  5. 为每月指导委员会会议的报告包创建表格和图表。

开发脚本需要几个小时的前期投资,但现在,为指导委员会会议或临时分析更新报告包只需几分钟。 从字面上看,大约需要 30 秒才能转到正确的文件夹并使用一行命令运行脚本,然后再花几分钟将输出复制粘贴到幻灯片中。 12 个工作流中的大约 500 项活动(卡片)已经执行大约一个月,每周跟踪它们的移动方式,在两年的计划时间线内,您很快就会发现自己要处理成千上万个数据点,最终数十万个数据点的文件。 如果没有自动化,我们在这里讨论的是一些非常乏味的任务。

在继续做事情或通过设置自动化增加更多初始工作量之间的“金钱时间价值”权衡是金融界的一个常见主题。 我在此过程的第一步中做出了类似的决定,将数据导出为 CSV 文件。 MeisterTask 与许多现代 Web 应用程序一样,有一个 API,可以连接到您的 Python 应用程序,但是设置它所花费的时间将远远超过我们在此用例中节省的时间。

因此,如您所见,最佳解决方案通常是自动化工作流程的某些步骤,而让其他步骤保持手动。

2. 使用 Web Scraping、Google Maps API 和 Excel 分析房价统计数据

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

  1. 抓取特定区域的房地产清单数据,包括地址、大小、房间数量、要价和其他特征; 总共几百到一千行。
  2. 保存到 Python 数据结构中。
  3. 连接到 Google Maps API,并为每个列表检索物业与主要地标之间的距离,例如大海、市中心、最近的火车站、最近的机场等。
  4. 将数据导出到 Excel 文件。
  5. 使用标准 Excel 功能运行回归、计算统计数据并根据标准指标(例如每平方米价格和到地标的距离)创建图表。

此处的结果可以与您自己在偏好方面的个人权重以及寻找房地产时的财务限制相结合。

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

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

编程语言 Python 自 1990 年以来一直存在,但直到最近几年它的受欢迎程度才呈爆炸式增长。

python是搜索最多的编程语言

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

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

高级编程语言是一种抽象出计算机内部工作的许多细节的语言。 一个很好的例子是内存管理。 除了处理任务所需的时间和代码行数之外,低级编程语言还需要详细了解计算机内存的布局、分配和释放方式的复杂性。 Python 会自动抽象并处理其中的许多细节,让您专注于您想要完成的事情。

2.简洁

因为 Python 是一种高级编程语言,所以代码更加简洁,几乎完全专注于你想要实现的业务逻辑,而不是技术实现细节。 语言设计选择对此做出了贡献:例如,Python 不需要像许多其他语言那样使用花括号或分号来描述函数、循环和行,这使得它更加简洁,并且正如一些人认为的那样,改进了可读性。

3. 易于学习和理解

影响 Python 语言设计选择的一个观察结果是,程序的阅读频率高于编写频率。 Python 在这里表现出色,因为它的代码看起来非常接近简单的英语,尤其是当您以合理的方式命名脚本或程序的不同组件时。

4. 适合快速、迭代开发

开明的试错胜过完美智慧的计划。 - 大卫凯利

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

5. 可用于原型设计和生产代码

除了非常适合原型设计之外,Python 还是用于大型生产应用程序的优秀且强大的语言。 世界上一些最大的软件公司在各种应用程序和用例中大量使用 Python。

6. 附带“包含的电池”:Python 标准库

基本操作所需的一切都内置在语言中,但除此之外,Python 标准库还具有用于处理文件、媒体、网络、日期和时间信息等的工具。 这使您无需寻找第三方软件包即可完成各种任务。

7. 优秀的财务分析第三方库

对于金融专业人士来说,带有DataFrameSeries对象的 Pandas 以及带有ndarray的 Numpy 是使用 Python 进行金融分析的主力军。 结合 matplotlib 和其他可视化库,您可以使用出色的工具来提高生产力。

8. Python 是免费的!

Python 是在开源许可下开发的,因此也可以免费用于商业用途。

一起使用 Python 和金融的分步教程

下面是一个分步教程,展示了如何创建我之前的博客文章中描述的蒙特卡洛模拟的简化版本,但使用 Python 而不是 Excel 的 @RISK 插件。

蒙特卡洛方法依靠随机抽样来获得数值结果。 一个这样的应用是从代表世界不确定的潜在未来状态的概率分布中抽取随机样本,其中变量或假设可以采用一系列值。

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

本教程假定您熟悉编程的基本构建块,例如变量和函数。 如果没有,花 10 分钟时间检查一下本介绍中的关键概念可能会有所帮助。

起点和期望的结果

我从蒙特卡洛模拟教程中使用的非常简化的 DCF 估值模型开始。 它包含三个财务报表中的一些关键行项目,以及三个突出显示的输入单元格,在 Excel 版本中,这些单元格具有点估计值,我们现在希望用概率分布替换这些点估计值,以开始探索潜在的结果范围。

财务预测示例

开发小脚本的两步法

让它发挥作用,让它正确,让它快速 - 肯特贝克

本教程的目的是向不熟悉 Python 的金融专业人士介绍一个有用的程序可能是什么样子,还介绍了您可以用来开发它的迭代过程。 因此,它有两个部分:

  1. 首先,我使用一种简单的方法开发了一个工作原型,我认为这种方法很容易遵循,并且与从头开始可以用来启动这个项目的过程完全不同。
  2. 然后,在开发出工作原型之后,我会经历重构的过程——在不改变其功能的情况下改变代码的结构。 您可能希望继续使用该部分 - 它是一个比第一个解决方案更优雅的解决方案,并且作为奖励,它在执行时间方面快了大约 75 倍。

1. 开发工作原型

设置 Jupyter Notebook

Jupyter notebook 是一个很好的交互式使用 Python 的工具。 它是一个交互式 Python 解释器,其单元格可以包含代码、Markdown 文本、图像或其他数据。 对于本教程,我使用了 Python Quant Platform,但我也可以推荐 Google 的 Colaboratory,它是免费的并且在云中运行。 在那里,只需在“文件”菜单中选择“新建 Python 3 Notebook”,就可以开始了。

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

 import numpy as np import pandas as pd import matplotlib.pyplot as plt %matplotlib inline

在我们开始命名我们的第一个变量之前的注释。 正如我已经强调的那样,可读性是 Python 的优势之一。 语言设计在很大程度上支持这一点,但每个编写代码的人都有责任使其可读性和可理解性,不仅是为了他人,也是为了他们自己。 正如伊格森定律所说,“任何你自己的代码,如果你有六个月或更长时间没有看过,那也可能是别人写的。”

一个好的经验法则是以这样一种方式命名程序的组件,以尽量减少对解释程序功能的单独注释的需求。

考虑到这一点,让我们继续前进。

创建财务报表

我们可以通过多种方式在 Python 中处理现有的电子表格数据。 例如,我们可以使用read_excel命令通过一行代码将工作表读入 Pandas DataFrame。 如果您想在电子表格和 Python 代码之间实现更紧密的集成和实时链接,可以使用免费和商业选项来提供该功能。

由于这里的模型非常简单,并且为了让我们专注于 Python 概念,我们将在脚本中从头开始重新创建它。 在第一部分的最后,我将展示如何将我们创建的内容导出到电子表格中。

作为创建财务报表的 Python 表示的第一步,我们需要一个合适的数据结构。 有很多可供选择,一些内置于 Python,另一些来自各种库,或者我们可以创建自己的。 现在,让我们使用 Pandas 库中的 Series 来看看它的功能:

 years = ['2018A', '2019B', '2020P', '2021P', '2022P', '2023P'] sales = pd.Series(index=years) sales['2018A'] = 31.0 sales

该输入及其对应的输出如下所示:

从 python 库创建一个系列

在前三行中,我们创建了一个数据结构,其索引由年份(每个标记以显示它是实际、预算还是预计)、起始值(以百万欧元为单位,如在原始 DCF 模型中)和用于投影的空(NaN,“非数字”)单元格。 第四行打印数据的表示 - 通常,在交互式解释器中键入变量或其他对象的名称通常会给您一个合理的表示。

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

 growth_rate = 0.1 for year in range(1, 6): sales[year] = sales[year - 1] * (1 + growth_rate) sales

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

python 和金融:预测销售数字

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

 ebitda_margin = 0.14 depr_percent = 0.032 ebitda = sales * ebitda_margin depreciation = sales * depr_percent ebit = ebitda - depreciation nwc_percent = 0.24 nwc = sales * nwc_percent change_in_nwc = nwc.shift(1) - nwc capex_percent = depr_percent capex = -(sales * capex_percent) tax_rate = 0.25 tax_payment = -ebit * tax_rate tax_payment = tax_payment.apply(lambda x: min(x, 0)) free_cash_flow = ebit + depreciation + tax_payment + capex + change_in_nwc free_cash_flow

这给了我们自由现金流:

python的贴现现金流输出

在此阶段可能需要评论的上面一行是第二个tax_payment参考。 在这里,我们应用了一个小函数来确保在税前利润变为负数的情况下,我们不会有正的纳税。 这显示了您可以如何有效地将自定义函数应用于 Pandas 系列或 DataFrame 中的所有单元格。 当然,实际应用的功能是一种简化。 对于更大的估值活动,更现实的模型将有一个单独的税收模型,该模型根据许多公司特定因素计算实际支付的现金税。

执行 DCF 估值

得出预计现金流后,我们现在可以计算一个简单的终值并将所有现金流折现到现在,以获得 DCF 结果。 以下代码介绍了索引和切片,它允许我们访问数据结构中的一个或多个元素,例如 Pandas Series 对象。

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

 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 模型,尽管它是一个非常初级的 Python 模型。

导出数据

在继续进行实际的蒙特卡洛模拟之前,现在可能是提一下 Pandas 包中可用的导出功能的好时机。 如果您有一个 Pandas DataFrame 对象,您可以使用to_excel方法将其写入一个 Excel 文件中的一行。 也有类似的功能可以导出到十几种其他格式和目的地。

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

使用python生成的excel表格输出示例

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

现在我们准备好应对下一个挑战:用概率分布替换一些点估计输入。 虽然与在 Excel 中构建相同的模型相比,到目前为止的步骤可能看起来有些繁琐,但接下来的几行将让您了解 Python 的强大功能。

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

 iterations = 1000 sales_growth_dist = np.random.normal(loc=0.1, scale=0.01, size=iterations) ebitda_margin_dist = np.random.normal(loc=0.14, scale=0.02, size=iterations) nwc_percent_dist = np.random.normal(loc=0.24, scale=0.01, size=iterations) plt.hist(sales_growth_dist, bins=20) plt.show() 

python的蒙特卡罗模拟输出

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

您选择分布和参数所需的数据越少,您就越需要依赖各种尽职调查工作流的结果,并结合经验,就可能的情景范围形成共识。 在这个例子中,对于现金流量预测,会有很大的主观成分,这意味着可视化概率分布变得很重要。 在这里,我们可以得到一个基本的可视化,显示销售增长分布,只需要两行短代码。 通过这种方式,我们可以快速查看最能反映团队集体观点的任何分布。

现在我们拥有了运行模拟所需的所有构建块,但它们的格式不适合运行模拟。 这是迄今为止我们使用的相同代码,但所有代码都集中在一个单元格中,并为方便起见重新排列为一个函数:

 def run_mcs(): # Create probability distributions sales_growth_dist = np.random.normal(loc=0.1, scale=0.01, size=iterations) ebitda_margin_dist = np.random.normal(loc=0.14, scale=0.02, size=iterations) nwc_percent_dist = np.random.normal(loc=0.24, scale=0.01, size=iterations) # Calculate DCF value for each set of random inputs output_distribution = [] for i in range(iterations): for year in range(1, 6): sales[year] = sales[year - 1] * (1 + sales_growth_dist[0]) ebitda = sales * ebitda_margin_dist[i] depreciation = (sales * depr_percent) ebit = ebitda - depreciation nwc = sales * nwc_percent_dist[i] change_in_nwc = nwc.shift(1) - nwc capex = -(sales * capex_percent) tax_payment = -ebit * tax_rate tax_payment = tax_payment.apply(lambda x: min(x, 0)) free_cash_flow = ebit + depreciation + tax_payment + capex + change_in_nwc # DCF valuation terminal_value = (free_cash_flow[-1] * 1.02) / (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_cash_flow[1:] * discount_factors ) output_distribution.append(dcf_value) return output_distribution

我们现在可以运行整个模拟并绘制输出分布,这将是该公司在 1000 次迭代中的每一次迭代中的贴现现金流值,使用以下代码。 %time命令不是 Python 代码,而是一个记事本简写,用于测量运行某些东西的时间(您可以改用标准库中的 Python 函数)。 这取决于您运行它的计算机,但此版本需要 1-2 秒来运行 1,000 次迭代并可视化结果。

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

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

2. 完善原型

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

重构是指重写现有代码以改进其结构而不改变其功能的过程,它可能是编码中最有趣和最有价值的元素之一。 这样做可能有几个原因。 它可能是:

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

为了展示该过程中的一个步骤可能是什么样子,我通过将所有初始变量收集在一个地方来清理我们刚刚完成的原型,而不是像原型脚本中那样分散在各处,并通过一个名为矢量化

使用 NumPy 数组可以将多种数据处理任务表达为简洁的数组表达式,否则可能需要编写循环。 这种用数组表达式替换显式循环的做法通常称为向量化。 韦斯·麦金尼

它现在看起来更干净,更容易理解:

 # Key inputs from DCF model 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(): # Generate probability distributions sales_growth_dist = np.random.normal(loc=sales_growth, scale=sales_std_dev, size=(years, iterations)) ebitda_margin_dist = np.random.normal(loc=ebitda_margin, scale=ebitda_std_dev, size=(years, iterations)) nwc_percent_dist = np.random.normal(loc=nwc_percent, scale=nwc_std_dev, size=(years, iterations)) # Calculate free cash flow 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 = sales * ebitda_margin_dist ebit = ebitda - (sales * depr_percent) tax = -(ebit * tax_rate) np.clip(tax, a_min=None, a_max=0) nwc = nwc_percent_dist * sales starting_nwc = starting_sales * nwc_percent prev_year_nwc = np.roll(nwc, 1, axis=0) prev_year_nwc[0] = starting_nwc delta_nwc = prev_year_nwc - nwc capex = -(sales * capex_percent) free_cash_flow = ebitda + tax + delta_nwc + capex # Discount cash flows to get DCF value 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((free_cash_flow.T * discount_rates).T) dcf_value += terminal_value * discount_rates[-1] return dcf_value

您会注意到此版本与前一个版本之间的主要区别是缺少for i in range(iterations)循环。 使用 NumPy 的数组操作,该版本的运行时间为 18 毫秒,而原型版本的运行时间为 1.35 秒——大约快了 75 倍。

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

NumPy 数组操作示例

我确信进一步的优化是可能的,因为我只是为了本教程的目的而在短时间内将原型和改进版本放在一起。

更进一步

本教程展示了 Python 的一些强大功能,如果您要进一步开发它,机会几乎是无穷无尽的。 例如,您可以:

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

我什至还没有提到你还可以使用各种 Web、数据科学和机器学习应用程序来做什么,这些应用程序对 Python 的成功做出了贡献。

总结:金融工具箱的有用语言

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

对我来说,归根结底,Python 技术的杀手锏就是使用起来很有趣! 如果您喜欢解决问题、构建事物和提高工作流程效率,那么我鼓励您尝试一下。 我很想听听你用它做了什么或想用它做什么。

金融专业人士学习 Python 的推荐资源

  • 奥莱利的书。 我可以特别推荐:
    • Yves Hilpisch 的 Python 金融
    • Learning Python by Mark Lutz
    • Fluent Python by Luciano Ramalho
  • The Python Quants
  • PyCon talks on YouTube
  • 乌迪米