社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

Python与金融:为你的电子表格加速(1)

Python程序员 • 5 年前 • 430 次点击  


概要


  • 为什么Python是金融专业人士需要学习的一种很棒的编程语言?

  • Python在金融领域有哪些应用实例?


“对于长期依赖电子表格的职业来说,Python是很有价值的。花旗集团,一家美国银行,为它的实习分析师们引入了Python语言的速成课程。”——《经济学人》


长期以来,金融专业人员都可以在Excel中使用VBA(Visual Basic宏语言)来构建自定义功能和自动化工作流。随着近年来谷歌工作表成为电子表格领域的有力竞争者,谷歌应用程序脚本(Google Apps Script)现在提供了一个额外的选择。


但是,我想提请大家关注第三种可行方案,Python编程语言,它在许多领域中都非常流行。


在这篇文章中,我将提供一些你可以使用的Python实现的例子,从语言本身概述开始,以及为什么它在很多领域如此受欢迎,包括web开发、机器学习、金融、科学、和教育,仅举几例。第二部分由一个循序渐进的教程组成。


我写这篇文章的目的是帮助你决定Python是否足够吸引你,以便考虑将其添加到你的财务工具箱中。如果你想跨出这一步,有很多应用程序、课程、视频、文章、书籍和博客文章等可以帮助你学习这门语言。在文章的最后,我列出了一些一路上对我很有帮助的资源。


用例:我使用Python处理任务的一些例子


上世纪80年代中期,我开始在Oricon1系统上学习BASIC编程语言的基础知识。那时BASIC是最常见的初学者语言。我在80年代末到90年代中期涉猎的其他语言还有Pascal和C,但我从来没有在任何专业领域使用过它们,我也不期望需要或使用编程技能。据我所知,在90年代末,金融和编程是两个完全不同的领域,当时我选择了金融这条职业道路。


直到2012年,我想把编程作为一种爱好,所以我开始研究当时可用的语言。事实证明已经发生了很多事情,当我遇到Python时,我被它迷住了,原因有很多,我将在下一节中概述。从那时起,我用Python完成了从小型脚本到大型项目的各种任务,包括个人的和专业的。其中许多(但不是全部)都涉及电子表格,这是许多金融专业人士的工作台。


下面是一些电子表格和Python可以很好地结合在一起的例子:


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


我的工作涉及企业并购(M&A,Mergers and Acquisitions)交易的方方面面,不仅仅是执行,还有整合。在最近的一个案例中, 除了在第一个100天计划中运用看板跟踪任何给定时间数以百计的活动外,项目管理部(PMO,Project Management Office)决定采用混合的项目和工程管理方法,为12个整合的工作流中每一个的高层计划使用瀑布式规划和Gantt charts (甘特图)。所选择的看板工具MeisterTask具有许多统计和报告特性,但是我们的需求不仅仅是分析和表示,这需要定制的解决方案。这是我使用Python自动化的工作流程:


  1. 1每周将整个板块的状态保存为一个CSV文件。

  2. 2.将所有历史CSV文件读入Pandas DataFrame中。

  3. 3.对数据进行排序、筛选、分组并将其处理成我们希望如何跟踪进度的一致格式(根据活动、工作流等的状态)。

  4. 4.将输出写入到Excel文件,每个表的分析的数据将输出到其来源表,其格式可以简单地复制和粘贴到think-cell图表(一款图表创建工具)中。

  5. 5.为每月的指导委员会会议报告包创建表格和图表。


开发脚本需要几个小时的前期投资,但是现在,为指导委员会会议或特别分析更新报告包只需要几分钟。从字面上讲,大约需要30秒的时间进入正确的文件夹,用一行命令运行脚本,然后花几分钟将输出复制粘贴到幻灯片组中。随着大约500个活动(卡片)跨越12个工作流,差不多需要执行大约一个月,每周跟踪它们如何移动,在两年的规定时间轴中,你很快就会发现自己要处理很多文件中的数千个,甚至是数万个数据点。没有自动化,我们在这里讨论的就是一些非常乏味的任务。


