前言
重塑你对银行的看法,首先要了解最新且最有效的方法,如人工智能(AI)。《银行业人工智能实践》是一本实践指南,将帮助你在银行领域中取得职业上的进步。本书将展示如何实现人工智能,使你的银行服务更加顺畅、成本更低、更易于客户访问,重点介绍人工智能在客户端和服务器端的应用。
你将首先学习人工智能的重要性,同时深入了解最近人工智能在银行业中的革命。接下来,你将获得实践性的机器学习经验,探索如何使用时间序列分析和强化学习来自动化客户采购以及银行和金融决策。在此之后,你将学习如何机械化资本市场决策,使用自动化的投资组合管理系统,预测投资银行的未来。此外,你还将探索诸如构建个人财富顾问和大规模定制客户终身财富等概念。最后,你将掌握银行领域中一些真实世界的人工智能应用。
在本书结束时,你将具备利用人工智能的力量在金融领域中导航所需的技能。
本书适合谁
-
本书的目标读者是银行业或技术领域的学生,因为在出版领域中,关于人工智能技术如何应用于银行和金融行业的内容尚存在空白。本书旨在提供一份合理实用的、广为人知的案例清单,并提供易于实施的真实示例代码。通过本书,我试图阐述重要的应用案例,而不是给你提供一个可以立刻投入使用的机器学习模型。
-
对于已经在银行业工作的银行家来说,我相信这本书将帮助你在长期内构建你的服务。它可能会鼓励你挑战任何明显不同于初创公司运作方式的事物,如果你曾经打算创办一家公司。变革需要从内到外、从外到内地进行。对于银行中的 IT 经理来说,本书将为你提供具体的代码基础,展示这些技术如何应用,以及有哪些开源库可用。也许你并不完全相信将一切都在内部开发用于生产。本书为你希望启动的任何实验提供了代码基础。
-
对于投资者、有志成为创业者的创业者或 MBA 学生来说,本书是行业参与者分享我们面临的问题和挑战的努力。请通过创造更符合我们需求的产品来改善银行业。我希望你的投资之旅顺利。
-
对于那些在该领域创业的金融科技初创企业,本书为你提供了平台,并鼓励你开源、合作解决行业挑战,而不是将你的工作封闭源代码。
-
对于监管者来说,这是一本关于银行业发生什么事情的指南。你的工作在银行业采用人工智能方面起着重要作用——与此同时,你可以挑战模型和决策,通过开放更多的数据供分析,来促进研究。
-
作为特许金融分析师(CFA),我有责任让人工智能的投资更加有效和高效。做到这一点的最佳方法是对技术有实践性的了解。如果公司或投资项目只是复制粘贴代码并附带一个炫耀的知名学校名称,那就忽略它,把精力放在更好的地方。
-
对于研究分析师和管理顾问来说,本书提供了一种自下而上的方法,帮助你了解我们如何能够改变银行,使其能够更好地运营,从而提高股本回报率。
-
最后但同样重要的是,人工智能硬件和软件开发人员及研究人员,这可能会帮助你在寻找研究主题时发现常见的机会,万一你需要一些灵感。
本书涵盖内容
第一章,人工智能在银行业中的重要性,解释了什么是人工智能,并讨论了它在银行业中的应用。本章还详细介绍了银行业作为一个行业的背景,银行过程的复杂性以及银行职能的多样化。
第二章,时间序列分析,介绍了时间序列分析。本章通过实例详细解释了时间序列分析,并阐述了机器对机器(M2M)概念在实施时间序列分析中的作用。
第三章,利用特征和强化学习来自动化银行融资,介绍了强化学习。还涵盖了不同的人工智能建模技术,通过实例展示,并探讨了银行在这些实例中的业务职能。
第四章,资本市场决策的机械化,讨论了基本的金融和资本市场概念。我们将探讨人工智能如何通过运行风险模型和利用宏观经济数据生成销售预测来帮助我们优化最佳的资本结构。本章还涵盖了重要的机器学习建模技术,如学习优化和线性回归。
第五章,预测投资银行家的未来,介绍了人工智能技术,随后讨论了新问题的自动联合。我们将看到如何从感兴趣的投资者那里获得资金。在本章的后部分,我们将探讨识别收购方和目标公司的案例——这个过程需要通过科学方法挑选出需要银行服务的公司。
第六章,使用 Treynor-Black 模型和 ResNet 的自动化投资组合管理,聚焦于投资者的动态。本章讨论了投资组合管理技术,并解释了如何将其与 AI 结合,以在购买资产时实现自动化决策。
第七章,在卖方侧进行算法营销的市场情绪感知,聚焦于金融市场的卖方。本章提供了关于证券公司和投资银行的详细信息。本章还讨论了情绪分析,并涵盖了一个使用 Neo4j 构建网络的示例。
第八章,通过银行 API 构建个人财富顾问,聚焦于消费者银行业务。本章解释了管理客户数字数据的要求。本章还讲解了如何访问开放银行 API,并分析了文档布局。
第九章,客户生命周期财富的大规模定制,讲解了如何结合调查数据进行个人数据分析。本章还讨论了 Neo4j,这是一种图形数据库。在本章中,我们将构建一个 24/7 服务客户的聊天机器人。我们还将通过一个示例,使用自然语言处理、Neo4j 和 Cypher 语言来预测客户的响应,并操作 Neo4j 数据库中的数据。
第十章,现实世界的考虑因素,作为对前几章所讲解的 AI 建模技术的总结。本章还展示了在哪里可以获取更多领域知识。
为了最大限度地利用本书的内容
在开始之前,我假设你正在运行 Ubuntu 16.04LTS Desktop 或更高版本,并且已经完成了 Python 101 课程。假定你已具备安装相关软件包的知识,本书不会涵盖这些内容。
本书使用了三种数据库引擎(SQLite、MongoDB 和 Neo4j)。请确保已安装这些数据库引擎。
data.world/www.quandl.com/databases/SFA/datawww.quandl.com/databases/SFP/datadeveloper.twitter.com/en/docs/tweets/search/overview/premiumuk.openbankproject.com/
下载示例代码文件
您可以从www.packt.com账户中下载本书的示例代码文件。如果您在其他地方购买了本书,您可以访问www.packt.com/support,注册后我们会直接通过邮件发送文件给您。
您可以按照以下步骤下载代码文件:
-
登录或注册www.packt.com。
-
选择“支持”标签。
-
点击代码下载与勘误表。
-
在搜索框中输入书名并按照屏幕上的指示操作。
下载文件后,请确保使用最新版本的工具解压或提取文件夹:
-
Windows 平台的 WinRAR/7-Zip
-
Mac 平台的 Zipeg/iZip/UnRarX
-
Linux 平台的 7-Zip/PeaZip
github.com/PacktPublishing/Hands-On-Artificial-Intelligence-for-Banking
github.com/PacktPublishing/
下载彩色图像
static.packt-cdn.com/downloads/9781788830782_ColorImages.pdf
使用的约定
本书中使用了多种文本约定。
CodeInTextSHARADAR
代码块如下所示:
#list of key intent, product and attribute
product_list = ['deposit','loan']
attribute_list = ['pricing','balance']
intent_list = ['check']
print('loading nlp model')
nlp = spacy.load('en_core_web_md')
任何命令行输入或输出都如下所示:
sudo cp dataset.csv /var/lib/Neo4j/import/edge.csv
sudo cp product.csv /var/lib/Neo4j/import/product.csv
sudo cp customer.csv /var/lib/Neo4j/import/customer.csv
粗体:表示新术语、重要词汇或在屏幕上看到的词汇。例如,菜单或对话框中的词汇在文本中呈现如下。举个例子:“资产类别定义为一组具有相似特征的资产。”
警告或重要提示如下所示。
提示和技巧如下所示。
与我们联系
我们非常欢迎读者的反馈。
customercare@packtpub.com
勘误表:尽管我们已尽力确保内容的准确性,但错误仍然可能发生。如果您在本书中发现了错误,我们将非常感谢您向我们报告。请访问www.packt.com/submit-errata,选择您的书籍,点击“勘误提交表单”链接,并填写相关细节。
copyright@packt.com
如果您有兴趣成为作者:如果您在某个领域有专业知识,并且有兴趣撰写或参与编写书籍,请访问authors.packtpub.com。
评论
请留下评论。在您阅读并使用完本书后,为什么不在您购买本书的网站上留下评论呢?潜在读者可以参考并使用您的公正意见做出购买决策,我们 Packt 可以了解您对我们产品的看法,作者也能看到您对其书籍的反馈。谢谢!
第一部分:金融行业中 AI 的简要回顾
本节提供了银行业的整体经济和金融概述——这在 IT 编程书中是很少见的。它旨在让技术人员和商业专业人士都能了解两方面的内容。
本节包括以下章节:
- 第一章,AI 在金融中的重要性
第一章:人工智能在银行业中的重要性
人工智能,通常被称为AI,是一项非常强大的技术。精心实施 AI 可以在自动化业务功能方面创造奇迹。AI 具有通过应用改变各种行业的能力。随着计算机系统的不断发展,它们变得非常强大。因此,机器也变得非常强大,并且能够轻松地执行许多复杂的任务。例如,光学字符识别(OCR)是一项即使是个人计算机也能在软件的帮助下轻松完成的任务。然而,OCR 需要智能才能将图像中的点转化为字符。因此,在理想情况下,OCR 将被视为 AI 的一个领域。然而,正因为机器的强大,我们往往不将其视为 AI 的应用。
www.forbes.com/sites/forbestechcouncil/2018/12/05/how-artificial-intelligence-is-helping-financial-institutions/#2e989fae460a
我们将从 AI 和银行业作为一个行业的简要介绍开始。在这里,我们将定义如何在软件系统中实施 AI 的方法。我们还将了解银行业如何从 AI 的应用中受益。完成本章之前,还有许多其他主题需要讨论。因此,不如直接跳入内容,而不是简单地讨论你可以从本章中期待什么!
本章将重点讨论以下主题:
-
什么是 AI?
-
了解银行业
-
便捷银行服务的重要性
-
AI 在银行业中的应用
什么是 AI?
AI,也称为机器智能,是关于创造能够展示通常由人类表现的自然智能的机器。约翰·麦卡锡在 1955 年创造了人工智能这一术语。
www.darpa.mil/www.ti.com/www.xerox.com/
从某种程度上来说,人工智能有助于将决策过程从人类转移到机器上,这基于预定义的规则。在计算机科学领域,人工智能也被定义为智能代理的研究。智能代理是任何能够从环境中学习并根据所学做出决策以最大化实现其预定目标概率的设备。
人工智能能够解决广泛的各种问题。这些问题包括但不限于简单的数学难题、从一个地点到另一个地点的最佳路线、理解人类语言,以及处理大量的研究数据以生成有意义的报告。以下是系统必须具备的一些能力以及每项能力的简要描述:
-
推理:解决难题和进行基于逻辑的推断的能力
-
知识表示:处理研究人员和专家收集的知识的能力
-
规划:设定目标并定义成功实现目标的方式的能力
-
学习:通过经验来改进算法的能力
-
自然语言处理(NLP):理解人类语言的能力
-
感知:利用传感器和设备,如摄像头、麦克风等,获取足够的信息来理解和解释环境中的不同特征的能力
-
运动:移动的能力
机器是如何学习的?
让我们快速了解一下机器学习的基础知识。机器可以使用三种方法来进行学习:监督学习、无监督学习和强化学习,具体如下所示:
- 监督学习基于挖掘有标签的训练数据的概念。训练数据表示为由提供的输入(也称为特征向量—这是一个数字向量,可以将输入数据作为特征用数字表示)和预期的输出数据(也称为标签)组成的一对。每对数据都会附上一个标签。下图展示了监督学习方法:
- 无监督学习基于一种情况,即训练数据在没有任何数据背后信息的情况下提供,这意味着训练数据没有标签。无监督学习算法将尝试为这些训练数据找到隐藏的意义。下图展示了无监督学习方法:
- 强化学习是一种没有训练数据的机器学习技术。这种方法基于两样东西——一个代理和给予该代理的奖励。代理预计会根据其经验获得奖励。下图展示了强化学习方法:
实施 AI 的软硬件要求
开源运动(将在可及银行业务的重要性部分讨论)推动了软件开发。该运动与硬件的改进(例如,GPU、CPU、存储和网络硬件)相伴而行。同时,也得到了无数英雄的支持,他们致力于改善硬件性能和互联网连接性。这些技术人员已经将 AI 算法开发到能够接近人类性能的程度。
以下图表展示了每当我们实施软件进行机器学习项目时应考虑的典型技术栈:
以下表格细分了贡献于前述图表中不同软件组件的几项关键技术:
www.tensorflow.org/scikit-learn.org/stable/keras.io/www.image-net.org/pandas.pydata.org/www.numpy.org/www.nvidia.com/en-us/docs.python.org/3/library/idle.html
在我们简要介绍了将贯穿本书的工具、技术和包之后,接下来我们将探索 AI 的一个重要领域——深度学习。以下部分将详细解释深度学习和神经网络。
神经网络与深度学习
www.deeplearningbook.org/www.packtpub.com/big-data-and-business-intelligence/deep-learning-keras?utm_source=github&utm_medium=repository&utm_campaign=9781787128422
深度学习是机器学习的一个特殊子领域或分支。深度学习方法灵感来自于一种模仿人脑的计算机系统,称为神经网络。
银行通过移动或网络应用程序聊天机器人进行在线客户支持是深度学习在银行业中的一个很好的例子。这些应用程序(即聊天机器人)在理解客户请求、偏好和兴趣的上下文方面非常强大。聊天机器人连接到与数据存储交互的后端应用程序。根据客户的输入或服务选择,聊天机器人向客户呈现各种可选的子服务。
聊天机器人或深度学习应用程序工作在层次结构中。它可以类比学习语言。例如,一旦一个人通过严格学习如何唯一地识别每个字母来掌握字母表,他们就有资格进入下一层复杂性——单词。这个人将开始学习小词和长词。掌握了单词后,这个人将开始组成句子,理解不同层次复杂性的语法概念。一旦他们达到这个层次结构的顶部,这个人就能掌握这门语言了。
你可能已经注意到,在每个阶段或层次的层次结构中,学习变得更加复杂。每一层都是基于从前一层复杂性中获得的学习或知识构建的。这就是深度学习的工作方式。程序不断学习,基于从前一层接收到的知识形成更多复杂层次的新知识。分层复杂性正是"深度"一词的来源。深度学习是一种无监督学习,因此比监督学习快得多。
深度学习的主要影响在于,模型的性能更好,因为它可以容纳更复杂的推理。我们希望金融决策能够准确执行。这意味着在平衡银行客户利益的同时,更有效地给股东合理的回报。
我们期望智能机器做到的事情就像输入、处理和输出一样简单,如下图所示:
在大多数金融应用场景中,我们部署的是监督学习,这类似于训练动物的过程——在这里,你为正确的结果提供奖励,并对错误的结果进行惩罚。这就是为什么我们需要有结果(即目标变量)来进行训练的原因。
实现 AI 的硬件要求
在为银行设置硬件预算时,你需要确保它包含正确的配置。这将使你能够在财务成果或市场时间方面交付承诺的结果,尤其是现在你即将从零开始建立一家银行!
鉴于银行面临的经济压力相当大,你最好确保每一分钱都能发挥作用。为了实现这一点,我们需要了解硬件对 AI 的贡献,以确保我们拥有正确的资源。
图形处理单元
除了软件和算法,使用图形处理单元(GPU)和固态硬盘(SSD)有助于加速机器学习。GPU 和 SSD 的使用使得计算机能够进行智能思考。
GPU 是一个专门设计的电路,能够以并行的方式处理计算。这适用于计算机图形处理,其中每个像素需要同时处理,以生成完整的图像。为了形象化这一点,假设有 10 个像素需要处理。我们可以依次处理这 10 个像素,或者我们可以同时处理它们,通过 10 个并行进程。
CPU 具有每个像素快速处理的独特优势,而 GPU 则具有多个线程,可以同时处理平面数据。CPU 和 GPU 都能进行不同程度的并行数据处理。下表展示了顺序数据处理和并行数据处理的区别:
| 顺序数据处理 | 并行数据处理 |
|---|---|
| 数据按顺序输入,这需要更长时间来完成计算。 | 数据并行输入,这提高了处理时间。 |
除了擅长处理图像外,GPU 还被用于深度学习。虽然深度学习描述了神经网络的层数,但深度神经网络通常被认为具有广泛的记录和许多变量来描述输入。
当与 GPU 一起使用时,固态硬盘(SSD)还可以提高读取和写入数据到 CPU/GPU 进行处理的速度。
固态硬盘
机器学习的另一个硬件要求是称为 SSD 的存储设备。传统的硬盘通过机械马达将读写头放置在磁带或磁盘的指定位置。与此不同,SSD 使用电流在电路上读写数据,无需马达的移动。将马达的机械运动与电流进行比较,SSD 的数据检索速度比传统硬盘快 20 倍。
对于运筹学的学生来说,比较这两者就像识别硬件容量一样简单——这类似于我们如何设计一个工厂——找出容量并尽量减少瓶颈!
建模方法——CRISP-DM
CRISP-DM 指的是 跨行业数据挖掘标准过程。数据挖掘是探索大量数据以识别模式的过程,这些模式将应用于下一组数据,从而生成期望的结果。为了创建本书中的模型,我们将使用 CRISP-DM 建模方法。这将帮助我们保持实施机器学习项目的统一方法。以下图表展示了在机器学习项目中使用 CRISP-DM 方法执行项目的过程:
如您在前面的图表中所看到的,CRISP-DM 方法有多个阶段。我们可以如下详细解释它们:
-
商业理解:这一阶段涉及定义项目的商业目标。在这一阶段,你需要澄清与核心商业目标相关的问题。例如,一个核心商业目标可能是预测客户何时离开某个特定网站,使用客户与该网站互动的历史数据。需要澄清的相关问题可能是当前的支付界面是否是客户离开网站的原因。商业成功标准也会在项目执行的这一阶段被明确。
-
数据理解:这一阶段涉及理解在数据库或数据存储中挖掘的历史数据。数据会根据其大小、格式、数量、记录数、与商业相关的重要性、字段、数据来源等方面进行分析。
-
数据准备:这一阶段涉及将数据的质量提升到机器学习算法所需的处理水平。数据准备的例子包括将数据格式化为所需的格式,将数字四舍五入到可接受的精度,以及准备派生属性。
-
建模:这一阶段涉及选择要应用的建模技术或算法。建模算法用于找到一个函数,当输入应用时,能够生成期望的输出。
-
评估:这一阶段涉及评估在前一阶段构建的训练模型的准确性。根据需要对模型进行修正,以提高效率和准确性。
-
部署:这一阶段涉及定义训练模型在实际环境中针对新数据进行部署的策略。模型会被监控以确保其准确性。
在大致介绍了什么是人工智能、机器如何学习以及人工智能实现的方法之后,现在是时候将银行业作为一个行业来审视了。在接下来的部分,我们将探讨银行业的不同类型以及该行业所面临的挑战。
了解银行业
银行业被定义为一个专注于通过特定方法持有某些类型的金融资产的经济部门,这些方法可以使这些资产在一段时间内财务增长。银行业由政府或类似机构所施加的规则进行监管。
www.macmillanihe.com/companion/Valdez-Introduction-To-Global-Financial-Markets-8th-Edition/about-this-book/
这些类型的银行业务是为了满足各种客户的需求,从大型组织到个人客户。以下是根据客户需求对这些不同类型银行的描述:
-
商业银行可以是零售型(服务消费者)或批发型(服务企业)。本质上,银行专注于从储户那里接受存款,并通过收取利息将其贷给借款人。商业银行的成功依赖于其评估借款人贷款风险的能力。任何未能准确评估风险的行为都可能导致破产,因为未能将资金偿还给储户。许多银行在金融危机中倒闭,包括美国的华盛顿互惠银行。
-
投资银行包括咨询业务和证券交易业务。咨询业务涉及公司买卖,也称为并购(M&A)、债务和股本融资(例如,将公司上市到纽约证券交易所)以及证券交易业务。证券交易业务涉及股票、固定收益、商品和货币的交易。证券交易中,买方愿意购买证券,卖方愿意出售证券,而经纪人则促进证券的买卖。
咨询业务依赖于通过整合或分拆企业来为公司创造价值。这一过程优化了并购活动中的组织表现。它还将客户的资本成本优化为一种标准化的借款结构(例如债券)。客户可以通过发行新股或取消现有公司股份(股权)来向金融市场参与者进行更多投资。
所有上述活动通过市场参与者对公司进行正确评估创造价值,这些评估由情绪和更理性的考虑推动。
- 资产管理 包括各种类型的基金——共同基金、交易所交易基金、对冲基金、私募股权等。资产管理公司通过不同的投资策略(买卖决策的结合)投资于各种金融资产和公司的不同生命周期阶段。这个行业中的一个关键决策也属于适当估值的范畴,涉及投资的未来价值。
资产管理参与者渴望通过创造回报来满足各种目的,从资产价值的保护到增值。他们通常被称为买方,代表资产所有者,而帮助买方的银行服务被称为卖方,通常包括证券销售(面对客户,收集订单)、交易(执行订单)和研究(评估证券)。
- 保险 包括一般保险和人寿保险。人寿保险保护买方免受死亡风险(死亡后果),非人寿保险则涵盖其他所有风险,例如灾难损失、行李丢失、火箭或船只丢失(例如,埃隆·马斯克的 SpaceX 损失)以及由于黑客或病毒造成的系统故障等。
保险的核心功能是估算借款人的风险状况。另一方面,产生投资回报以弥补损失的能力也可能很重要。保险公司的投资表现越强,其能够提供的保险定价就越具竞争力,竞争力也就越强。这也是伯克希尔哈撒韦能够提供具有竞争力保险定价的原因之一——由于其卓越的投资表现。
-
消费者银行业务 由消费者债务的资产规模所代表,重点是抵押贷款、汽车贷款、个人贷款以及我们在生活的不同阶段可能需要的信用卡业务。
-
影子银行 是一种涉及常规银行体系以外活动的借贷结算方式。它指的是替代投资基金,例如比特币投资基金、证券经纪商、以及为消费者提供贷款的消费金融和抵押贷款公司。
银行业相对于世界经济的规模
通过将金融行业的庞大规模与全球生产的年收入进行对比,我们可以对全球如何利用银行服务来维持运作有一个清晰的认识。然而,仅仅通过展示这些统计数据显得有些抽象。我们可以假设世界是一个人。金融在这个人的生活中扮演着什么角色?以下是一些需要考虑的要点:
-
年收入:根据世界银行的衡量,全球经济的生产力和收入在 2018 年为 86 万亿美元。大约五分之一(19%)的年收入来自跨境贸易(出口贸易额为 15 万亿美元)。
-
财富:全球个人的年收入大约相当于 4.4 年的年度 GDP。年度 GDP 的详细数据可以在本节末尾的表格中找到。年收入的信息来源于多个渠道,通过将活动与 GDP 规模进行对比得出。这 4.6 年可以细分如下:
-
该资产经理已工作 0.9 年。
-
已存入银行 0.9 年。
-
在股市中已有 0.8 年。
-
该人通过信用/借贷获得了 2.3 年的资金(其中 1.17 年来自债务,1.0 年来自银行贷款,0.5 年来自影子银行,0.03 年来自消费信贷)。
当然,这是对全球财富的简化处理;有些数据可能被重复计算,股市数据可能包括上市公司存入银行的存款,这部分已被计入银行负债。然而,鉴于我们希望了解各种金融活动的相对规模及其重要性,我们只是采用了简化的方法,将数字呈现出来。
-
保险:为了防范来自生产或投资活动中的各种不利风险,全球个人年收入的 6%被用于购买保险,保险金额覆盖其 1.45 倍的收入。保费将用于购买基础金融资产,以产生收入来抵消任何不利风险。
-
衍生品:作为风险防护工具,除了购买保险外,银行还可以提供衍生品作为金融工具来提供风险防护。术语衍生品指的是两方在某些基础资产条件下达成支付或接收经济利益的协议。基础资产的种类包括固定收益、货币到商品(FICC)。
固定收益包括利率和信用衍生品。货币指的是外汇衍生品,商品指的是商品衍生品。外汇以 87 万亿美元的未结清敞口位居第二,这大致等于全球 GDP。商品、信用和股票衍生品的份额较小,每个约占 GDP 的 2%至 9%。在将衍生品视为风险保护工具时,我们排除了一个叫做利率场外交易(OTC)的衍生品形式,它相当于年收入的 6 倍——这一数额远超过我们财富所需的年收入来提供保护。实际上,一些投资者将利率 OTC 作为投资工具。我们将这一工具排除在整体的保险理解之外。OTC 指的是银行与银行客户之间的双边协议。
另一种形式的协议是交易所交易协议,指的是银行客户通过集中交换平台买卖产品。我没有包含太多交易所交易的数字,但在这一点中提到的外汇、商品、信用和股票等数据,旨在展示这些领域的相对规模。
下表列出了 GDP 数据:
| 2018 年单位:万亿美元 | GDP 占比 | |
|---|---|---|
| 收入 | 75.87 | 100% |
| 全球 GDP(全球年收入) | 75.87 | 100.00% |
| 全球出口量 | 14.64 | 19.00% |
| 财富 | 332.46 | 438% |
| 全球资产管理 | 69.1 | 91.00% |
| 全球银行负债(包括存款) | 58.93 | 78.00% |
| 全球股市 | 79.24 | 104.00% |
| 全球债务市场 | 57.49 | 76.00% |
| 银行贷款 | 29.7 | 39.00% |
| 影子银行 | 34 | 45.00% |
| 全球消费债务 | 4 | 5.00% |
| 全球保险(新保费收入) | 4.73 | 6.00% |
| 保险覆盖—衍生品(不包括利率 OTC) | 110.15 | 145.00% |
| 全球外汇 OTC + 交易所交易衍生品 | 87.41 | 115.00% |
| 商品 OTC 合约 | 1.86 | 2.00% |
| 信用 OTC 衍生品 | 9.58 | 13.00% |
| 股票挂钩合约 | 6.57 | 9.00% |
| 利率 OTC 合约 | 461.98 | 609.00% |
所有数据均为 2018 年全年数据,除非另有说明。GDP 和股市规模来自世界银行;出口贸易数据来自世界贸易组织;新保费收入数据来自瑞士再保险 Sigma 2018 年报告;全球资产管理规模来自 BCG 全球资产管理 2018 年报告;所有银行、债务和衍生品统计数据来自国际清算银行。
银行业务客户
金融行业的客户包括从事储蓄和贷款活动的存款人和借款人。在进行商业银行业务活动时,例如跨境支付或贸易融资,他们被称为申请人(资金发送方)和受益人(资金接收方)。
如果客户参与投资银行、证券和资产管理活动,他们被称为投资者,或通常称为客户。为了保护保险产品的购买者免受潜在风险,购买者被称为投保人,而该物品被称为保险标的。在发生风险并且需要/可能需要保险公司赔偿的情况下,得到赔偿的人被称为受益人。
非金融企业是所有金融活动的真正企业客户,应被视为经济学的真正参与者。它们储存多余的现金,并为消费者生产商品和服务。
www.bis.org/publ/work490.pdf
可获得银行服务的重要性
就像电力和水一样,银行服务应该像公共事业一样广泛且容易获取。只有当我们使银行更加高效时,才能使其更具普及性,并使更多人受益。银行是一项服务,旨在充分利用资本/资金,为储蓄者和/或需要资本来提高生产力、以既定风险和回报进行生活的人们创造回报。
我们希望做的事情是与罗伯特·J·希勒(Robert J. Shiller)在其著作《金融与美好社会》(Finance and the Good Society)中的观点保持一致,他在书中指出,信息技术在金融领域中的必要性,以帮助我们实现目标。更进一步的做法是利用开放源代码方法和应用程序来解决银行业的可访问性挑战。开放源代码软件解决方案往往具有成本效益、强大和安全的特点。
为了使银行业务更加普及,其中一个最重要的措施是拥有大量数据。这将使决策更加高效和透明,从而有助于降低银行决策的成本。我们将在下一节讨论开放源代码数据的必要性。由于竞争激烈的银行市场,随着高效银行的崛起,银行服务的价格将逐渐下降,市场份额较大的银行将占据主导地位。
一旦在金融行业实施,人工智能将对该行业产生三方面的影响——重复性工作的消失,人工智能增强人的效率,以及通过如模型构建等新兴的 AI 相关工作创造就业。在这三者中,工作减少和效率提高将影响现有工作,而工作创造则将影响未来的人才和就业市场。
随着自动化和效率的提升,现有的工作将发生变化并受到影响。机器将比人类更高效地完成日常任务。然而,为了管理、监控、维护和提升由机器或 AI 执行的任务,行业将需要懂得银行业务和 AI 技术的技术性功能型专业人才。
开源软件和数据
过去 20 年左右,技术发展的速度相当迅猛,这得益于开源运动。它始于 Linux,随后是 ImageNet。ImageNet 提供了大量的训练数据。这些训练数据促进了从事 AI 算法研究的技术人员的活动。技术人员利用 Python、R、scikit-learn、TensorFlow 等编程语言编写的开源库开发了深度学习和神经网络算法。
虽然开源方法鼓励软件开发,但 AI 的另一个关键成分是数据。寻找实用的开放数据是一个挑战。而银行则面临将数据谨慎且安全地转化为机器可训练数据集的挑战,以确保不违反客户信任银行时的隐私规定。
今天,在金融和银行领域,客户保密性仍然是开放数据以便更广泛研究的一个关键障碍。实际问题可能比我们在开放数据领域看到的更复杂。打开存储在数据库中的数据可能是一个实际步骤,而开放图像数据,如文档、音频文件或语音对话等,可能会面临挑战,因为这些数据一旦被遮盖或修改,可能会系统性地丢失一些信息。
实际上,实施银行实际应用的主要成本来自数据订阅。数据收集和聚合的成本是本书中将要讨论的一个主要挑战。我们社会如何应对这一问题并激励商业部门去解决它,值得进一步讨论,超出了本书的范畴。秉持这种精神,本书的代码是开源的。
如果一个优秀的银行家能完成工作,为什么还需要 AI 呢?
让我们考虑一个单一的金融任务——在融资市场中匹配资本需求。这是一个高度重复的数字匹配任务。在这里,很明显,计算机将更适合这个工作。
使用人工智能的目标是让机器完成目前由人类执行的任务,但效率更高。许多人好奇,人工智能在银行业的应用是否会影响行业从业人员的工作。
请记住,目标不是取代人类,而是增强当前人类的能力以提高生产力,这一直是技术在人类文明历史中的目标。人类在确定准确概率方面较弱,正如丹尼尔·卡尼曼在 2013 年 4 月 2 日发布的心理学研究论文《思考,快与慢》中所述。因此,没有计算机的帮助,做出概率决策是非常具有挑战性的。
人工智能在银行业的应用
由于麦肯锡报告未提及银行业的应用案例,经过一些研究后,我们或许可以看看人工智能在以下四种方式中创造价值,如下表所示:
-
项目:预测和预期需求,优化采购,减少库存(资本)。
-
生产:以更低的成本或更高的质量提供服务。
-
促销:为合适的客户在合适的时间提供合适价格和合适信息的优惠。
-
提供:丰富、个性化且便捷的用户体验。
让我们来看看每个金融参与者如何将人工智能应用于以下几个方面,如下表所示:
| 参与者 | 项目:更好的预测 | 生产:更低的处理成本 | 促销:个性化优惠 | 提供:便捷性 |
|---|---|---|---|---|
| 商业银行 | 优化资金需求。 | 通过人工智能,贸易融资处理可以自动化,从而提高效率。 | 人工智能可以提供实时的进出口融资报价,随着货物流转到不同的利益相关者,不同的风险类型和等级也能得到体现。 | 使用自然语言处理(NLP)技术的聊天机器人提升客户服务。 |
| 投资银行 | 企业估值。 | 通过人工智能,识别市场情绪,可以更快、更便宜地获得市场信号。 | 人工智能可以通过自动匹配满足资产卖方和买方的需求。 | 移动化的劳动力,随时获取信息。 |
| 资产管理 | 资产估值与优化。 | 人工智能可以通过自动化交易和投资组合平衡来提供帮助。 | 人工智能可以向客户推荐投资。 | 快速便捷的投资组合更新。 |
| 消费者银行 | 制定实际的储蓄计划。 | 个性化机器人顾问可以在没有人工帮助的情况下从收据中获取数据。 | 人工智能可以理解消费者何时需要融资或投资产品。 | 使用智能机器人全天候为客户服务。 |
从整体来看,我们现在可以看到数据是如何在金融领域中被用来进行智能决策的:更多的数据点和更高的交换速度可以大大降低金融成本。更详细的例子将在接下来的章节中提供。
我们如何实现这一更低的成本呢?从本质上讲,我们通过减少在银行服务某一方面生产上花费的时间来实现。
人工智能对银行盈利能力的影响
为了让你了解人工智能对银行盈利能力的影响,我们从两个角度来看一些简单的估算:模型准确性的提升和模型运行/训练所花费的时间。
在过去的 10 年里,时钟频率和核心数量提高了十倍,从大约 300 个核心增加到大约 3000 个核心。
我将十年前我接触的浅层机器学习或统计模型与今天看到的深度神经网络进行了比较。神经网络的模型准确性从大约 80%提升到 90%以上,提升率为 12.5%。下表显示了内存数据速率、总线宽度和内存大小的改进:
| 年份 | 处理器 | 核心时钟 | 内存数据速率 | 内存总线宽度 | 内存大小 |
|---|---|---|---|---|---|
| 2007 | 8800 Ultra[42] | 612 MHz | 2.16 GHz | 384 bit | 768 MB |
| 2018 | Titan X[43] | 1417 MHz | 10 GHz | 384 bit | 12 GB |
| 2018 | GeForce RTX 2080 Ti | 1545 MHz | 14 GHz | 352 bit | 11 GB GDDR6 |
以下表格突出了银行领域的改进:
| 领域 | 改进 | 银行领域 |
|---|---|---|
| 预测:更好的预测 | 模型预测准确性提高了 15%。 | 风险模型,定价 |
| 产生:更低的处理成本 | 自动化率为 50%。 | 运营 |
| 推广:个性化优惠 | 模型预测准确性提高了 15%。 | 风险模型,定价 |
| 提供:便捷 | 如果所有流程都自动化,延迟将减少 50%。 | 运营 |
如果银行的成本收入比约为 70%,那么自动化率可能将这一比例降低一半,降至 35%。然而,技术投资的成本将占到另外 5-10%,在人工智能普及后,目标的成本收入比将从 40%提高到 45%。这一变化对发达国家的银行影响更大,因为与新兴市场相比,劳动力成本相当高。
提高预测准确性将进一步降低银行预测能力的成本,这反过来将使风险成本降低 15%。我个人认为,对于发达国家,风险成本占总体资产的 50 个基点 (bps),在银行风险成本降低 15%的情况下,不会对其盈利能力产生显著影响。
预测准确性和便利性的提高将提升银行的可达性,这意味着它们可以进入一个过去认为不可行的更大市场。也就是说,股本回报率并未反映这一影响;相反,它将在银行的规模和市场资本化中体现出来。考虑到更广泛的覆盖范围,预计将带来 15%的改善。
总的来说,回报率提高了 80%,从 7.9%的股本回报率 (ROE) 提升至 14.5%。然而,对于系统性重要银行,将会有额外的资本要求,从 11%逐步提高到 12%,这将使整体的 ROE 在目标 AI 适应阶段下降到 13.3%,所有法规都将得到落实。
总结
我们在本章开始时解释了人工智能的概念。人工智能是一种使机器执行人类能够完成的任务的技术,如天气预测、预算预测等。它使机器能够基于数据进行学习。我们了解了人工智能的各种技术,如机器学习和深度学习。随后,我们探讨了银行领域中的复杂过程。如果我们能实现自动化,就能降低银行业的成本。我们还了解了可达性银行的重要性。接着,我们探讨了人工智能在银行业中的应用及其带来的积极影响,并通过一些数据加以支持。
在下一章中,我们将继续探讨人工智能在银行业中的应用。作为下一步,章节将重点介绍时间序列分析与预测。它将使用各种 Python 库,如 scikit-learn,来进行时间序列分析。章节还将解释如何衡量基于机器学习的预测准确性。该章节内容丰富,将教你如何将财务比率与机器学习模型结合使用。这将为你提供一个更深入的了解,展示机器学习模型如何应用于解决银行问题。
第二部分:机器学习算法与实践示例
在本节中,我们将探讨 AI 在银行业各个业务和职能中的应用。最后一章是实践性与理论性兼具的一章,在这一章中,我将分享我是如何提出 AI 在金融领域应用特征和领域的。这对于 AI 工程师来说至关重要,他们必须开发出具备合适特征的模型,同时避免过于技术化的编程,因为这将作为一本跨越时代的指南,帮助选择适当的特征,而不依赖于具体的技术。
本部分包含以下章节:
-
第二章,时间序列分析
-
第三章,利用特征和强化学习实现银行融资自动化
-
第四章,机械化资本市场决策
-
第五章,预测投资银行家的未来
-
第六章,使用特雷诺-布莱克模型和 ResNet 进行自动化投资组合管理
-
第七章,在卖方算法营销中感知市场情绪
-
第八章,通过银行 API 构建个人财富顾问
-
第九章,客户生命周期财富的大规模定制
-
第十章,现实世界的考虑因素
第二章:时间序列分析
在上一章中,我们介绍了人工智能、机器学习和深度学习。我们还了解了银行业的运作方式以及人工智能如何增强银行业务流程。我们学习了银行流程如何变得更易于访问的重要性。我们还了解了一种名为CRISP-DM的机器学习建模方法。总体而言,本章为机器学习在银行业中的应用提供了必要的背景知识,以解决各种商业问题。
在本章中,我们将学习一种算法,该算法通过分析历史数据来预测未来的行为,这就是时间序列分析。时间序列分析基于一个变量——时间。它是通过在特定时间间隔捕获数据点,也称为观测值的过程。本章的目标是通过示例详细了解时间序列分析,并解释机器对机器(M2M)通信如何在实施时间序列分析中起到帮助作用。我们还将理解金融银行的相关概念。
在本章中,我们将涵盖以下主题:
-
理解时间序列分析
-
M2M 通信
-
金融银行的基本概念
-
人工智能建模技术
-
使用时间序列分析进行需求预测
-
使用 Keras 神经网络采购商品
理解时间序列分析
时间序列在技术上定义为在均匀时间间隔内捕获的一个变量的有序数值序列。简单来说,它是在特定时间间隔捕获一个变量的值的方法。可以是 1 小时、1 天或 20 分钟。所捕获的变量值也称为数据点。进行时间序列分析的目的是理解产生数据的底层源的结构。它也用于预测、前馈控制、监控和反馈。以下是时间序列分析的一些已知应用:
-
公用事业研究
-
股票市场分析
-
天气预测
-
销售预测
-
工作负载调度
-
费用预测
-
预算分析
时间序列分析是通过应用各种分析方法,从各种数据源捕获的原始数据中提取有意义的信息。时间序列分析还可以用来生成数据的统计信息和其他特征——例如数据的大小、数据的类型、数据的频率等。在时间序列分析中,值的捕获是在观察点进行的。
让我们通过一个例子来尝试理解这个过程。在使用时间序列分析建模时,特定分行的分行经理可以预测或预报即将发生的费用。分行经理可以通过采用时间序列分析机器学习模型,并使用历史的年度费用记录来训练该模型,进而实现预测。记录的观察数据可以绘制在图表上,图表的横轴(在此示例中为每一天)表示时间,纵轴表示历史费用。因此,时间序列分析是一种算法,用来根据另一个变量(在此例中为时间)所捕获的值,预测一个变量(即年度费用)未来的值。
让我们通过另一个例子来更详细地理解这个问题。在这个例子中,我们假设一家银行希望根据其历史数据进行费用预测。银行经理希望了解并预测他所管理的分行 2020 年的费用。因此,预测费用的过程将从收集 2000 年以后的历史费用信息开始。首先,银行经理会查看该年度的费用数据。
正如我们之前提到的,时间序列分析是通过捕获一个变量的值来进行的。你能猜到这个例子中的变量是什么吗?我相信你现在已经猜出来了。被观察的变量是每年的总费用。假设以下是每年的数据:
| 年份 | 总费用(以美元计) |
|---|---|
| 2000 | 20,000 |
| 2001 | 22,500 |
| 2002 | 21,000 |
| 2003 | 18,000 |
| 2004 | 25,700 |
| 2005 | 22,100 |
| 2006 | 23,300 |
| 2007 | 17,600 |
| 2008 | 18,200 |
| 2009 | 20,400 |
| 2010 | 21,200 |
| 2011 | 20,900 |
| 2012 | 22,600 |
| 2013 | 17,500 |
| 2014 | 19,300 |
| 2015 | 20,100 |
| 2016 | 22,200 |
| 2017 | 22,500 |
| 2018 | 19,400 |
| 2019 | 23,800 |
有多种选项可用来分析这些数据并预测未来的费用。分析方法的复杂性各不相同。最简单的方法是将费用取平均值,并假设结果值就是 2020 年的费用总额。然而,这仅仅是为了我们的示例。你也可以使用各种其他数学和分析方法来计算费用的平均值。采用这种方法,2020 年的总费用将为 20,915 美元。
复杂的方法可能涉及分析详细的开支,预测每种开支类型的未来数值,并基于此推导出总开支金额。这可能提供比平均法更准确的预测。你可以根据需求应用更复杂的分析方法。这个例子是为了帮助你理解时间序列分析的工作原理。我们在这个例子中使用的历史数据量非常有限。AI 和机器学习算法使用大量数据来生成预测或结果。以下是该例子的图形表示:
在接下来的部分中,我们将学习机器如何通过一种称为M2M 通信的概念进行互相沟通。
M2M 通信
M2M 通信非常强大,能够显著提升商业银行的功能。
M2M 通信代表通过各种渠道(如物理网络、信息共享网络、软件通信和应用程序接口)进行的机器或设备之间的通信。M2M 通信的唯一目的是在两台或更多机器之间,或运行在这些机器上的软件之间交换信息。
M2M 通信的概念假设在机器之间交换信息时不需要人工干预。M2M 通信也可以通过无线网络进行。无线网络使得 M2M 通信更加便捷和普及。以下列出了 M2M 通信的一些常见应用:
-
制造业
-
智能公用事业管理
-
家用电器
-
医疗设备管理
然而,M2M 通信与物联网(IoT)不同。物联网使用传感器触发输入,而 M2M 通信则专门指两个系统之间的交互。
商业银行是一组金融服务,包括个人和企业的存款、支票账户服务、贷款服务、汇票、存单和储蓄账户。商业银行是人们银行需求的常见去处。但银行是如何运作并盈利的呢? 这是一个非常常见的问题,我们现在来解答。商业银行通过从它们提供给客户的各种贷款中赚取利息来赚钱。贷款种类可以有所不同,例如汽车贷款、商业贷款、个人贷款和抵押贷款。通常,商业银行在一种或多种类型的贷款方面有一定的专长。
商业银行通过向客户提供各种类型的账户服务来获取资本。这些账户类型包括支票账户、储蓄账户、公司账户、货币市场账户等。银行利用这些资本投资于高回报的投资选项,如共同基金、股票和债券。然而,银行必须向那些在银行开设账户的客户支付利息,尽管与贷款相比,利率要低得多。
M2M 通信在商业银行中的作用
考虑一个涉及将钱从一个客户账户转到另一个客户账户的例子。在过去,这是一项手动任务,需要填写适当的表格,提交表格到相关部门进行账本登记,然后从一个账户中扣款并将款项存入受益人的账户。
如今,这一过程已经完全改变。有了手机,客户可以轻松地将资金从一个账户转移到另一个账户。受益人的账户将在几分钟内收到款项。不可思议,对吧?那么,这一切是怎么发生的呢?实际上,M2M 通信和流程自动化在其中起到了重要作用。现在,计算机系统、基于云的虚拟机和移动设备等机器可以通过无线或有线网络连接,向另一台机器或运行在该机器上的软件传输所有必要的信息。如今,客户只需因特定原因前往银行。客户甚至可以直接通过手机开设储蓄账户或贷款账户。
金融银行的基本概念
在我们全速进入下一个示例之前,我们首先将构建出我们的数据、人工智能和商业技术及知识。如果你对这些概念已经很熟悉,可以跳过这一部分。
金融知识是理解我们在预测商业活动时如何影响非金融公司财务决策的一个很好的起点。此外,在使用机器学习模型预测未来活动时,我们也能了解金融行业如何为未来的业务量做好准备。融资对非金融公司核心业务活动的帮助将在以下部分中讨论。
金融市场的功能——现货和期货定价
金融市场,如交易所,扮演着交换产品的市场角色。例如,考虑天然气这样的商品——我们可以直接从卖家购买,也可以通过交易所购买。实际上,长期的经济学理论鼓励你尽可能通过交易所购买标准化商品。如果是标准化商品,美国的芝加哥商业交易所(CME)可能是一个热门选择,此外,纽约证券交易所(NYSE)则是上市股票的市场。
在本章中,我们将天然气作为需要的产品。当然,在某些情况下,从壳牌等大型石油公司购买可能更有效——即如果我们希望定期从生产商那里获得这些实物商品。
在交易市场中,有两种价格——现货价格和期货价格。现货价格意味着如果你支付,就可以立即获得货物(交付);期货价格意味着你现在支付,稍后会获得货物。
选择实物交付和现金结算之间的区别
即使所有权发生变化,也可能有两种形式:即通过实物交付或现金结算。最终,实物交付或现金结算取决于我们是否需要立即获得货物。然而,在任何交易日,我们必须权衡两种选择的成本:实物交付(天然气成本+融资成本+储存成本)与现金结算。
本质上,我们有四种选择,如下表所示——假设我们需要在 3 个月内获得天然气实物产品以进行发电:
| 实物交付 | 现金结算 | |
|---|---|---|
| 现货 | 资助购买以立即获得产品;储存 3 个月。 | 立即购买产品并在纸面上拥有它,无需保管货物。 |
| 期货 | 现在融资购买以在未来获得产品;3 个月后获得。 | 融资购买未来的产品。3 个月后,从市场上以现货购买并进行实物交付。 |
为了权衡各种选择,我们需要以下数据:
-
储存成本应由内部来源提供,如果公司拥有天然气的储存设施。假设这个成本相对稳定,例如每 MMBtu 约为 0.12 美元。MMBtu 是用来衡量燃料能量含量的单位,代表百万英国热量单位(Million British Thermal Units)。
-
融资成本应涵盖存储期和购买成本的利息费用。假设为每 MMBtu 0.1 美元。此费用应由银行提供。
-
天然气成本(现货价格)应由市场数据提供商提供。例如,实时亨利中心现货价格应由汤森路透提供,约为每 MMBtu 2.5 美元。
-
期货成本应由 CME 提供。数据应在 Quandl 上免费提供。对于 3 个月期货合同,成本应该在每 MMBtu $3 左右。
这里给出的数字仅提供了数值大小的指示。当然,它们可以通过比较选项进行优化——然而,这些决策可以通过线性代数推导出来,而不需要许多机器学习技术。在现实生活中,如果我们可以使用一个简洁的确定性公式来解决问题,就不应该强行使用机器学习解决方案。
对冲价格风险的期权
为了避免天然气价格波动超出预定范围,我们需要采用启发式规则,例如在给定固定目标采购数量的情况下,根据价格决定采取何种行动。或者,我们需要规则来调整已经下单的卖出或买入数量。
以以下示例为例。如果价格超出了可接受的范围,例如低于$2.84 或高于$3.95,我们可以选择通过以下方式锁定利润:
-
如果价格大幅下跌,可以选择卖出期权(卖保险)。
-
如果价格不利地飙升,可以通过购买期权(购买保险)来减少损失。
以下图表显示了通过购买保险对冲高采购价格并在低采购价格下出售收益的每单位收益:
在这里,我们以极低的价格卖出了保险——这意味着尽管我们本应享有更低的采购成本,但我们通过接受保险费用将其赠送出去。另一方面,当价格过高时,会产生正向收益,这可能侵蚀公司的盈利能力——通过支付保费购买保险。保险的确切价格称为期权定价,将在第七章《面向卖方的算法营销中的市场情绪感知》中讨论。我们现在假设我们支付的保险费用与卖出保险所赚取的费用相同。
AI 建模技术
在接下来的部分,我们将介绍自回归积分滑动平均(ARIMA)模型,这是最传统的预测模型类型。我们还将介绍一个神经网络模型。ARIMA 是一类用于使用过去值预测时间序列的统计模型。ARIMA 是以下词组的首字母缩写:
-
AR(自回归):自回归是一种将先前的数据值作为输入,应用于回归方程并生成基于预测的结果数据值的过程。
-
I(积分):ARIMA 通过使用观测值的差异来进行积分处理,使时间序列等间隔。这是通过将当前观测值与前一个时间步骤的观测值相减来实现的。
-
MA(移动平均):一种使用观测值和应用于过去观测值的残差误差的模型。
介绍时间序列模型——ARIMA
在这个项目中,我们将数据拟合到一个称为ARIMA的时间序列模型。ARIMA 是统计学中一种特定类型的时间序列模型,通常用于预测未来的数据点,包含自回归项(p)、非季节性差分项(d)和滞后项(q)的参数。
这个 ARIMA 模型属于参数模型——通过已知参数拟合的模型。通常,我们将这种类型的模型归类为统计模型,因为我们需要对数据的形态做出假设。这与没有预设假设数据形态的更广泛的机器学习模型有很大不同。
然而,在实际的银行场景中,统计方法仍然在计量经济学、定量金融和风险管理领域占主导地位。当我们拥有少量数据点时,例如大约 30 到 100 个数据点,这种方法是有效的。然而,当我们拥有大量数据时,这种方法可能不如其他机器学习方法有效。
ARIMA 假设存在一个可以描述的平稳趋势。自回归项p和d各自在其方式上都是重要的:
-
p意味着影响当前周期值的过去周期数(例如,p = 1:当前周期的Y = 当前周期的Y - 1 周期 * 系数 + 常数*)。
-
非季节性差分(d)是指过去几个周期的变化对当前周期值的影响(例如,d = 1:当前的Y与上一个周期的Y之间的差异)。
-
滞后项(q)是指过去周期的预测误差对当前周期值的影响。
考虑一个例子,其中q = 1:Y受到t - 1周期的误差影响——这里,误差是指实际值与预测值之间的差异。
简而言之,ARIMA 指定了前一时期的系数、常数、误差项,甚至是预测值如何影响当前的预测值。听起来有点吓人,但事实上它是非常易于理解的。
在模型拟合后,它将被要求进行预测,并与实际的测试数据进行比较。预测与测试数据之间的偏差将记录模型的准确性。在本章中,我们将使用一种叫做均方误差(MSE)的度量标准来确定模型对数据的拟合度。
介绍神经网络——精准预测需求的秘密武器
我们可能有一个很好的数据源,但我们不应忘记我们还需要一个智能算法。你可能已经读过成千上万次关于神经网络的文章,但在我们在本书中广泛使用它们之前,让我们先来看一个简短的解释。神经网络是计算机模仿我们大脑工作方式的一种尝试——它通过不同的计算点/神经元连接来工作,且这些连接有不同的设置。
从架构上看,它像是公式的层次结构。你们中间阅读本书的读者可能有一定的代数基础,可以看到所关心的结果 Y 是如何与变量 X 相关联的,其中 b 是系数,c 是常数项:
Y 是我们希望在左侧预测的内容;在右侧,bX + c 是描述特征(X)与 Y 之间关系的形式。换句话说,Y 是输出,而 X 是输入。神经网络描述了输入与输出之间的关系。
假设 Z 是我们想要预测的内容:
看起来这些公式是相互关联的:
这是神经网络最简单的形式,包含一个输入层、一个隐藏层和一个输出层。每一层都有一个神经元(点)。
我鼓励你阅读关于机器学习的研究论文和入门教材,甚至可以报名参加在线课程。来自 Packt 的有用资源包括 Sebastian Raschka 和 Vahid Mirjalili 的*《Python 机器学习》《深度学习进阶与 Keras》。
反向传播
神经网络中还有其他概念,比如反向传播。它指的是一个反馈机制,用来微调神经网络的参数,这些参数大多数是在网络内连接神经元(除非它是层中的常数参数)。它通过比较输出层 Z(预测值)与 Z 的实际值(实际值)来工作。实际值与预测值之间的差距越大,就越需要调整 b、c、d 和 e。
理解如何衡量误差也是一个重要的知识点——这就是所谓的度量,将在第三章中讨论,使用特征和强化学习来自动化银行融资。
神经网络架构
架构关注的是每一层的神经元层数和数量,以及神经元在神经网络中的互联方式。输入层表示为特征。输出层可以是一个单一的数字或一系列数字(称为向量),生成从 0 到 1 的数字或一个连续值——取决于问题领域。
playground.tensorflow.org/
使用 epoch 进行神经网络训练
epoch
epoch
缩放
在将特征输入机器学习模型之前,我们将对不同数量级的输入特征进行归一化,使其具有相同的数量级。例如,商品的价格和体积是不同类型的数值数据。缩放过程将确保它们都被缩放到相同的范围,从 0 到 1。在经典的统计建模过程中,这一步非常重要,以避免某些具有更大尺度的特征主导对预测的影响。
采样
除了数据列级的缩放外,我们还需要注意模型的采样偏差。通常,我们会保留一部分机器在训练和学习另一组数据时看不见的数据——这被称为训练集。稍后,测试集(即保留的数据集)将用于与模型所做的预测进行对比。
使用时间序列分析进行需求预测
在本节中,我们将首先看一个预测电力消费需求的例子,并使用时间序列分析预测能源费用。我们将从简要的问题陈述开始,并定义解决问题的步骤。这将帮助你更好地理解如何使用时间序列分析找到问题的解决方案。
今天,电力或能源是我们所有人的基本需求。我们使用电力并支付电费。现在,作为消费者,我们希望分析电力消费,预测未来的消费并预测能源费用。这就是我们在本节中要解决的问题。
时间序列分析是解决类似于前面问题描述中的问题的最佳方法。机器学习模型需要大量数据集供其处理,以便得出实际解决方案。这些大数据集被机器学习模型用来推导出模式,或者识别出散布的数据中可能无法看到的模式。同样,我们的第一步是获取大量数据并对其进行处理,以提取有意义的信息。这将是一个三步过程。以下是我们将遵循的步骤:
-
下载数据
-
数据预处理
-
模型拟合数据
下载数据
从下载有关电力消费和能源费用的数据开始。尽管我们现在可以从公共网站下载数据,但在实际的生产环境中,通常需要从内部数据库下载数据,并以平面文件的形式将其传递给用户(即没有数据库结构的文本文件)。
您可以从以下路径下载文件:
获取数据的方式有很多种,例如使用 API 或机器人。我们将在本书后续部分讨论这些其他获取数据的方法。在第四章,资本市场决策的机械化中,我们将通过 API 调用获取数据。如果我们使用机器人,例如,可以使用Beautiful Soup来解析网站或注册 API。然而,在这个示例中,我们只是使用浏览器访问网站并导航到下载按钮以下载数据。
数据预处理
获取数据后,我们将其对齐在同一个时间序列中,因为我们下载的数据可能覆盖不同的时间段。作为数据科学家,我们力求将数据对齐到一张数据表中,所需的所有数据按列列出(即:成本、消费、销售等):
数据的每一行(或每一列)应代表一个单独的月份。在我们将数据提供给机器以学习模式之前,我们需要将一部分数据留作测试,另一部分用作学习。使用测试数据,我们可以查看模型是否预测准确,而无需先在学习数据上进行训练。这是所有机器学习/预测模型中的基本步骤。我们不将测试数据集提供给机器学习/训练。调用该函数的代码行如下:
file_path_out
if select_fld:
list_flds = ['consumption_ng','avg_cost_ng']
tuple_shape_list = [(8,0,3),(12,1,3)]
else:
list_flds = preprocess_data(f_name,list_flds)
在这个程序中,我们将最早的 70% 数据点作为训练数据,让机器进行学习和适应,而将后 30% 数据点作为测试数据。这些数据将用于与模型预测进行比较,而不用于拟合数据。
模型拟合数据
一旦数据清理完成,我们将开始训练机器学习模式。训练数据将作为拟合数据输入到机器中。模型就像一件衬衫,而训练数据就像我们试图将其拟合的身体。
以下是将我们的数据拟合到 ARIMA 模型的步骤:
parameter_opTruepdq
pdq
- 对于前述任何组合的值,我们会计算数据与实际模式的拟合度,并测量误差值。选择误差值最小的组合作为 ARIMA 模型的选定参数。
github.com/PacktPublishing/Hands-On-Artificial-Intelligence-for-Banking
start = time.time()
lowest_MSE=99999999999
lowest_order = (0,0,0)
for p_para in range(13):
for d_para in range(3):
for q_para in range(4):
order = (p_para,d_para,q_para)
...
...
error,temp_data,temp_model = forecasting(dta_df, fld, False, \
order, 0.7, fld)
if error<lowest_MSE:
lowest_MSE=error
lowest_order = order
lowest_data = temp_data
lowest_model = temp_model
end = time.time()
...
恭喜!我们现在已经交付了一个可以提供未来销售预测的模型!
使用 Keras 中的神经网络进行商品采购
在这一部分,我们将通过一个更复杂的例子进行讲解。和之前一样,我们将先定义问题陈述,然后再定义解决问题的步骤。
在这个例子中,我们希望根据历史数据预测商品的采购。我们将使用的商品是天然气。对于天然气,我们无法控制其定价,因为它是一个高度全球化的商品。然而,我们仍然可以在天然气价格达到某个范围时设定内部采购策略。盈利率目标将约束我们能够支付的原材料最大定价,以确保公司所有者的盈利性。我们将跟踪盈利率,即天然气成本与销售额的比率。
让我们通过一个例子来理解这个定价约束。在这个例子中,我们假设每花费 1 美元,而天然气(用于电力)的单位成本上升时,能源公司的材料成本与销售额的比率将增加 9.18%(这是基于 3 年的数据):
下表显示了年度销售额的加权平均值:
在这里,您可以看到从2015年到2017年的天然气销售成本。在2017年,单位成本平均为**$3.91时,天然气的销售成本为36.45%。我们假设单位成本和销售成本之间存在常量关系——对各年份的材料成本比率进行平均(即2015年至2017年分别为7.66%,9.32%和9.66%)。我们取了这三个数字的平均值,得到了加权平均值9.18%**。
请记住,实际数字应来自内部会计系统,而不是仅用于电力目的的外部美国能源信息管理局(EIA)数据。
根据过去三年的数据,我们发现材料成本与销售额的平均比率为 31.15%(表格中的 iii 平均值),这相当于每千立方英尺$3.39 百万。销售材料成本为 36.24%,单位成本为每千立方英尺$3.95 百万,处于上限范围内。mcf是天然气的标准单位成本,等于千立方英尺。然而,在下限范围内,销售材料的成本为 26.07%,单位成本为每千立方英尺$2.84 百万。单位转换的详细信息可以在 EIA 网站上找到。
数据提取自前面的销售数据表:运营费用/运营收入 = 材料成本与销售额的比例。
在建立采购计划后,我们需要了解从哪里采购天然气。在现实生活中,我们会考虑模型洞察如何执行;或许我们还需要构建一个模型来做出如何执行模型洞察的后续决策。这正是我们在商业理解部分提到的,关于如何在交易市场上执行订单的问题。
为了完成这个故事,我们假设当价格达到我们预测的数量目标区间时,我们通过物理交付从交易市场购买天然气。
数据流
以下数据流概述了我们在准备和生成代码以构建商品采购模型时需要采取的步骤。第一个框表示在 SQLite 数据库上运行的脚本,其他框表示在 Python 中执行的步骤:
它通常适用于 CRISP-DM 框架,在本书中针对不同的重点领域——有些可能侧重于理解业务,有些则可能侧重于评估。前面的图示步骤将在后续章节中详细介绍。
数据预处理(在 SQL 数据库中)
数据预处理意味着将数据转换为所需的数据特征。我们将其在 Python 编码之外运行,以减少所涉及的层级(即,我们直接与 SQLite 进行交互,而不是使用 Python 与 SQLite 交互)。以下是执行数据库操作的步骤:
-
创建 SQLite 数据库。
-
将数据导入为暂存表。
-
创建所需的表(一次性操作)。
-
将暂存表插入实际表,并进行数据类型和格式转换。
-
创建执行特征工程的视图。
-
将预处理后的视图输出为 CSV 数据。
导入库并定义变量
导入库并定义变量,以确保可以使用相关函数。导入所有相关库:
pandaskerastensorflowsklearnsklearnmatplotlib
以下代码块是导入所有列出库的代码:
'''*************************************
2\. import all the libraries required
'''
import pandas as pd
from keras.models import Model
from keras.layers import Dense, Input
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error
import matplotlib.pyplot as plt
import pickle
demand_model_path = 'demand_model.h5'
f_in_name = 'consumption_ng_exp.csv'
读取数据
以下是读取数据并获取步骤 1生成的结果的代码片段:
'''*************************************
#Read in data
'''
pd_trade_history = pd.read_csv(f_in_name,header=0)
pd_trade_history = pd_trade_history.drop('date_d',1)
数据预处理(在 Python 中)
现在我们进入 Python 中的数据预处理步骤。一些研究表明,数据科学家将 80%的时间花在这一步骤上!它包括选择特征和目标变量,检查/验证数据类型以及处理缺失值(此部分在本示例中未包含,以减少复杂性),并将数据分为训练集和测试集。在某些情况下,当目标的各类比例在数量上不相似时,我们可能需要进行分层抽样,以确保为机器学习提供平衡的训练样本。在本示例中,我们将 20%的数据保留用于测试,80%的数据用于训练:
'''*************************************
4\. Pre-processing data
'''
#4.A: select features and target
df_X = pd_trade_history.iloc[:,:-5]
df_Y = pd_trade_history.iloc[:,-4:]
np_X = df_X.values
np_Y = df_Y.values
#4.B: Prepare training and testing set
X_train, X_test, Y_train, Y_test = train_test_split(np_X, np_Y, \
test_size = 0.2)
#4.C: scaling the inputted features
sc_X = StandardScaler()
X_train_t = sc_X.fit_transform(X_train)
X_test_t = sc_X.fit_transform(X_test)
训练和验证模型
我们通过将训练数据集输入神经网络来训练模型。以下代码片段定义了 Keras 中的机器学习模型并进行训练。它构建了一个具有 329 个参数的深度神经网络模型:
'''*************************************
#5\. Build the model
'''
inputs = Input(shape=(14,))
x = Dense(7, activation='relu')(inputs)
x = Dense(7, activation='relu')(x)
x = Dense(7, activation='relu')(x)
x = Dense(4, activation='relu')(x)
x = Dense(4, activation='relu')(x)
x = Dense(4, activation='relu')(x)
x = Dense(4, activation='relu')(x)
predictions = Dense(units=4, activation='linear')(x)
demand_model= Model(inputs=inputs,outputs=predictions)
demand_model.compile(loss='mse', optimizer='adam', metrics=['mae'])
demand_model.fit(X_train_t,Y_train, epochs=7000, validation_split=0.2)
Y_pred = demand_model.predict(X_test_t)
#conver numpy as dataframe for visualization
pd_Y_test = pd.DataFrame(Y_test)
pd_Y_pred = pd.DataFrame(Y_pred)
测试模型
我们将比较步骤 4中预留的数据点(20%)与基于训练好的模型和特征数据的预测结果:
'''*************************************
##6\. Test model: Measure the model accuracy
combine both actual and prediction of test data into data
'''
data = pd.concat([pd_Y_test,pd_Y_pred], axis=1)
data_name = list(data)[0]
data.columns=['actual1','actual2','actual3','actual4','predicted1', \
'predicted2','predicted3','predicted4']
error1 = mean_squared_error(data['actual1'],data['predicted1'])
print('Test MSE 1: %.3f' % error1)
error2 = mean_squared_error(data['actual2'],data['predicted2'])
print('Test MSE 1: %.3f' % error2)
error3 = mean_squared_error(data['actual3'],data['predicted3'])
print('Test MSE 1: %.3f' % error3)
error4 = mean_squared_error(data['actual4'],data['predicted4'])
可视化测试结果
这一步让我们能够交叉检查表示模型性能的度量标准——均方误差(MSE):
'''*************************************
#7\. Visualize the prediction accuracy
'''
data.actual1.plot(color='blue',grid=True,label='actual1',title=data_name)
data.predicted1.plot(color='red',grid=True,label='predicted1')
plt.legend()
plt.show()
plt.close()
...
这将生成以下图表:
为生产生成模型
在步骤 5和步骤 6中训练和测试的模型将作为文件输出,供生产系统在未见过的生产数据上运行。我们将输出两个文件——一个用于缩放输入特征,另一个用于神经网络:
'''*************************************
#8\. Output the models
'''
demand_model.summary()
demand_model.save(demand_model_path)
f_scaler=open('x_scaler.pkl',"wb+")
pickle.dump(sc_X, f_scaler)
恭喜!我们现在已经交付了一个可以在操作层面使用的模型,用于识别本月、下月及下下月的需求量。下图展示了机器学习模型训练与部署的步骤:
然而,我们现在不会涵盖部署部分。我们会记住这一点,并在本书的后续部分讨论这个话题。我们将在第八章《使用银行 API 构建个人财富顾问》中探讨如何将 AI 生产解决方案封装为 API。
总结
在本章中,您了解了时间序列分析、机器对机器(M2M)通信,以及时间序列分析对商业银行的好处。我们还通过定义问题陈述并一步步推导解决方案,探讨了两个有用的例子。我们还学习了时间序列分析的基本概念和一些技术,例如 ARIMA。
在下一章中,我们将探讨强化学习。强化学习是机器学习的一个领域,涉及算法。应用程序在特定情况下采取适当的行动,以最大化结果的效果。我们还将了解如何使用强化学习来自动化银行决策。令人兴奋,是吗?
第三章:使用特征和强化学习来自动化银行融资
商业银行通过对借款人贷款收取利息来赚取利润。在许多情况下,贷款会变成银行的不良资产(NPA)。有些情况下,借款人可能会破产,导致银行遭受损失。在这种情况下,商业银行必须及时评估借款人还款能力,变得至关重要。
现在,如果我们仔细看这个场景,我们会意识到每一笔贷款都是由其他客户存款提供资金的。因此,商业银行需要向存款人支付利息,这是对存款人资金的一种回报,通常是按季度计算的。银行还可以通过向借款人收取更高的利息,并向存款人支付较低的利息来获利。
在本章中,我们将通过使用强化学习(RL),这一机器学习的重要领域,推导出这两种情况的解决方案。除此之外,我们还将看看强化学习如何在银行职能中提供帮助。强化学习是机器学习的三个领域之一,另外两个是监督学习和无监督学习。强化学习特别适用于基于环境或当前环境做出决策的场景。在强化学习中,代理会面临多种选择,朝着奖励前进。代理需要选择一个可用选项。如果选择了正确的选项,代理会得到奖励,否则会受到惩罚。代理的目标是通过每一步最大化接近奖励的机会,并最终获得奖励。
所有这些概念将分为以下主题:
-
拆解银行的功能
-
人工智能建模技术
-
模型性能的度量
-
构建破产预测模型
-
使用强化学习为贷款提供资金
在我们继续深入了解强化学习(RL)之前,了解银行业务及其运作方式是必要的。
拆解银行的功能
在银行内部,作为资金过剩者(存款人)和资金需求者(借款人)之间的中介,有两个重要问题需要回答:
-
借款人的风险有多大?
-
资金成本是什么?
这些是我们在查看支持业务运营所需的利润之前,需要考虑的两个重要问题,以覆盖其运行成本。
当这些决策没有正确做出时,会威胁到银行的生存能力。在这种情况下,可能会有两种结果:
-
如果银行在发生风险事件时无法赚取足够的利润来覆盖风险和运营成本,银行可能会倒闭。
-
如果银行未能满足存款人的要求或未能履行借款人贷款协议,就会损害银行的信誉,从而导致潜在客户流失。
主要风险类型
为了回答“借款人有多大风险?”的问题,我们首先需要了解影响风险的因素。
风险是指未来对银行运作产生不利影响的结果。对于银行而言,主要的风险因素包括以下内容:
-
信用风险:这种风险涉及借款人在借款交易中无法按时偿还资本的问题;例如,借款公司面临财务困境,导致无法偿还贷款。
-
市场风险:这种风险涉及金融市场中不利的价格变动,例如银行筹资来源市场的利率上升。
-
操作风险:这种风险涉及银行作为组织在运营过程中发生的事件。这可能包括内部盗窃、网络攻击等。
www.bis.org/bcbs/basel3.htm
资产负债管理
商业银行需要存款来为贷款提供资金。除了评估借款人的风险外,银行还发挥着一个有用的功能,即将储户的存款转化为借款人的贷款。因此,为存款人和借款人设定定价机制非常重要。对银行而言,贷款位于财务报表的资产端,而存款位于负债端。因此,这通常被称为资产负债管理(ALM)。
在本书中,我们将仅关注整个 ALM 功能中的一部分——资金方面——而不涉及流动性风险、利率风险和外汇风险等其他风险。以下是银行 ALM 功能的目标:
-
ALM(资产负债管理)的首要目标是确保贷款有存款支持,并且银行将有足够的存款,以防存款人要求取回他们的钱。从总量来看,大约$100 的存款支持$70 的贷款。参考一些大银行的比率,客户存款与客户贷款的比率应该在 1.2:1 到 1.5:1 之间。
-
其次,还有一个方面是关于存款的存放期限和贷款的借出期限。存放多长时间的问题被称为期限。为了满足长期贷款承诺,银行还需要存款在足够长的时间内被锁定,以确保贷款能够长期得到存款的支持。
-
第三,ALM 功能需要是盈利的,这意味着 ALM 收入应高于 ALM 成本。成本是你给出的 ALM 定价。实际上,这个成本是 ALM/银行的收入,而银行给客户报价的存款利率是银行的支出。
银行盈利的一个知名秘诀是将短期存款(低价)转化为长期贷款(高利息收入)。以下曲线显示了银行存款和贷款的定价情况:
在前面的图表中,x轴表示存款/贷款在银行中保持的时间(以天为单位),而y轴表示年化利率。
利率计算
尽管有许多方法来计算存款应支付的利息,但最常见的计算利息的方法是以年化形式报价;也就是说,无论存款时间有多长,都假设利息是以一年的时间来计算的。
例如,如果存款的 7 天利率为 1%,这意味着在 7 天内,我们将获得以下收益:
我们只需将年化利率除以 7 天,就能得到 7 天期间的利率。其背后的原因是,市场交易员需要一种标准化的方式来报价。
我们将在本章后面“使用强化学习为贷款融资”一节中使用此公式进行利息定价和存款定价。然而,关于利息定价,还有很多其他细节问题,包括不同的复利方式(利息可以从利息中赚取)和天数计数规则(365 天、实际日历或实际工作日、360 天、220 天等)。为了简化说明,我们假设一年有 365 天,并且使用不计复利的简单利率。
信用评级
除了在 ALM 中描述的借贷成本外,银行的另一个职能是评估在与客户打交道时所承担的风险水平。这种风险性会被加到资金成本中。这个概念在银行中被称为信用评级。
www.bis.org/bcbs/qis/qis3qa_f.htm
关键问题是,考虑到所需信息,公司在 1 年内破产、无法履行偿还义务的可能性有多大?这可能由多种原因驱动,但一个显而易见的原因是公司的财务状况不好。
财务报表就像公司的成绩单——尽管它需要时间来制作,但它符合某种国际公认的标准,并且有审计师的质量保证。
人工智能建模技术
现在我们已经了解了业务的功能,是时候了解一些技术概念了。在这一部分中,我们将学习人工智能建模技术,包括蒙特卡洛模拟、逻辑回归模型、决策树和神经网络。
蒙特卡洛模拟
蒙特卡洛模拟通过假设可以用概率描述的随机运动,使用大量计算预测物体的行为。这种方法是研究分子在物理学中运动的标准工具,分子的运动只能以模式的确定性描述,通常使用概率来预测。
金融专业人士采用这种方法来描述证券价格的变动。我们将在本章稍后的使用强化学习为贷款提供资金部分中使用该方法进行定价模拟。
逻辑回归模型
逻辑回归模型是人工智能在银行业中最常见的应用之一,尤其是在信用风险建模领域。该模型的目标变量将是 1 或 0 的二元结果,1 的概率表示满足目标。1 和 0 的具体含义取决于我们如何准备数据。
在这种情况下,目标变量可以是公司在 1 年内破产的情况。该模型称为逻辑回归,因为用于建模 1 和 0 的函数被称为logit。它被称为回归模型,因为它属于一种统计模型——回归模型,旨在确定影响结果的因果关系。
决策树
决策树算法实际上属于监督学习算法组。然而,鉴于该算法的性质,它常用于解决回归和分类问题。回归和分类通常需要根据当前情况做出决策。因此,这些问题通常使用强化学习算法来解决。
决策树的有益之处在于我们实际上可以可视化决策树的表示。决策过程从树的顶部开始,向树的叶子节点分支。叶子节点是目标变量最终落点的地方。所有被分类到同一叶子节点的变量值,具有相同的违约概率。以下是一个决策树算法可视化示例,展示了如何做出是否向申请人发放贷款的决策:
min_samples_leaf
阅读决策树很容易。然而,令人惊讶的是,机器如何学习用于分裂的各种条件。
神经网络
一个简单的神经网络如下面的图所示:
它由三层组成,即输入层、隐藏层和输出层。每一层由节点构成。用于解决 AI 问题的人工神经网络模仿人脑中存在的物理神经网络。人脑中的神经元由人工神经网络中的节点表示。神经元之间的连接则通过权重在人工神经网络中表示。
让我们理解神经网络中每一层的意义。输入层用于将输入数据馈送到模型中。它还负责呈现模型正在训练的条件。输入层中的每个神经元或节点代表一个对输出有影响的独立变量。
隐藏层是最关键的,因为它的工作是处理从输入层接收到的数据,并负责从输入数据中提取必要的特征。隐藏层由一个或多个层组成。
在解决线性表示数据的问题时,激活函数(处理输入数据)可以包含在输入层本身中。然而,对于复杂数据表示的处理,则需要一个或多个隐藏层。隐藏层的数量取决于数据的复杂性。隐藏层将处理后的数据传递给输出层。
输出层负责收集和传递信息。输出层展示的模式可以追溯到输入层。输出层的节点数取决于最终需要做出的决策数量。
强化学习
在强化学习中,模型会在每一步行动后收到反馈。首先,让我们理解强化学习中涉及的实体:
-
代理:这是执行操作的主体;在我们的案例中,它是银行。
-
动作:这是代理实际执行的工作。在我们的案例中,动作指的是银行提供的定价网格。
-
效用函数:它为状态的期望度分配数值。效用函数通过与实际盈亏(P&L)/资金状况与所提供的定价网格(包括存款和贷款)之间的反馈交互来学习。
-
奖励:这是结果的期望度的数字表示。在我们的案例中,它是累计盈亏(即达到或未达到自我融资目标的二元结果,其中 1 表示达到,0 表示未达到)。如果银行未能满足自我融资要求,则累计盈亏将为 0。
-
策略:根据估算的效用选择行动。在我们的案例中,我们的策略不会变化,因为它努力选择提供最大下一个状态奖励的定价网格。我们采用的策略导致了“利用”,而非“探索”,这意味着该策略不会放弃当前的盈亏来产生长期的盈亏。这是因为如果存款人和借款人在短期内看到无盈利,而长期则能获得盈亏,他们会表现出一定程度的粘性。探索是关系银行家常见的行动,他们看重关系的长期盈利能力。
深度学习
随着我们学习的每个模型或技术的复杂性不断增加。在这个例子中,我们假设输入层有 36 个变量/特征。输出层将有两个变量/特征——一个用于盈利能力,另一个用于自筹资金状态。在输入层和输出层之间将有两个隐藏层——一个紧接着输入层,有 10 个神经元,另一个层有 15 个神经元。这个例子将形成一个神经网络,用于为银行做出一般的定价决策。
要估算神经网络的盈利能力和自筹资金状态,输入层有 127 个变量,三个隐藏层每个层有 15 个神经元,输出层有一个输出神经元,用于生成盈利能力(当天的累计盈亏)或客户存款与客户贷款的比例。
相比于逻辑回归模型,深度学习中的输入特征要复杂得多,涉及的参数数量大约是逻辑回归模型的 10 倍或更多。
以下表格展示了定价模型的总结:
| 层 | 形状 | 参数数量 |
|---|---|---|
| 输入层 | (1, 36) | 0 |
| 隐藏层 1 | (1, 10) | 370 |
| 隐藏层 2 | (1, 15) | 165 |
| 隐藏层 3 | (1, 15) | 240 |
| 总参数数量 | 775 |
在前面的表格中,第一列列出了是哪一层——输入层还是隐藏层。第二列表示该层的形状,即从上一层到当前层的参数数量。
要计算参数的数量,我们来考虑隐藏层 1。在这种情况下,上一层的 36 个特征连接到当前层的 10 个神经元。我们还需要与当前层特征数量相等的常数,以实现跨特征的缩放。因此,隐藏层 1的总参数数量是 36*10 + 10 = 370 个参数。
知道如何计算参数有助于我们了解训练数据是否足够充足以训练网络。强烈建议确保参数数量至少等于 记录数 * 训练轮数。想一想,解决两个变量问题需要多少个公式 – 至少需要两个。公式就像是深度学习中的训练数据,而变量就像是网络的参数。
模型性能的度量标准
当我们构建一个 AI 模型时,最重要的步骤之一就是定义一种衡量模型性能的方法。这使得数据科学家能够决定如何改进并选择最佳模型。
在本节中,我们将学习三种常见的度量标准,这些标准在工业界通常用于评估 AI 模型的性能。
度量标准 1 – ROC 曲线
接收者操作特征 (ROC) 度量标准衡量分类器在执行分类任务时,与随机分类器相比的表现。该度量标准使用的分类器是二元分类器。二元分类器根据预定义的分类规则将给定的数据集分为两组。
这与以下情况相关,比如我们将这个模型与抛硬币进行比较,用来分类公司是否违约或非违约,正面表示违约,反面表示非违约。在这种情况下,违约和非违约的分类概率各为 50%。
对于一个完全随机的预测系统,比如抛硬币,真正率和假正率的概率很可能是相同的。但是在如公司一年内违约的案例中,例如以下例子,违约率为 6.3%(1,828 中的 123),这意味着我们实际有 1,828 个非违约案例和 123 个违约案例。一个完全随机的模型将会把一半的违约案例预测为非违约。
让我们绘制一个图表,展示 ROC 图表中的真正率和假正率。真正和假定意味着针对默认事件所做的预测是否事实正确。正意味着分类器为正(在此情况下等于 1,即默认值)。
当我们没有进行预测时,真正率和假正率都是 0。当我们完成样本的 50% 时,假设为 1,951/2,我们默认会得到 50% 的样本,其中 50% 的猜测为假正。当我们到达 100% 样本时,我们应该得到 100% 的样本作为真正,100% 作为假正。
该随机分类器的性能由图中的虚线表示:
在最理想的分类器情况下,我们应该能够将真正率提高到 100%,并将假正率降到 0%(由前面图中的黄色线表示)。
对于最差的分类器(将所有情况都分类为 100%错误),真实正例率应为 0%,假正例率应为 100%(由红点表示)。ROC 曲线的使用在信用风险模型验证中也很常见。
指标 2 – 混淆矩阵
混淆矩阵是衡量分类器性能的最常用指标,具有两种结果:
| 实际情况:真实值 | ||
|---|---|---|
| 真实违约 | ||
| 分类器预测 | 正例/违约 | 62 |
| 非违约/负面 | 61 | 1,801 |
| 真实正例率 = 62/(62+61) |
混淆矩阵还提供了类似于 ROC 曲线的结果。其主要思想是通过行和列将预测结果与实际真值区分开。
指标 3 – 分类报告
分类报告是另一种评估模型性能的方式,包含以下指标:
指标的详细信息如下:
-
精度和召回率:精度衡量模型预测的真实正例率,而召回率衡量模型的覆盖率。精度表示预测值为正确值的百分比。召回率表示目标值被预测为期望值的百分比。
-
F1-score:F1-score 是评估模型整体准确性的重要指标之一。它是精度和召回率的调和均值。这是我们用来比较模型性能的标准。
-
Support:这是另一个术语,表示在最左列中列出的值所对应的记录数量。这里有 123 个实际违约案例(在default列下目标值为value = 1)。
构建破产风险预测模型
银行作为贷款方,需要确定能够覆盖借款成本的利率。银行通过考虑向其他机构借款的成本,以及公司从银行借款后可能申请破产的风险来确定利率。
data.world
EMIS 分析了 2000 年至 2012 年期间的破产公司和 2007 年至 2013 年期间的运营公司。在数据收集后,基于预测期对数据进行了五类分类。第一类是包含预测期内财务数据的年份数据。另一类标签显示 5 年后破产状态的预测。
获取数据
我们将使用一个开源程序进行数据转换,然后使用另一个程序基于下载的数据训练模型:
构建模型
在这个示例中,我们将尝试三种模型:逻辑回归、决策树和神经网络。
在计算能力尚未普及之前,通常会根据我们试图解决的问题以及机器需要提供的答案来选择模型。然而,如今,我们倾向于尝试所有可能的模型,并选择性能最佳的模型。
在这种情况下,我们可以将其标记为我们想要预测的内容。我们希望预测的目标行为是公司违约——在机器学习领域,这称为目标变量。我们将通过使用常见的评估指标,比较不同模型的性能,来评估模型在给定输入数据时预测目标变量的准确性。
在本示例中,我们将需要以下库:
osrepandasmatplotlib.pyplotseabornsklearnpicklegraphviz
步骤如下:
- 使用以下代码导入所有相关库:
import os
import re
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.metrics import classification_report,roc_curve, auc,confusion_matrix,f1_score
from sklearn.model_selection import train_test_split
from sklearn.feature_selection import RFE
from sklearn import linear_model,tree
from sklearn.neural_network import MLPClassifier
from sklearn.preprocessing import StandardScaler
import pickle
import graphviz
对于逻辑回归,决定选择哪些特征时,我们将依赖于测试不同特征的准确性。提供最高准确性的组合将被选中。
optimize_RFE()
def select_columns(df, col_list):
...
def generate_column_lists(col_support,col_list):
...
def optimize_RFE(logreg, X, Y, target_features = 10):
...
while trial_cnt<=target_features:
rfe = RFE(logreg,trial_cnt,verbose=1)
...
select_cols = generate_column_lists(col_support, col_list)
X_selected = select_columns(X,select_cols)
...
#build model
...
##metric 1: roc
...
#memorize this setting if this ROC is the highest
...
return max_roc_auc, best_col_list, result_list
def train_logreg(X,Y):
print('Logistic Regression')
logreg = linear_model.LogisticRegression(C=1e5)
roc_auc, best_col_list, result_list = optimize_RFE(logreg, \
X, Y, 20)
scaler = StandardScaler()
scaler.fit(X_train)
...
##metric 1: roc
...
##metric 2: Confusion matrix
Y_pred_logreg = logreg.predict(X_test)
confusion_matrix_logreg = confusion_matrix(Y_test, \
Y_pred_logreg)
...
#common standard to compare across models
f1_clf = f1_score(Y_test, Y_pred_logreg, average='binary')
##Quality Check: test for dependency
...
##save model
...
- 除了逻辑回归模型外,我们还将构建一个决策树。特征选择将在训练时由算法执行。因此,与逻辑回归模型不同,我们不需要限制作为输入提供给训练过程的特征数量:
'''
## Decision Tree
'''
#feed in data to the decision tree
def train_tree(X,Y):
print('Decision Tree')
#split the dataset into training set and testing set
...
tree_clf = \
tree.DecisionTreeClassifier(min_samples_leaf=min_leaf_size)
#preprocessing the data
scaler = StandardScaler()
scaler.fit(X_train)
...
#fit the training data to the model
...
##metric 1: roc
...
##metric 2: Confusion matrix
...
#common standard to compare across models
...
##save model
...
- 最后,我们将在模型中加入一个神经网络。它与决策树类似。特征选择将在训练时由算法执行。然而,进行超参数调优时,执行网格搜索是很重要的。我们正在寻找的超参数属于神经网络的架构,即我们需要构建多少层以实现最佳性能。以下代码用于训练逻辑回归模型:
##Grid search that simulate the performance of different neural network #design
def grid_search(X_train,X_test, Y_train,Y_test,num_training_sample):
...
#various depth
for depth in range(1,5):
...
for layer_size in range(1,8):
...
nn_clf = MLPClassifier(alpha=1e-5, \
hidden_layer_sizes=hidden_layers_tuple, \
random_state=1)
...
...
#various size
def train_NN(X,Y):
print('Neural Network')
#split the dataset into training set and testing set
...
#preprocessing the data
scaler = StandardScaler()
scaler.fit(X_train)
...
对于本章中列出的所有模型,我们还需要衡量其准确性。我们将使用两种不同的方法来衡量准确性。在这个分类问题中,使用了各种度量指标。然而,当构建一个机器学习模型来判断一家公司是否违约时,我们需要确保其准确性。
f1_list
f1_list = []
f1_score_temp= 0
#logistic regression model
log_reg,f1_score_temp = train_logreg(X,Y)
f1_list.append(f1_score_temp)
log_reg.get_params()
#decision tree
tree_clf,f1_score_temp = train_tree(X,Y)
f1_list.append(f1_score_temp)
tree_clf.get_params()
#neural network
nn_clf,f1_score_temp = train_NN(X,Y)
f1_list.append(f1_score_temp)
nn_clf.get_params()
- 使用以下代码可视化每个模型的性能:
'''
#4 Visualize the result
'''
print('********************')
print('f1 of the models')
print(f1_list)
print('********************')
- 使用以下代码示例来可视化模型:
#for visualization of decision tree
x_feature_name = fields_list[:-1]
y_target_name = fields_list[-1]
d_tree_out_file = 'decision_tree'
dot_data = tree.export_graphviz(tree_clf, out_file=None,
feature_names=x_feature_name,
class_names=y_target_name,
filled=True, rounded=True,
special_characters=True)
graph = graphviz.Source(dot_data)
graph.render(d_tree_out_file)
在下一节中,我们将使用强化学习来决定是否向客户提供贷款。
使用强化学习进行贷款资金的提供
假设我们的角色是银行的负责人,那么确定贷款资金的成本变得非常重要。我们要解决的问题涉及三个方(或者我们称之为代理人)——银行、存款人和借款人。首先,我们假设只有一个银行,但有许多存款人和借款人。存款人和借款人将通过随机生成的数据创建。
在模拟机器学习中这些方的不同行为时,每个方都被称为一个代理人或一个对象实例。我们需要创建成千上万的代理人,其中一些是存款人,一些是借款人,一个是银行,一个是市场。这些代理人代表了竞争银行的集体行为。接下来,我们将描述每种代理人类型的行为。
假设我们扮演银行财务主管或财务部门负责人的角色。财务部门负责人的工作是报价无风险融资成本。与客户打交道的银行人员会把融资成本加上信用风险溢价,形成总融资成本。任何高于这个总融资成本的额外利润,都是银行人员的净贡献。但在财务报表中,来自客户的实际利息收入将会抵消存款人或借款人支付给银行的净利息成本。
我们希望生成的是每个到期日(1 天、2 天等)之前的贷款和存款定价,在银行开门营业之前。公共领域没有这样的数据集。因此,我们将模拟这些数据。到期日、贷款或存款金额、起始日期和利率都会被模拟出来。
理解利益相关者
在使用人工智能建模定义解决方案时,我们通常会模拟参与实体的行为。首先理解利益相关者的行为变得至关重要。为了这个例子,我们需要了解三个实体的行为方面——银行、存款人和借款人。
一家银行有两个目标:
-
生成存款和贷款的定价表格。
-
计算其利润/亏损,并在任何时刻评估其自筹资金的状况。
存款和贷款的定价表格假设在不同的到期日进行定价。
在这个例子中,引入了强化学习来更新定价,并通过考虑近期行为对盈亏、资产和负债比例的影响来进行反馈。假设存款人对存款利息的预期会随着存款到期而变化。到最后,我们假设存款人会领取他们的利息收入,并且银行账户中报告的存款金额也会随之变动。
在市场开盘前的当天以及存款到期日,存款人会考虑是否继续存款或提取存款。此时,我们通过随机化决策来模拟这一行为,生成期望利息的百分比概率。有 50%的概率期望利息增加,50%的概率期望利息减少。然后,这一预期将与银行在特定到期日的报价进行比较。如果银行满足这一预期,那么存款将继续留存;否则,存款将在相同的到期期内离开银行。
关于利率预期如何变化,存款人使用了两种不同的变化方式:一种是完全线性的,另一种则是符合正态分布的。如果存款离开了银行,我们假设相同金额的存款将被存入另一家银行。因此,在另一家银行存款到期时,存款人会设定他们的预期,并评估是继续留在该银行还是返回原银行。
对于借款人,假设其行为与存款人相同,具有相同的日终应计活动。然而,在一天之内,贷款到期的借款人会重新考虑是否留下。这通过利率预期来表示,模拟的具体方法与存款人的相同——但不同之处在于,银行提供的贷款必须低于借款人预期的定价,借款人才能选择留下并进行再融资。
得出解决方案
以下是创建借款人和存款人以便银行每天结账的步骤:
- 首先,我们需要从贷款和存款列表中导入数据,以生成借款人和存款人的列表。在这一步中,从电子表格加载场景,以模拟不同天数的借款人和存款人。以下代码示例展示了生成借款人和存款人列表的函数定义:
##Step 1: Import Data from the list of Loans and Deposits
##Based on an input file, generate list of borrowers and depositors at the beginning
##Keep the master copy of clean clients list
'''
list_depositors_template,list_borrowers_template = generate_list(f_deposit_path,f_loan_path,start_date)
- 在每次迭代的开始(除了营业的第一天),会提供市场定价,银行也需要提供定价。我们生成一定数量的模拟(1,000 次)。在每次模拟中,我们假设一个 10 年的周期(3,650 天 = 365 天/年 × 10 年)。在任何给定的日子,存款人和借款人通过参考市场利率来设定他们的预期。当我们开始每次模拟的第一天时,存款人和借款人会从存款和贷款列表中创建。以下代码运行 1,000 次模拟:
print('running simulation')
for run in range(0,1000):
print('simulation ' +str(run))
#reward function reset
reward = 0
list_depositors = copy.deepcopy(list_depositors_template)
list_borrowers = copy.deepcopy(list_borrowers_template)
...
执行上述代码将创建银行对象。此时,银行内部会初始化两个神经网络——一个用于存款定价,另一个用于贷款定价。对于名为market的银行也执行相同的操作。
市场定价基于蒙特卡洛模拟初始定价的输入随机化。根据市场定价,借款人和存款人通过参考市场定价以及归因倾向来设定他们的预期。在设定预期之后,生成两种存款定价和贷款定价网格的变化。
bank
#build a model if this is the first run, otherwise, load the saved model
#bank and environment objects created
...
deposit_pricing_grid_pred = jpm.generate_deposit_grid(deposit_constant_grid)
loan_pricing_grid_pred = jpm.generate_loan_grid(loan_constant_grid)
loan_pricing_grid_prev = loan_empty_grid
deposit_pricing_grid_prev = deposit_empty_grid
loan_pricing_grid_final = loan_empty_grid
deposit_pricing_grid_final = deposit_empty_grid
#market is also a bank (collective behavior of many banks)
#market object created
market = bank()
...
daily_loan_list=[]
daily_deposit_list=[]
daily_net_asset_list=[]
cum_income_earned =0
cum_expense_paid =0
mkt_expense = 0
mkt_income = 0
for i_depositor in list_depositors_template:
...
for i_borrower in list_borrowers_template:
...
这样,环境就已创建。在这里,环境对象包含提供给定定价网格(贷款和存款)回报估计的神经网络模型,以及市场定价、到期的借款人和存款人等外部环境。
- 生成当天的定价网格:
##Generate two pricing grids for the day
mkt_deposit_pricing_grid, mkt_loan_pricing_grid = \
market.generate_pricing_grids_MC()
loan_pricing_grid_pred,x_np_loan = jpm.generate_loan_grid_ML(...)
deposit_pricing_grid_pred,x_np_deposit = \
jpm.generate_deposit_grid_ML(...)
loan_pricing_grid_prev = loan_pricing_grid_final
deposit_pricing_grid_prev = deposit_pricing_grid_final
...
银行的定价模型基于机器学习模型。市场是基于随机化过程,参考我们硬编码的初始值。同时,将计算到期概况(今天到期的贷款和存款),并建立客户对定价的期望。这一期望基于市场定价以及由定义的辅助函数随机化的内部需求。
- 生成可能的定价列表,预测回报,并选择最佳定价。此步骤在强化学习领域中被称为行动。行动是向客户和市场同行报价的行为。根据上一步生成的定价,我们创建更多的变体(在我们的案例中是 20 个),通过随机化过程:
## Generating list of all possible loan / deposit pricing, including previous, and current predicted pricing
...
#generate lots of variations:
for i in range(0,num_randomized_grid):
...
#accessing each of the choice
...
## Predict the reward values of each the variation and make the choice of pricing
for loan_i in range(0,num_grid_variations):
for deposit_i in range(0,num_grid_variations):
...
#Policy A
if max_reward<= temp_reward:
...
#Policy B: if both conditions fail, randomize the choice
...
#Policy C: Choose the best choice & reward
...
使用环境对象的机器学习模型,我们可以预测每个变体的结果,并选择最佳变体,以最大化盈利性,满足存款的资金需求。
- 执行定价网格。收入和支出根据所选的定价网格生成,该网格在满足自筹资金平衡目标的同时,生成最大估计净利润。一旦选择了银行的定价网格,就会与到期的借款人和存款人一起执行。有些人会留在银行,有些人则会离开:
#Carry forward the deposit and Roll-over the loan
#stay or not
##Update borrower and depositor
for i_borrower in list_borrowers:
...
for i_depositor in list_depositors:
...
# Actualized p n l
##*************************************
# with clients
for i_borrower in list_borrowers:
#pocket in the loan interest
...
for i_depositor in list_depositors:
#pay out the deposit interest
...
#market operations
...
##*************************************
#End of day closing
##*************************************
#cumulative income = income earned from client + income earned from market (if any excess deposit placed overnight)
...
#cumulative expense = expense paid to the client + expense paid to market (if any insufficient deposit to fund overnight pos)
...
#Closed book for the day
...
f_log.write('\n****************summary run:' +str(run) + ' day ' +str(day_cnt)+'****************')
...
bank
胜出的组合将被送入模型进行进一步的强化学习,既适用于银行,也适用于环境。反馈将包含银行的实际损益(P&L),包括存款和贷款网格定价;对于环境来说,将反馈实际的盈利性和自筹资金状态到回报模型。
environmentbank
- 每次模拟后,结果会保存在输出文件中,我们可以监控强化学习的进展。在每次模拟结束时,会输出最后一天的快照结果。使用以下代码生成输出:
#output result of this run and save model
print('run ' + str(run) + ' is completed')
...
x轴上的每一条柱形代表 10 次模拟的平均盈亏。模拟的盈亏在第八条柱形时达到了峰值。通过对日志文件中每次模拟结果的详细分析,我们可以看到,从第八十七次模拟开始,盈亏的改善停止了,因为盈亏在第八十次及以后趋于平稳和稳定。随着进一步的训练,盈亏下降,显示出过度训练的迹象。
摘要
在这一章中,我们通过两个例子了解了不同的人工智能建模技术——第一个例子是预测借款人破产的几率,另一个是确定贷款资金的来源。我们还在这一章中学习了强化学习。其他人工智能技术,包括深度学习、神经网络、逻辑回归模型、决策树和蒙特卡洛模拟也被涵盖在内。我们还在本章提供的例子背景下了解了银行的业务职能。
在下一章中,我们将继续学习更多的人工智能建模技术。我们将学习线性优化和线性回归模型,并运用这些模型解决投资银行领域的问题。我们还将学习人工智能技术如何在资本市场决策的机械化中发挥重要作用。
第四章:资本市场决策的机械化
在上一章中,我们学习了强化学习。我们学习了如何使用强化学习自动化银行决策。我们还学习了如蒙特卡罗模拟、逻辑回归模型、决策树、神经网络和深度学习等 AI 建模技术。然后,我们学习了如何建立破产风险预测模型,并使用决策制定来通过强化学习为贷款提供资金。
本章将帮助我们理解基本的财务和资本市场概念。我们将研究 AI 如何通过运行风险模型来生成销售预测,从宏观经济数据中优化最佳资本结构。它有助于规划组织的内部财务领域和与外部投资者的沟通。与商业银行活动一起,包括为公司日常交易活动提供资金,投资银行旨在从这些资本筹集市场中为可能需要在资本部署方面具有更大灵活性的公司提供支持,特别是在中长期活动方面。我们将通过两个例子帮助你进行资本需求的财务规划。
本章将涵盖以下主题:
-
理解投资银行的愿景
-
财务领域的基本概念
-
AI 建模技术
-
寻找最佳资本结构
-
使用宏观经济情景提供财务表现预测
让我们开始吧!
理解投资银行的愿景
在我们探讨财务领域的基本概念之前,必须先了解投资银行的愿景。投资银行的未来取决于公司未来财务表现和行为的预测准确性,以及在模型中如何将企业的关键因素作为特征捕捉。证券分发给投资者的过程将实现自动化,联合承销台也会实现自动化。接下来的两章将介绍关于客户资本决策方面的变化,以及关于投资银行家如何使用模型来寻找投资者,以支持客户的资本需求(通过债务或股权融资的客户被称为发行人),并基于财务因素预测客户的并购需求。
基于投资银行的业务表现
一旦所有这些预测都由机器完成,将通过连接公司与监管机构和交易所的 API 实现自动化申报。下图展示了发行人、投资银行家、投资者/所有者和监管机构/交易所如何协作和协调:
在前面的图表中,发行人是与注册和销售证券相关的法律实体。发行人出售这些证券以便为实体的运营筹集资金。发行人必须执行的任务包括准备财务报表和评估财务需求。投资银行家通过执行各种操作来促进发行人的上市和审批过程。
财务领域的基本概念
在本节中,我们将了解财务领域的基本概念。我们将首先看看财务报表是如何形成的。我们还将理解如何优化资本结构的理论部分。
财务报表
财务报表用于公司的健康报告。财务报表是上市公司年度报告的一部分,也是了解公司财务健康状况的基础。
银行家根据该报告中的结果推荐金融产品,而投资者则通过参考此报告做出投资决策。关于财务报表,主要有两种类型:
-
资产负债表:这关乎整体净资产。它详细列出了总投资(资产)、我们欠他人的债务(例如,信用卡、抵押贷款、负债等)以及投资减去负债后的净值,即净资产(股东权益)。
-
利润表(P&L或收入表):这种类型的报表显示财务年度的动态。它类似于每月的收入和支出报告。
除了主要类型之外,我们还有以下几种财务报表:
-
股东权益变动
-
综合收益表
-
现金流量表
这些描述了所有者权益的变化、未在收入表中捕捉到的收入和现金流动。然而,为了简化我们示例的范围,我们不会深入讨论这三张报表。
实时财务报告
每一笔交易都会作为输入传递到会计系统中,而每笔交易会被分类到一个账户,这个账户将被归类到这些报表中的一个或两个。到一天结束时,每个账户都会被归类为账户条目。
通过分析时间序列数据(在第二章,时间序列分析中),我们可以清楚地看到长期预测的局限性。因此,为了做出准确的预测,我们的方法转向进行频繁更新的短期预测。由于我们是公司的一部分,因此完全有可能基于系统每天流动的交易数据生成每日财务报表。对于那些不了解会计系统和财务报表的人,我们的 Excel 表格提供了一个例子,展示了交易数据如何被汇总成财务报表。下表显示了账户如何分类到资产负债表和利润表中:
| 项目 | 资产 | 股本 | 负债 | 损益表 |
|---|---|---|---|---|
| 股本 | Y | Y | ||
| 营运资本 | Y | Y | Y | |
| 资本支出 | Y | Y | Y | |
| 债务资本 | Y | Y | ||
| 银行贷款 | Y | Y |
股本 是我们为公司成立所贡献的资金(资本意味着生产性的金钱)。这就像我们出生时从父母那里获得的资源一样。它用于公司的股本,自然地成为公司拥有的资产的一部分。股东是为公司的资本做出贡献的人;因此,他们是公司的所有者。公司有望向投资者支付股息(可以是现金或以公司股票形式),主要是每年一次。关于他们在公司中拥有的资金,他们在偿还欠他人的款项后拥有一切。
营运资本和资本支出(资本支出) 就像我们运行家庭所需的常规经常性支出,如食品杂货、账单和燃料。资本支出就像是让你拥有的房屋看起来更好,从而提高市场价值,或者是你作为 Uber 司机购买的新车(对于 AI 研究人员来说,GPU 电脑可能是资本支出)。以这种方式,任何影响损益表的因素都会影响股本和资产,这意味着我们作为净收入所赚取的东西将成为我们的净值和资产的一部分。对于公司来说,资本支出用于获取房地产和设备。
负债: 债务资本和银行贷款是借来的钱和资产。当我们借这些负债时,它们通常以现金形式出现,但我们会立即将这笔现金用于资本支出。债券持有人和借款人是为公司提供债务资本和银行贷款的人。公司有责任支付利息(现金)以奖励借款人/债券持有人,主要是每半年一次。债券利息也称为 票息。我们借的金额称为 本金。因此,在每种借款关系中,我们既有本金,也有利息。
sk.sagepub.com/books/writers-on-organizations
优化公司结构的最佳理论
最佳的资本结构是将融资渠道用于公司发展,同时通过适当的风险承受能力最大化投资者的投资价值,以最符合公司业务的方式。例如,当公司处于发展阶段且未来不确定时,最好使用“粘性”资本进行融资,即股权。等公司稳定后,通常会配合稳定的资金来源,即债券。
需要做出哪些决策?
作为长期战略 CFO,我们需要做出的决策是如何在股权和债务之间找到合适的平衡,以便为公司提供资金。在股权方面,我们需要考虑发行多少股票来吸引这些投资者,以及支付多少股息(定期回报投资者)。在债务方面,我们需要考虑多少负债、债务类型、债务货币、利率以及还款期限。
资本结构的财务理论
www.wiley.com/en-us/Applied+Corporate+Finance%2C+4th+Edition-p-9781118808931
econpapers.repec.org/article/blajfinan/v_3a39_3ay_3a1984_3ai_3a3_3ap_3a857-78.htm
作为数据科学家,我们关注两种选择的成本和收益,这两者将帮助我们找到最佳的资本结构。我们来看看:
| 为什么选择股权? | 为什么选择债务? |
|---|---|
| 1) 如果没有利润,则无需支付股息——对于投资的灵活性更大,尤其是像技术这种现金流不明确的领域。2) 单纯增加股本不会提高股本成本——这可以近似为我们支付的股息。然而,增加债务会增加公司破产的概率,因为有更多的义务偿还利息或本金。3) 在某些财务比率的特定细节上更具灵活性;例如,一些债券借款人会限制公司某些财务比率在特定范围内。 | 4) 支付给贷方的利息被视为费用,因此无需缴纳税款,而如果作为股息支付(给股东),则不计入费用,因此需要缴纳利润税。5) 现有股东可以保持公司控制权,而无需稀释所有权。 |
-
第一点关于项目产生高于融资成本回报的确定性,可以通过回报的方差来近似。
-
第二点和第三点可以用公式编码:对于第二点,一个公式可以指定债务的百分比(称为杠杆)在增加破产风险中的作用(信贷风险模型在上一章中有解释)。对于第三点,这只是一个可以获得的比率,即公司的税率。
-
第四点和第五点可以通过设定一个固定的阈值来实现,限制公司可以筹集的最大股本。对于家族企业来说,股本的变化很少发生,除非家族发生变化(例如创始人去世)。
总要素生产率用于衡量项目价值
这实际上是我们在第二章中提出的问题,时间序列分析,当时我们使用时间序列分析来自动化客户采购,并试图理解如何预测每个月的需求。对于长期预测,我们可以使用 ARIMA 模型进行投影。然而,在预测一个项目在组织内的成功时,并没有明确的模型,因为它需要团队成员的数据、项目的执行情况以及项目的类型和产出,这本身属于管理学中一个独立的学科领域。
我们可以通过三种方式来实现这一点:
-
通过借鉴市场洞察,我们可以假设如果一个项目没有风险,它通常会产生市场的资本回报——其下限接近无风险利率。当然,高风险项目的回报应该更高。
-
总的来说,如果项目与过去相似,则项目回报的预期值应为项目投资回报的现值。它必须等于公司的股本回报。
-
如果一定要有一个模型,可以借鉴宏观经济学文献,生产率由总要素生产率公式来衡量:
在这里,Y 是产出,A 是技术效率,K 是资本支出,L 是劳动力。资本消耗效率在融资、采购和资源获取方面的效率由 alpha 表示。劳动力技能由 beta 表示。让我们更详细地讨论这些:
-
A (技术效率): 技术效率可能是每花费一美元机器的全面处理能力提供的理想经济价值。
-
L (劳动力): 劳动力意味着每花费一美元产生的劳动力的理想经济价值。
-
K (资本): 投资于技术和劳动力的资本金额。
-
alpha (资本消耗效率): 这可以是花费在无货物利润上的实际经济价值,由中介获取并在过程中。
-
beta (劳动力技能): 正如《人力资源与组织行为》一书所述,成功的项目交付直接与个体成员的能力及其在团队中扮演的角色相关。这可以从越来越多的体育比赛结果预测中看出,这些预测可以预测每场比赛的成功概率。
宏观经济模型确实是许多微观行为的集合行为。关于宏观经济学的下一个前沿,数据科学家从已应用于个体公司或聚合微观行为的宏观经济模型中获取见解可能是有意义的。
如果我们要提供一个预测每个公司项目价值的模型,我们经常会从其他学科中发现一些见解,并且可以通过预测模型来量化它。拥有这些技术、投资金额和劳动力的特征可能是研究宏观经济的一个良好起点。
这样做可以预测项目的经济价值,这本身可以成为一个机器学习模型。在本章中,我们不会涉及这一点,因为我们希望专注于高层次的财务决策,但是金融的下一个前沿可以产生价值。
项目的现金流模式
除了项目的生产力/经济价值之外,我们还需要找出项目的精确现金流支付或收款。答案是从一个集中的信任存储库跟踪项目的所有事件。但等等:为了让所有方共享有关同一项目的信息,而不是拥有一个成为黑客中心的中央存储库,我们需要一个完全分散的地方;这就是区块链的理念。最佳的现金流模式预测来自于获取触发现金流活动的数据:无论是由签署进度确认的项目状态、根据付款条件确认销售协议、在仓库确认货物收到等。
实际上,在今天的世界中,大多数这些步骤仍然需要人工输入,因此更容易要求相关人员提供前瞻性的现金流预测。当然,如果所有这些活动都实现自动化,并由智能机器处理并编码到结构化数据库中,那么可靠地预测未来的现金流似乎是可能的。
即使我们将数据输入交给人类,财务中仍然要求人类提供三种情景——最优情景、现实情景和悲观情景——每种情景都有不同的发生概率。预期的预测结果将是这三种情景的预测结果。然而,考虑到极端预测的潜在问题,似乎更好让人类做出一个现实的预测,并为这些现金流事件在短期内发生的可能性分配一个概率。
再次强调,我们讨论的是大额支付。对于小额支付和多次支付,我们有以下几种方法:
-
规则性现金流
-
不规则/事件触发的现金流
规则性现金流 基于商业规则;例如,工资支付每周五进行。但为了预测下周的工资现金流,我们需要获取人力资源数据库,并查看每个员工的薪水。
对于日常业务而言,规则性现金流是基于采购支付和销售产生的支出,我们可以依赖在上一章中开发的模型。一旦我们预测了需求(销售),就可以可靠地估算所需的采购量及对应的支付延迟时间——因为我们知道企业买家会延迟支付供应商,以获取流动性。为了澄清这一点,以下是几种解释:
hbr.org/2001/05/how-fast-can-your-company-afford-to-grow
不规则/事件触发的现金流: 通常由其他方或外部事件触发。处理这一情况的最佳方法是改善与客户或供应商的数据交换。
财务报表项目预测
在这一部分,我们将讨论如何预测财务项目。让我们来看看:
- 销售: 如果你是经过金融培训的专业人士,那么最大的驱动因素——即收入——必须基于公司所提供的商品/服务的需求来预测。以杜克能源为例,预测电力市场基本上是观察各个细分市场的市场增长:工业、商业和家庭。这是与市场营销合作的最佳方式。
在工业和商业(B2B)市场中,最可靠的预测是观察客户的情况;最终,商业实体将必须创造一些商品和服务供最终消费者消费。对于工业和商业市场,我们可以从观察加利福尼亚州主要的工业活动及其潜在的电力消费开始。然后,我们可以进一步观察他们生产的是什么。
家庭的电力需求取决于家庭收入、人口、私人电动汽车以及最重要的天气情况——无论是厄尔尼诺现象还是其他天气预报,这些都是重要因素。尽管我们可以使用宏观经济数据(及其预报,例如天气预报)来预测我们的销售额,但并非总能为财务报表中的每一项财务数据找到预测指标。在这里,我们可以利用已知/可预测的项目来预测其他项,这应当具有经济和统计上的意义。
简而言之,预测销售的最佳方式是预测个人部门的销售活动。
对于从事实物商品行业的公司,如果没有将任何固定成本(如设备、机械等)分配到某项商品上,那么商品销售成本与销售额的比例接近 1:1。一个典型的例子是时尚行业,在这种情况下,商品销售成本应与销售额对齐。这些销售额与我们购买的商品成本成正比。
为了说明这一点,让我们对不同行业的商品销售成本与销售额进行小规模分析:
- 运营费用,包括销售、一般管理和行政费用(SG&A):根据会计准则和公司实践,一些公司并未单独列出折旧和摊销,这些并非与销售活动呈线性关系。从前面的表格来看,我们看到的趋势是,固定资产密集型行业(称为资本支出)的销售对销售成本的预测能力较低。另一方面,人力密集型且固定资产较少的行业,其销售成本更有可能随着可变成本比例的提高而发生变化。
AI 建模技术
在本节中,我们将探讨两种重要的建模技术,分别是线性优化和线性回归模型。在上一章中,我们学习了深度学习、神经网络、决策树和强化学习。
线性优化
线性优化模型在供应链业务中经常使用,它通过改变一些变量同时考虑一些约束条件,来实现优化目标(即最大化利润或最小化成本)。在线性优化的情况下,我们也实现了类似于资本结构优化过程的结构。
这不是一个机器学习模型,因为我们不需要训练机器来学习任何模式。
线性回归模型
这通常被称为回归模型。它的作用是找出一些因素对结果的因果关系。结果必须是数值型的。在统计学中,一些因素指的是自变量,我们假设这些因素彼此独立,而结果则是因变量。结果依赖于自变量。
寻找最优资本结构
现在,我们可以开始分析应当在资本市场筹集多少股权和债务资本来支持需求(新项目和业务,或者通过更换旧的或过时的机械设备)和供应(通过利润产生)。我们对最优资本结构的预测是有时间限制的;也就是说,它涉及给定时期的最优组合,比如下一年。当然,我们也可以将其扩展到未来五年。用来预测商业表现的公式如下:
收入增长 * 固定资本需求 / 销售额
最优资本结构是能够以最低资金成本提供所需资本,从而在公司内创造价值的资本结构。
实施步骤
在本节中,我们将学习如何实现一个机器学习模型,该模型能够找到最低资金成本的最优资本结构。
下载数据并加载到模型中
在我们的示例中,我们从外部金融数据提供商 Quandl 下载数据。这些数据是季度数据。假设我们是公司的 CFO,我们可以获得实时的每日预测,以定期更新我们的资金策略——每周、每月和每季度更新。步骤如下:
- 在这里,我们将使用Ticker来表示公司的唯一标识符。使用以下代码导入所需的库依赖:
import quandl
import pickle
import numpy as np
import math
import pandas as pd
from sklearn import linear_model
import matplotlib.pyplot as plt
import seaborn as sns
- 定义公司 API 密钥和股票代码:
tkr = 'DUK'
quandl.ApiConfig.api_key = '[API key from Quandl]'
- 下载纽约证券交易所指数值和股票代码,然后计算纽约证券交易所与股票的回报,以得出 CAPM 定价模型中的贝塔值和无风险利率:
'''*************************************
## Retrieve data for 2A.
'''
econ = quandl.get("FRED/TEDRATE", authtoken="[API Key from Quandl]", start_date='2018-05-31', end_date='2018-07-31')
NYSE_index = quandl.get('WFE/INDEXES_NYSECOMPOSITE', start_date='2013-05-31', end_date='2018-07-31')
- 下载公司的财务数据,以预测并获取目标公司两年的财务数据。这些数据将输入到信用模型中:
'''*************************************
## Retrieve Data for the target ticker
'''
record_db = quandl.get_table('SHARADAR/SF1', calendardate='2017-12-31', ticker=tkr,dimension='MRY')
record_db_t_1 = quandl.get_table('SHARADAR/SF1', calendardate='2016-12-31', ticker=tkr,dimension='MRY')
- 下载公司的历史财务数据,以便估算驱动因素之间的参数:
'''*************************************
## Download & Load Data for 2C.
'''
tkr = 'DUK'
quandl.ApiConfig.api_key = 'nzBtupqX5H65EG3sFusF'
record_db_t_2017Q1=quandl.get_table('SHARADAR/SF1', calendardate='2017-3-31', ticker=tkr,dimension='MRQ')
...
df_all = pd.concat(list_all)
#fix the dataframes
#convert to float
#create new fields
#remove any record with na and 0 values to avoid division errors
#we take a proxy here, should use last period's numbers as denominator not current period
准备参数和模型
在本节中,将计算以下参数:
-
使用资本资产定价模型(CAPM)中的杠杆贝塔来计算股本成本。
-
通过重新使用信用模型(逻辑回归模型)来计算债务成本。我们之所以使用这个模型,是因为它简单,并且需要最少的财务比率。
-
销售成本。资本支出通过将其与销售增长和销售成本相关联来估算。
使用这些参数,可以估算财务模型的主要变量,具体如下:
-
计算股本成本公式:根据 1A 的数据,找出无风险利率和贝塔值,作为 CAPM 模型回归公式的截距和系数:股票回报 = 无风险利率 + 贝塔值 * 市场回报。
-
计算债务成本公式:通过计算财务比率来计算债务成本。我们使用的模型基于上一章节中计算的 5 年违约率。在现实中,债券评级由评级机构(如穆迪或标准普尔)制定,而银行贷款评级则由每家银行的信用风险模型内部进行评定,类似于我们使用的模型。
-
计算驱动因素,查看销售如何直接或间接地通过销售成本驱动利润与损益表/营运资本中的其他项目。
-
我们假设销售成本(或销售费用)由销售活动驱动,而运营费用由销售成本驱动。我们假设这种关系是线性的,可以通过回归模型计算得出。
-
销售费用和一般管理费用在我们的示例中为零;因此,我们没有相关的计算。
-
我也尝试过弄清楚营运资本与应收账款、存货和应付账款之间的关系,但我们最终不采用这个方法,而是采用另一种方式——每笔销售所需的总现金量——来计算在日常运营中支持销售所需的现金/营运资本量。
预测
cal_F_WACC
准备参数和模型部分提到的所有阶段都已合并。公式是基于在 Excel 中看到的依赖关系构建的。然而,流程大体从销售额开始,然后确定资本结构,再回到损益表。
计算加权平均资本成本后,将其与预设条件进行比较,比如信用风险变化,不能超过某个阈值。
以下是预测中的会计公式:
-
销售额预测: 销售额 = 现有销售额 * (1 + 销售增长率)
-
净收入按照销售额计算: 净收入 = 销售额 - 销售成本 - 销售、一般管理费用 - 营运费用 - 净利息费用 - 税务费用
-
销售成本 = 销售额 * 销售成本比率
-
销售、一般管理费用 = 销售额 * 销售费用比率
-
一般管理费用与销售额比率
-
营运费用 = 销售额 * 营运费用与销售额比率
-
净利息费用 = 债务 * 利息费用百分比
-
我们需要的总股本和债务等于所需资本:股本 + 债务 >= 现有固定资产净值 + 新增固定资产需求 + 所需营运资本 + 存货 + 商誉
-
股本 = 现有股本 + 新生成的股本
-
债务 = 现有债务 + 新增净债务资本
-
所需新资本 = 所需新股本 + 所需新债务资本
-
新增净股本生成 = 新股本筹集 - 分红支付 + 来自收益的新股本
-
新股本来自收益 = 净收入
-
新增净债务资本生成 = 新增债务资本筹集 - 债务偿还
-
债务偿还 = 上期债务偿还
-
所需总固定资产(PPE) = 现有固定资产(扣除折旧) - 下期折旧 + 所需新增固定资产
-
销售额 / 总固定资产需求 = 销售额与固定资产比率
-
所需营运资本 = 每销售所需营运资本 * 销售额
-
每销售所需的营运资金 = 销售成本/销售额 * 总现金周期天数/经营现金周期天数 + 经营费用/销售额 * 1/2
其代码如下:
'''*************************************
3\. Projection
'''
print('optimization...')
#simulations
record_db_f = record_db
#Projection
...
def cal_F_WACC(record_db_f, logreg, logreg_sc, new_debt_pct,price_offering,levered_beta,sales_growth,coefs,r_free):
...
for new_debt_pct in debt_pct_range:
for price_offering in price_offering_range:
...
F_WACC, F_default_risk,conditions = cal_F_WACC(record_db_f,logreg,logreg_sc, new_debt_pct, price_offering,levered_beta,sales_growth,coefs,r_free)
'''****************************************
4\. Calculate WACC
'''
#update WACC
obj = F_WACC < optimal_WACC and F_default_risk/default_risk_existing-1<=0.75
...
计算加权平均资本成本
这一步骤的目标是确保以下事项发生:
-
理想的资本结构通过债务和股本的组合获得最低资本成本的奖励。
-
股本成本由资本资产定价模型定义。
-
债务成本由信用风险成本和无风险利率的成本定义。信用风险成本由我们在上一章构建的信用模型计算得出。
-
最小化以下内容:
-
加权平均资本成本(WACC)
-
债务成本
-
信用风险成本
-
股本成本
-
无杠杆贝塔
-
杠杆贝塔
优化中使用的约束
让我们看看资本的供需关系,它必须得到妥善安排:
-
资本结构限制:现有债权人不希望信用评级发生变化;因此,他们希望将违约风险的变化限制在 75%以内。
-
计算出的约束,但未进行优化检查:
-
这些限制未被实施,因为会导致损益项目的循环引用,必须加以修复。
-
通常,这些是现有股东施加的限制。
-
现有股东不希望每股收益因股份增多而下降。
-
现有股东不希望通过大幅增加股本的方式向公司追加额外股本。
以下代码片段展示了如何计算股权发行约束:
#equity offering constraints --- not bounding
price_offering = record_db_f['price'][0]
unit_offering = int(F_new_equity / price_offering)
F_eps = F_earnings / (unit_offering+record_db_f['shareswa'][0])
equity_growth = F_equity / record_db_f['equity'][0]-1
eps_growth = abs(F_eps/ (record_db_f['netinc'][0]/record_db_f['shareswa'][0])-1)
c_eq_1 = equity_growth <= 0.1
c_eq_2 = eps_growth <= 0.3
恭喜!我们已经通过优化找到了公司的最优资本结构。
使用宏观经济情境提供财务表现预测
首席财务官的一个关键工作是提供财务表现的预测。那么,人工智能将如何改变这一工作?我们将基于我们在财务领域的知识,帮助进行会计规则之间的财务预测,并加入我们时代的预测能力来提升它。
作为上市公司的首席财务官,我们的一个关键职责是为前瞻性的财务数据提供管理层和分析师指导。假设数据由作者手工制作,旨在模拟会计系统的样子。
在这一部分,我们将探讨如何预测公司的财务表现。
实施步骤
在这一部分,我们将学习如何使用宏观经济情境推导财务表现预测。步骤如下:
- 通过从 CSV 文件加载并导入所需的库依赖项,初始化每个行业的股票代码:
from pyquery import PyQuery
import pandas as pd
import quandl
import matplotlib.pyplot as plt
from sklearn import linear_model
from sklearn.metrics import r2_score
...
- 从 Quandl 下载历史财务数据:
cal_LIND = quandl.get("FRED/CASLIND", authtoken="nzBtupqX5H65EG3sFusF")
cal_ele = quandl.get(["EIA/ELEC_SALES_CA_RES_M","EIA/ELEC_SALES_CA_IND_M"], authtoken="nzBtupqX5H65EG3sFusF")
- 计算推导表现所需的各种参数:
#update the index date to begin of month (in fact all index should be referring to end of month)
cal_ele['mth_begin'] = cal_ele.index
#change the column to begin of month
...
reg_retail = linear_model.LinearRegression()
reg_retail.fit(df_marco[[' MeanAvgTemperature']], \
df_marco['EIA/ELEC_SALES_CA_RES_M - Value'])
reg_retail.coef_
reg_retail_pred = \
reg_retail.predict(df_marco[['MeanAvgTemperature']])
error_retail = r2_score(df_marco['EIA/ELEC_SALES_CA_RES_M - \
Value'], reg_retail_pred)
reg_ind = linear_model.LinearRegression()
reg_ind.fit(df_marco[[' MeanAvgTemperature']], \
df_marco['EIA/ELEC_SALES_CA_IND_M - Value'])
reg_ind.coef_
reg_ind_pred = reg_ind.predict(df_marco[['MeanAvgTemperature']])
error_ind = r2_score(df_marco['EIA/ELEC_SALES_CA_IND_M - \
Value'], reg_ind_pred)
...
恭喜!你已经使用气象专家可靠预测的宏观因素生成了销售预测。
总结
在本章中,我们探讨了金融银行业务以及金融领域的一些基本概念。我们学习了两种重要的机器学习建模技术,分别是优化技术和线性回归模型。我们还研究了两个帮助自动化资本市场决策的例子——寻找最佳资本结构和使用宏观经济情景提供财务表现预测。此外,我们还探讨了投资银行和财务报告的未来及其影响。
然后,我们探索了财务预测和财务建模的内部过程,这得益于实时财务 IT 系统的迅速更新,使得财务职位能够实时更新。通过每天利用丰富的财务职位数据,我们有大量数据点可以进行可靠的公司财务状况预测。作为公司的战略思维者,我们还探讨了如何依赖外部数据(如来自政府流行天气预报服务的天气数据)来弥补 CFO 所面临的内部财务数据缺失问题。我们利用了一个外部数据提供商 Quandl,将同行业的所有财务数据融合在一起。实际上,这种技术应该被内部职位快照所替代,但本质上,关键点是将 AI 与财务建模结合起来。
正如你所看到的,财务报告的未来可能不仅仅是报告财务报表那么简单。首席财务官(CFO)可能需要披露项目的状态和计划,以提高透明度,同时提供投资者的利益,而不危及商业机密。这种披露形式也出现在年度报告中,但尚未以定量格式呈现。未来的 CFO 们将不得不迎接这种新的报告理念浪潮,因为组织内部发生的事情正是推动资本回报的关键因素。
在下一章中,我们将继续学习新型机器学习技术,这些技术将帮助我们解决复杂的金融问题。我们还将了解一个核心商业概念——并购(M&A)。我们将了解像 SQL 这样的数据技术基础概念,并研究一种名为聚类模型的机器学习建模技术。
第五章:预测投资银行家的未来
在上一章,我们理解了基本的金融和资本市场概念。我们探讨了人工智能如何通过运行风险模型和利用宏观经济数据生成销售预测,帮助我们优化最佳资本结构。我们还看到了人工智能在规划组织的财务内部和外部投资者沟通方面的应用。接着,我们通过两个例子进行说明——第一个是如何优化债务和股本的资金组合,第二个是进行财务预测,以帮助我们规划资本需求。
本章的目标是介绍可用于财务规划的额外技术。你将学习如何为新发行执行自动化配售,以便从有兴趣的投资者那里获得资本。接着,你将学习如何识别收购方和目标方,这一过程需要具备科学背景,才能挑选出最需要银行服务的对象。
本章将涵盖以下主题:
-
投资银行的基础知识
-
理解数据技术
-
聚类模型
-
新发行的自动化配售
-
识别收购方和目标方
让我们开始吧!
投资银行的基础知识
投资银行业务将是本章的重点。因此,你需要理解一些与投资银行相关的基本概念。我们将从理解首次公开募股(简称IPO)的挑战开始。当一家公司决定通过公开市场从公众那里获得资金时,它们会发布 IPO 供公众和机构认购。我们还将理解并购(M&A)的概念,以及如何对投资者进行分类并将人工智能应用于并购。
投资银行家在首次公开募股(IPO)中的角色
以下是投资银行家处理的一些核心问题:
-
**定价:**新发行(股本)的正确价格是多少?
-
**配售:**我们应该将股票分配给谁,且以什么价格?
-
**上市:**我们如何将这些股票注册到市场(如证券交易所),以便它们满足作为市场投资证券的所有要求?
让我们逐个回答这些问题。
为了回答第一个问题,在上一章中,我们简要阐述了如何正确建模公司资本结构,包括其财务状况。核心问题在于如何估算驱动因素,尤其是在给定一些与公司相关的宏观指标时。
要回答第二个问题,市场对投资偏好的可见性是很重要的。当投资者的投资决策由机器人顾问自动化时,我们应该很容易测试由机器人代表的投资者需求。机器人需要投资参数,而这些预测大部分是由投资银行的引擎生成的;也就是说,在访问潜在问题信息时(也称为招股说明书),其过去的准确性也应被考虑。我们将在本章完成的第一个示例中讨论这个问题。
第三个问题侧重于报告和归档公司所有权和法律状态的合法性以及其风险因素的相关信息。当这个问题由机器人执行时,监管机构/证券交易所会有不同的要求:
-
应该有一个来自监管机构/证券交易所的机器人来验证公司申报的声明。在这里,机器人指的是一种智能软件程序,可以执行为其设计的特定任务。然而,按照我们在第四章《资本市场决策的机械化》中的讨论,上市公司的 CFO 也许能够上传他们的销售预测。影响电力公司销售的关键因素是天气,因为天气对销售的预测性非常强。
-
除了与销售相关的因素外,风险因素还包括影响财务报表主要财务项目的其他宏观经济变量。与公司战略相关的因素将在第七章《感知市场情绪进行卖方算法营销》中进一步探讨。我们在这里也会进行讨论,因为投资者方面也会影响需要关注的重要议题。
股票分类 – 风格
news.morningstar.com/pdfs/FactSheet_StyleBox_Final.pdf
在这里,我们可以考虑行业/部门、股票规模、股票的风险性、股票的潜力等等。有许多方法可以创建特征并对股票进行分类。我们将在本章中使用行业和规模作为定性分类的特征。
定量方法(例如,套利定价理论(APT))将包含相似因素的股票进行分析性分组。
投资者分类
像股票分类一样,既有定量方法,也有定性方法。定性方法可以基于资金类型(养老金、主权财富基金、保险等)、策略(多空策略、全球宏观策略等)、基础资产(期货、商品、股票、债券和私人股本等)、风险性等。定量方法则可以基于这些投资者所依赖的临近因素。在本章的第一个例子中,我们将使用投资风险性和回报作为定性分类的特征。
并购
投资银行业务不仅仅涵盖证券上市,还包括像并购(M&A)这样的咨询服务、公司估值等财务意见,以及其他由事件驱动的融资活动,比如管理层收购。简而言之,所有这些活动都涉及公司和/或公司资产的买卖,并正确定价。理解这些最简单的方式是通过想象房地产经纪人、评估师和按揭银行家买房子的方式。并购就像两个人结婚——有时一个会更占主导地位,而有时则是两个平等实体的结合。这背后的逻辑是,公司的存在是因为它的运营效率更高,正如罗纳德·科斯在 1937 年所理论化的那样。随着技术、法规和消费者偏好的变化,公司的经济边界也会变化,这就为并购提供了合理性。
我们主要讨论以下几种类型的交易:
-
收购(收购另一家公司)
-
合并(两家或更多公司合并)
-
剥离(出售公司本身)
-
分拆(出售部分公司资产)等
另一个对并购分类的维度是通过收购方和目标公司之间的交易前关系来区分:如果它们处于同一行业,这被称为横向整合;如果它们是供应商与客户关系,这被称为纵向整合;如果它们没有任何关联,这被称为多元化。
作为一名投资银行家,以下是你需要关注的关键领域:
-
交易前事项:确保收购方和目标方有意愿共同探索交易的可能性。
-
审批:由监管机构或现有股东批准。
-
交易后事项:确保 1 + 1 > 2。这并不是因为数学错误,而是因为某些过程的整合可以带来更好的结果。所以,当两个实体(公司)合并时,成本将更低,或者收入会更高。
-
联系目标公司
-
交换文件和定价
-
进行尽职调查
-
完成交易
-
执行交易后整合
接下来,我们将探讨人工智能在并购中的应用。
人工智能在并购中的应用
关于人工智能在银行业务中的应用,人工智能被用来识别正确的目标,并帮助量化交易后的协同效应定价。在现有的设置下,这两个步骤(第一步和最后一步)都不太可靠,因为目前没有太多科学依据。首先,银行家的时间非常昂贵,而任何潜在交易的成功率非常低(例如,90%)。客户(买方/卖方)会有动机最大化银行家的服务时间,即使交易可能无法达成。鉴于银行家的时间有限,而客户有最大化银行家时间的矛盾目标,无论他们是否真正打算完成交易,最佳的方法是找到并基于并购交易得出的实际经济效益。如果从根本上可行,就应更紧迫地宣布并推动投资银行家参与交易执行/公告。
这种建模方法实际上今天已经存在于信用风险建模中,正如我们在前面章节中提到的。根据财务数据,我们预测某一事件是否会发生的二元结果。在信用风险模型的情况下,可能在X年内发生破产;而在并购的情况下,基于财务数据,它可能是在X年内发生收购或剥离公告。我个人认为,如果能够如此估计破产概率,那么这些建模方法之间并没有什么区别。
其次,在量化交易后协同效应时,通常考虑的是成本效率、收入增长,或通过员工的知识转移实现更高的生产力:
-
关于成本效率,我们可以轻松地运行销售分析,验证行业中的成本关系,以定量方式确认这是否是行业的实际行为,或者仅仅是供应商会接受合并公司支付较低款项的空想。
-
关于收入协同效应,这是一项庞大的数据交换工作,只能通过适当的机器学习模型来完成。例如,如果协同效应是关于更好的市场准入(例如,买方竞争对手 A 收购同行业的竞争对手 B),那么竞争对手 A 的目标模型应在竞争对手 B 的客户数据库上运行,以推测可能产生的收入。这种情况也出现在联合数据库营销项目中,例如通过银行销售的保险(银保)。在这种情况下,保险公司提供模型,应用于银行的客户数据库。
-
关于与人力资源协同相关的专业知识,我认为将人力资源分析应用于衡量和量化知识、技能水平、文化适应性以及团队表现是同样具有可行性的。在协同效应分析前期,需要对员工的硬性与软性素质进行衡量、预测和模拟。
为了实现这一点,我认为现有的并购银行家不会愿意做太多的改变,因为考虑到目前客户和员工的数字化程度尚未普及,完成这项任务所花费的时间会非常长。这意味着现有的功能和模型无法实现这一目标。但我确实相信我们应该致力于这一未来的并购模型,特别是现在我们正在构建并购的未来,并培养下一代人才。
与金融投资相比,并购在运营整合方面具有巨大的不确定性,这正是人工智能应当发挥价值的地方。已经有许多研究探讨了成功的并购交易中决定性因素,这些因素能够实现预期的协同效应;这些来自学术研究的发现或特征需要被收集并进行分析,以生成可量化的成功可能性,并在计算报价时进行定价。
上市公司报备义务
www.nyse.com/publicdocs/nyse/listing/nyse_ipo_guide.pdf
理解数据技术
我们将在本章的示例中管理大量数据。因此,了解我们将使用的底层数据技术至关重要。这些数据技术与存储不同类型的数据和信息有关。信息存储有两个挑战——首先是我们用来存储信息的物理介质,其次是信息存储的格式。
Hadoop 是一种解决方案,允许将存储的文件物理分布。这帮助我们处理许多问题,例如将大量数据存储在一个地方、备份、恢复等。在我们的案例中,由于数据量不足以支持使用该技术,我们将数据存储在一台计算机上,但以下 NoSQL 数据库可以支持这种存储选项。在 Python 中,还有一种文件格式叫做 HDF5,它也支持分布式文件系统。
虽然可以使用 NoSQL 数据库,但我在本章中没有使用它们的原因可以通过以下表格来解释,该表格对比了 SQLite、Cassandra 和 MongoDB 的特点:
| 优点 | 缺点 | 结论 | |
|---|---|---|---|
| SQLite | 结构化数据格式,兼容 DataFrames | 不能保存非结构化数据。 | 我们需要它来简化操作。 |
| Cassandra | 可以在分布式计算环境中运行,并能够存储结构化数据(以字段为项目) | 处理结构化数据时,语法不直观,需要进行插入操作。 | 由于我们的目标是聚类相似的投资者并预测谁会在首次公开募股(IPO)中购买我们的新发行股票,因此这些工具不适用于我们的案例。 |
| MongoDB | 可以处理巨大的数据规模并进行并行处理不同记录 | 不适合处理完全结构化的数据,如交易记录;在运行任何机器学习算法之前,仍然需要将其转换为 DataFrame。 |
通过这项分析,我们发现,采用 NoSQL 数据库并非出于追求前沿技术的必要性。在资本市场中,数据相当结构化,使用适合此目的的 SQL 数据库可能更高效。
聚类模型
在开始研究编程内容之前,我们先来看看聚类模型,因为在第一个例子中我们将使用一个聚类模型。
聚类的目标是将相似的数据点聚集在一起。以一个简单的例子,当有三个数据点,每个数据点都有一列,[1],[2],[6],我们选取一个点作为质心,表示附近的点;例如,使用两个质心,[1.5] 和 [5],分别代表一个聚类:一个包含 [1]、[2],另一个聚类包含 [6]。这些示例聚类可以通过以下图表查看:
当每个数据点有两列时,实际数据点与质心之间的距离需要将这两列视为一个数据点来考虑。我们采用一种称为欧几里得距离的度量方法。
在银行业中采用聚类的主要挑战之一是,它可能会生成过大的聚类,这会降低真正的正例率,如果将所有聚类作为目标进行分析的话。根据我的经验,我会将其作为初步数据分析工具,帮助了解目标人群的主要动态,而不一定用于在批发银行环境中得出具有经济意义的可操作性见解。在我们的例子中,我们将创建许多聚类,且有严格要求,每个数据点与质心之间的距离平均偏差为 5%。
另一个关于聚类算法的关键问题是如何确定输入的特征数量。我们可能会因过度权重某些类型的财务比率(例如,使用两种不同的盈利能力比率,如股本回报率和资产回报率)而导致聚类偏差。解决方法是进行主成分分析,它通过将相似的特征合并为同一特征来去除冗余特征。
www.packtpub.com/big-data-and-business-intelligence/building-practical-recommendation-engines-part-1-video
新发行自动配售
如果有问题,背后一定有投资者。传统的投资银行会雇佣一组专业人士,组成一个被称为联合配售台的团队,负责将证券问题分配给能够购买这些股票和债券的投资者。
如果我们考虑投资银行联合配售台的角色,我们的工作就是识别即将发布的新证券中的基石投资者,因为 CFO 在股权方面有资金需求。为此,我们将使用来自 SEC 备案的美国股票的机构持股数据,通过 Quandl/Sharadar 来帮助我们找到那些投资偏好相似的投资者,并将这些与同样持有类似股票的投资者匹配,如杜克能源。
关于卖给谁,我们将以美国股票的最大投资者作为我们的投资者群体。联合配售台的工作是将任何股票发行的主要仓位卖给这些投资者。通过使用无监督学习方法,我们将相关的股票推荐给合适的投资者作为首次公开发行(IPO)。这可以通过证券相似度(称为持仓相似度)和投资风格(称为投资者相似度)来实现。
解决问题
以下图表展示了解决当前问题所涉及的步骤:
我们将在接下来的章节中详细讲解每个步骤。
构建相似度模型
在这里,我们将构建两个相似度模型——一个是股票相似度模型,另一个是找出相似投资者的模型。两个模型都是聚类模型,属于最后一种机器学习方法——无监督学习。我们选择了 21 个财务比率来构建股票层级的聚类模型,而在投资者模型中,我们最多使用 60 个特征(六个市值规模 * 五个投资决策 * 两种指标类型):
-
六个市值规模:纳米级、市值小型、市值中型、市值大型、市值超大、和巨型
-
五个投资决策:两个买入决策(全新或部分),一个持有决策,两个卖出决策(全卖或部分卖)
-
七个指标:季度回报(总回报、已实现、未实现)、新资金变化率的均值和标准差,以及当前市值
导入所有相关库,然后通过读取 CSV 文件加载股票代码的集合,并同时加载描述股票的规模字段。为了减少处理时间,加载投资者列表,而不是所有投资者。对于每个投资者,计算每个市场细分股票的方向(即,我们使用规模作为唯一的市场细分,实际上,我们应使用国家×行业×规模)。
构建投资者聚类模型
为了构建投资者聚类模型,遍历投资者并计算其变动和利润(已实现和未实现利润),如下所示:
- 导入所需的库和数据:
'''************************
Load Data
'''
#import relevant libraries
import quandl
from datetime import date,timedelta
import pandas as pd
import os
#load tickers universe and description field (scale)
...
#loop through investors
...
for investor in investorNameList:
...
#calculate the change in position by ticker on
Quarter-to-quarter basis
...
#qualify investor's activities
print('classify investor decision')
...
#output the ticker’s activities of the investor
- 准备投资者概况:
## Prepare investor Profile'''
#load relevant libraries
import os
import pandas as pd
import numpy as np
from time import time
from sklearn import metrics
from sklearn.cluster import KMeans
from sklearn.preprocessing import StandardScaler
import pickle
...
#Summarize quarterly performance of investors per quarter
...
for file in file_list:
...
for index, row in tmp_pd.iterrows():
...
#calculate return (realized, unrealized and new money)
...
- 准备聚类投资者,以及输出聚类和结果:
## Cluster investors
#cleansed and transform data for clustering
...
sc_X = StandardScaler()
X = sc_X.fit_transform(investor_pd)
#define the k means function
def bench_k_means(estimator, name, data):
...
#try out different K means parameters and find out the best parameters
...
for num_cluster in range(5, 500):
KMeans_model = KMeans(init='k-means++', \
n_clusters=num_cluster, n_init=10)
...
## Output the results
#Output clusters
在这里,我们对列出按市场划分的已实现和未实现收益特征进行聚类分析。然后,我们设置一个 0.05 的阈值,这意味着我们构建的聚类在特征变量上必须有 5%的变化。最后,输出聚类结果;即聚类结果、聚类模型和标准化器。
构建股票聚类模型
为了构建股票聚类模型,我们将加载数据,准备股票概况,聚类股票,并输出聚类结果:
- 加载行业、股票代码和函数,并导入库以及 Quandl 的 KPI 关键数据:
'''*************************************
i. load industry, tickers and functions
'''
#import libraries
import quandl
import pandas as pd
import numpy as np
import os
from time import time
from sklearn import metrics
from sklearn.cluster import KMeans
from sklearn.preprocessing import StandardScaler
import pickle
#KPI keys
...
...
sklearnpickle
#define important functions
#download fundamental data of the ticker
def download_tkr(tkr):
...
- 定义所需的k均值聚类函数。通过使用超过临界值的股票代码来过滤行业。这里,我们将使用 100 个股票代码作为临界值。评估行业时,列出行业中的聚类。然后,下载通过该门槛的行业财务数据。对于行业聚类中的每个股票代码,清理数据类型:
#kmean clustering function
def bench_k_means(estimator, name, data):
...
'''*************************************
#2a. load data
'''
#parameters
...
'''*************************************
#i. filter the industry in scope
'''
...
#collect tkr in each industry
for index, row in df_tkr.iterrows():
...
- 然后,计算行业的聚类模型。行业中股票代码总数的一半应该是聚类的最大数量。聚类模型将在达到最大轮廓系数 5%的目标值时停止,或者当达到N/2 个聚类时停止(N = 行业内股票代码的数量):
'''*************************************
#ii. create a dataframe for each industry to do clustering
'''
...
#loop through the industry
for ind, list_tkr in dict_ind_tkr.items():
...
#Go through the ticker list to Download data from source
#loop through tickers from that industry
for tkr in list_tkr:
...
'''*************************************
2b. prepare features for clustering for the industry
'''
#convert to float and calc the difference across rows
...
'''*************************************
2C. Perform K means clustering for the industry
'''
#clustering
sc_X = StandardScaler()
X = sc_X.fit_transform(df_fs_filter)
...
for num_cluster in range(5, max_clsuter):
KMeans_model = KMeans(init='k-means++', \
n_clusters=num_cluster, n_init=10)
...
- 输出标准化器、聚类模型和聚类结果:
'''*************************************
2D. Output the clustering model and scaler for the industry
'''
#Output clusters
...
通过采用我们在前一章中开发的财务预测方法,我们可以推导出财务报表,从而得出后续分类股票所需的财务比率。
在前一章我们查看的示例中,我们展示了发行债务和股本后资本结构的变化。但最初,我们并没有假设股价发生任何变化,比如市盈率,而仅假设盈利能力、规模等因素发生变化。
为了预测新股票的财务数据,执行以下步骤:
pickle
#import relevant libraries
import os
import pickle
import math
import numpy as np
import pandas as pd
import quandl
...
- 利用我们在上一章中构建的程序,并运行前面一节定义的财务预测。然后,计算预计上市公司财务的各项指标:
#perform financial projection
#reuse the function developed for WACC optimization
def cal_F_financials(record_db_f, logreg, logreg_sc, new_debt_pct, price_offering, levered_beta, sales_growth, coefs, r_free):
...
'''*****************************
Step 2: Simulate financial of the new stock
'''
...
#load credit model built previously
...
#reuse the parameters developed from WACC example
...
#assume that we are raising equity for the same client
...
#run simulation / projection of financial data
...
如我们所见,股票聚类看起来像我们正在处理的新股票。聚类模型会告诉我们这只新股票与同一聚类中的其他股票的关联。
在构建股票模型时,我们可以使用一个快捷方式,这也是一个实际的考虑因素。对于行业中股票数量过少的情况(例如少于 100 只股票),不需要建立聚类模型来帮助我们发现行业中的子群体。相反,如果股票数量不多,我们应该检查每一只股票。
给定完整的股票聚类成员列表,我们可以去这些股票的现有股东中查找当前的所有者(投资者列表 A)。如果我们仍然需要更多的潜在投资者名单,我们可以再运行一个投资者级别的聚类模型,找出谁(投资者列表 B)可能对这只与投资者列表 A 有相似特征的股票感兴趣。
执行聚类的步骤如下:
-
查找与我们计划上市/联合发行的股票具有相似财务状况并且属于同一行业的股票。
-
根据我们找到的股票,我们找出这些股票的现有持有者。
-
我们查找持有我们检查过的股票的投资者列表;也就是说,选择的投资者。
-
我们找到所有投资者的聚类 ID。
-
给定选择的投资者,找出聚类及与该聚类 ID 相同的其他投资者。这些就是我们将出售新发行股票的目标投资者。
以下是我们可以用来执行聚类的伪代码:
#Step 2 and 3\. Perform clustering to find out the similar investors whose sharing the similar stocks
'''*****************************
Step 3: Run the similarity models to find out holders of the similar stocks
'''
#check if we need any model - if industry has too few stocks, no model needed to find out the similar stocks
...
#retrieve the list of tickers that are similar
...
#find list of investors looking at the similar size and more
#check which investors have it...
...
#loop through investors holding name by name to find out investor that is holding the similar stocks
for filename in investorNameList:
...
#Load the investor clustering model
...
#extract the investors' cluster id
...
#find out who else share the same cluster id
...
#print out the investor list
...
上述代码展示了如何列出具有相似投资组合股票的聚类投资者。在这里,我们已经为投资者构建并使用了一个聚类模型。在下一节中,我们将建立收购方和目标方的理解。
识别收购方和目标方
在收购方和目标方领域,企业财务研究有着悠久的历史,而我们的挑战是将这丰富的研究成果应用于现实世界。对冲基金已经将这些研究成果应用于并购套利,而并购银行家一直定期关注市场评分和评估(例如阅读早间新闻)。
在本章中,我们假设你是一位寻找组织机会的并购银行家。为了优化我们的时间分配,我们可以通过集中精力在那些能够完成交易的客户身上,从而更好地分配我们的时间。因此,我们将使用一个模型来预测我们在并购中成为收购方或目标方的概率。
当前的新一代投资银行家应该使用自动化的财务建模工具。随着时间的推移,数据可以被捕捉,然后可以添加预测能力来协助银行家进行财务建模。当前使用 Excel 的世界,确实需要更多关于如何训练机器来解析/理解基于 Excel 的财务模型的自然语言处理研究,这些模型对人类来说很容易理解,但对机器来说几乎无法理解!
其次,M&A 预测模型应成为投资委员会/承保委员会的一部分,其将呈现宣布交易可能性,就像今天的信用委员会呈现信用评级一样。
所以,让我们看看如何将类似的方法应用于并购预测中的信用评级以发现交易。
按照以下步骤解决这个问题。我们将从加载必要的 Python 库开始:
- 导入所有必需的库并定义关键变量:
'''*************************************
#1\. Import libraries and define key variables
'''
import pandas as pd
import numpy as np
import quandl
import matplotlib.pyplot as plt
from sklearn.metrics import classification_report,roc_curve, auc,confusion_matrix,f1_score
from sklearn.model_selection import train_test_split
from sklearn import tree
from sklearn.neural_network import MLPClassifier
from sklearn.preprocessing import StandardScaler
import pickle
import graphviz
#KPI keys
quandl.ApiConfig.api_key = '[API Key for Quandl]'
- 下载给定股票的财务数据(从前面的示例中提取),并定义您将用于训练决策树和神经网络的函数,包括网格搜索(所有这些都可以从第三章中获得,使用特征和强化学习自动化银行融资):
'''*************************************
#2\. Definition of functions
'''
#2a.Download tickers
def download_tkr(tkr):
...
#2b.Train tree
def train_tree(X,Y,ind):
...
##2C Neural Network
#2Ci. Grid search that simulate the performance of different neural network design
def grid_search(X_train,X_test, Y_train,Y_test,num_training_sample):
...
#2Cii. Train Neural Network
def train_NN(X,Y,ind):
...
- 筛选具有大量股票代码的行业,并运行通过行业及其相应股票代码来构建决策树和神经网络:
def filterIndustriesByTickets(ind):
- 按行业输出 ROC 曲线的结果:
def displayCurveChart(type, ind):
- 从文件中加载公司列表以及它们的行业,就像我们自动合作一样。选择至少有 30 家公司的行业,将相同行业的股票代码加载到字典的一个条目中,以行业作为键,股票代码作为值:
'''*************************************
3\. Execute the program
#3a. filter the industry in scope
'''
groupby_fld = 'sicsector'
min_size = 30
df_tkr = pd.read_csv('industry_tickers_list.csv')
...
#collect ticker in each industry
for index, row in df_tkr.iterrows():
ind = row[groupby_fld]
tkr = row['ticker']
if ind in list_scope:
if ind in dict_ind_tkr:
dict_ind_tkr[ind].append(tkr)
else:
dict_ind_tkr[ind] = tkr
- 逐个循环遍历所选行业,并加载公司的历史财务。对于每家公司,我们将加载 10 年的年度财务记录:
#loop through the dictionary - one industry at a time
for ind, list_tkr in dict_ind_tkr.items():
df_X = pd.DataFrame({})
df_Y = pd.DataFrame({})
print(ind)
#Go through the ticker list to Download data from source
#loop through tickers from that industry
for tkr in list_tkr:
print(tkr)
try:
df_tmp,X_tmp,Y_tmp = download_tkr(tkr)
...
1是download_tkr(tkr)
- 将行业数据拆分以训练模型:
#neural network
nn_clf,f1_score_temp = train_NN(df_X,df_Y,ind)
f1_list.append(f1_score_temp)
nn_clf.get_params()
#decision tree
try:
tree_clf,f1_score_temp = train_tree(df_X,df_Y,ind)
except Exception:
continue
f1_list.append(f1_score_temp)
tree_clf.get_params()
在这里,我们利用了我们在[第二章中构建的内容,时间序列分析。然而,为了说明问题,我们仅使用了决策树和神经网络代码。
这就是本章的结束。
摘要
在这一章中,你已经理解了投资银行的基本知识。现在,你应该能够理解 IPO 和并购的概念。基于你在本章中学到的数据技术,你应该能够建模领域需求。通过使用聚类模型技术,你现在可以创建高性能的人工智能系统。
在这之后,我们完成了一个练习,解决了新发行问题的自动联合发布问题。我们还看了一个示例,讲解了如何识别收购方和目标方。
在下一章,我们将重点讨论投资组合管理、资产管理,以及一些适用于投资组合管理领域的人工技巧。