在采用老办法继续工作还是通过设置自动化来增加初始工作量之间进行“金钱的时间价值”权衡是金融领域的一个永恒主题。在这个过程的第一步中,我也做了类似的决定,将数据导出为CSV文件。和许多现代web应用程序一样,MeisterTask有一个API,可以连接到你的Python应用程序,但是设置它所花费的时间将远远超过我们这里的用例所节省的时间。


因此,正如你所看到的,通常最佳解决方案是自动化工作流的某些步骤,并保持其他步骤是手动的。


2. 使用Web抓取、谷歌Maps API和Excel分析房价统计数据


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


  1. 1.搜集某一地区的房产信息,包括地址、面积、房数、标价以及其他特性;总共有几百到一千行信息。

  2. 2.保存到Python数据结构中。

  3. 3.连接到谷歌Maps API,并为每个列表检索属性与关键地标(如大海、城市中心、最近的火车站、最近的机场等)之间的距离。

  4. 4.将数据导出到一个Excel文件。

  5. 5.使用标准Excel功能来对数据运行回归,计算统计数据,并创建标准度量的图表,例如每平方米的价格和到地标的距离。


这里的结果可以结合你个人的偏好权重,以及在寻找房产时的财务限制。


这仅仅是两个例子,重点是自动化与电子表格相关的工作和新添加特性,但是使用Python的机会几乎是无穷无尽的。在下一节中,我将概述它变得如此流行的原因,然后再逐步学习Python中的Monte Carl模拟教程。


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


Python编程语言从1990年左右就出现了,但是直到最近几年它才开始流行起来。


Python开始流行主要有以下几个原因,我们依次来看一下。


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


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


2. 它是简洁的


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


3.易于学习和理解


影响Python语言设计选择的一个观察结果是,程序的读取频率往往高于写入频率。Python在这点上非常出色,因为它的代码看起来非常接近于普通的英语,特别是如果你以一种合理的方式命名脚本或程序的不同组件的话。


4. 适合快速迭代开发


“明智的尝试和错误胜过完美的计划。”——David Kelley


Python是构建原型和快速迭代开发(当然,还包括反复尝试和纠错)的理想工具,因为交互式解释器工具(如Python shell、IPython和Jupyter笔记本 )是Python工具链的前端和中心。在这些交互环境中,你可以单独编写和执行每一行代码,并立即看到结果(或有用的错误消息)。其他语言也有这种特性,但在大多数情况下,与 Python不在一个等级


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


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


6. 附带“内置的:”Python标准库


基本操作所需的一切都内建在该语言中,但除此之外,Python标准库还提供了处理文件、媒体、网络、日期和时间信息等的工具。这允许你在不寻找第三方包的情况下可以完成各种各样的任务。


7. 优秀的第三方金融分析库


对于金融专业人员来说,Pandas及其DataFrameSeries对象,以及Numpy和它的ndarray都是使用Python进行金融分析的主力工具。结合matplotlib和其他可视化库,你可以使用非常棒的工具来提高工作效率。


8. Python是免费的!


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


将Python用于金融的入门教程


下面是一个入门教程,展示如何创建在我之前的博客文章中描述的Monte Carlo 模拟的简化版本,但是使用的是Python而不是Excel的@RISK插件。


Monte Carlo方法依靠随机抽样来获得数值结果。其中一个应用是从一个概率分布中抽取随机样本,该概率分布表示不确定的未来状态,其中变量或假设可以取一系列的值。


在一个简化的DCF估值模型上进行Monte Carlo模拟是很有帮助的,而不是使用更常见的例子来显示选项或其他衍生品的估值,因为我们不需要任何计算财务报表和折现现金流相关的数学基本知识,这让我们专注于Python的概念和工具。但是请注意,这个基本的教程模型是用来说明关键概念的,对于其他任何实际用途都不是很有用。我也不会涉及Monte Carlo模拟的任何学术方面的东西。


本教程假设你熟悉编程的基本构建块,例如变量和函数。如果没有,花10分钟检查一下本文简介的关键概念可能会有帮助。


起点和期望的结果


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


开发小脚本的两步方法


运行它,改正它,优化它”——Kent Beck


本教程的目的是向刚接触Python的金融专业人员介绍一下一个有用的程序可能是什么样的,以及可以用来开发它的迭代过程。因此,它包括两部分:

  1. 首先,我使用一种简单的方法开发了一个工作原型,我认为这种方法很容易遵循,并且与从头开始这个项目所使用的过程并不完全相同。

  2. 然后,在开发了工作原型之后,我将遍历重构的过程——在不更改代码功能的情况下更改代码的结构。你可能想继续停留在这一部分———它比第一个解决方案更优雅,而且,作为额外的亮点,它的执行时间大约快75倍。



1. 开发工作原型


设置Jupyter 笔记本


Jupyter笔记本是与Python进行交互的一个很好的工具。它是一个交互式Python解释器,其中的单元格可以包含代码、标记文本、图像或其他数据。在本教程中,我使用了Python Quant平台,但我也推荐谷歌的Colaboratory,它是免费的,并在云端运行。进入Jupyter笔记本后,只需在“文件”菜单中选择“New python3 Notebook”,就可以开始了。


这样做之后,下一步是导入我们需要的数据操作和可视化相关的第三方包,并告诉程序我们希望在我们的笔记本中看到图表,而不是在单独的窗口中:



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


一个好的经验法则是,为程序的组件命名时,要尽量避免使用单独的注释来解释程序的功能。


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


创建财务报表


在Python中,有许多方法可以处理现有的电子表格数据。例如,我们可以使用read_excel命令用一行代码将一个工作表读入Pandas DataFrame。如果你希望你的电子表格和Python代码之间有更紧密的集成和实时链接,有其他免费和商业库可以用来提供该功能。


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


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



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



前三行我们创建了一个数据结构,它的索引由年份(每一项进行标记来显示它是实际、预算或预测),一个初始值(和最初的DCF模型中的值一样。以百万欧元为单位),和用于预测的空(NaN,“不是一个数字”)单元格。第4行打印数据的表示形式——通常,在交互式解释器中键入变量或其他对象的名称通常会得到它的一个合理的表示形式。


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


我们现在得到了预期销售额,而不是NaN:



使用同样的方法,我们继续分析财务报表,根据需要声明变量,并执行必要的计算,最终得到自由现金流。得到自由现金流后,我们就可以检查我们所得到的结果和相对应的Excel版本的DCF模型所得到的结果之间的相关性。



进而我们就得到了折现现金流:



在此阶段,最上面一行代码可能需要注释的是第二个tax_payment引用。在这里,我们使用一个小函数来确保在税前利润为负的情况下,我们不会得到正的纳税。这展示了如何有效地在Pandas Seried或DataFrame中将自定义函数应用于所有单元格。当然,实际应用的函数是一种简化。对于更大规模的估值操作,一个更现实的模型应该是一个单独的税务模型,它根据一些公司特定的因素计算实际支付的现金税。


执行DCF估值


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


我们通过在结构名称后面直接写方括号来访问元素。简单索引根据元素的位置访问元素,从0开始,这意味着free_cash_flow[1]将给出第二个元素。[-1]是访问最后一个元素的缩写形式(去年的现金流用于计算终值),并使用一个冒号给我们一个切片,这意味着[1:]将返回除第一个元素之外的所有元素,因为我们不想在我们的DCF估值包括过去的2018A年。



这就结束了原型的第一部分——我们现在有了一个在Python中工作的DCF模型,尽管是一个非常基础的模型。


导出数据


在继续进行实际的Monte Carlo 模拟之前,现在可能是介绍Pandas包中提供的导出功能的好时机。如果你有一个Pandas DataFrame对象,你可以使用to_excel方法用一行代码将数据写入Excel文件。还有类似的功能可以导出到十几种其他格式和目的地。



为我们的Monte Carlo模拟创建概率分布


现在我们准备处理下一个挑战:用概率分布替换一些点估计输入。虽然与在Excel中构建相同的模型相比,到目前为止的步骤似乎有些麻烦,但下面几行代码将让你一窥Python的强大。


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



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


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


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



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




(待续,见下文)

英文原文:https://www.toptal.com/finance/financial-modeling/python-and-finance
译者:天天向上



今天看啥 - 高品质阅读平台
本文地址:http://www.jintiankansha.me/t/ytT6SJEa0T
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/29066
 
430 次点击