银行业的人工智能实用指南-全-

银行业的人工智能实用指南(全)

原文:annas-archive.org/md5/b86c0f40896908cb7816c76f378e19a2

译者:飞龙

协议:CC BY-NC-SA 4.0

前言

重塑你对银行的看法,首先要了解最新且最有效的方法,如人工智能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 (data.world/) 获取数据,并订阅 Quandl 的付费服务(Sharadar Core US Equities Bundle (www.quandl.com/databases/SFA/data) 用于第 4 和第五章,以及 Sharadar Fund Prices (www.quandl.com/databases/SFP/data) 用于第 6 和第七章),Twitter 的高级搜索功能 (developer.twitter.com/en/docs/tweets/search/overview/premium) 用于第七章,以及 Open Bank Project (uk.openbankproject.com/) 用于第八章。

下载示例代码文件

您可以从www.packt.com账户中下载本书的示例代码文件。如果您在其他地方购买了本书,您可以访问www.packt.com/support,注册后我们会直接通过邮件发送文件给您。

您可以按照以下步骤下载代码文件:

  1. 登录或注册www.packt.com

  2. 选择“支持”标签。

  3. 点击代码下载与勘误表。

  4. 在搜索框中输入书名并按照屏幕上的指示操作。

下载文件后,请确保使用最新版本的工具解压或提取文件夹:

  • Windows 平台的 WinRAR/7-Zip

  • Mac 平台的 Zipeg/iZip/UnRarX

  • Linux 平台的 7-Zip/PeaZip

本书的代码包也托管在 GitHub 上,地址是github.com/PacktPublishing/Hands-On-Artificial-Intelligence-for-Banking。如果代码有更新,它将更新至现有的 GitHub 仓库。

我们还提供来自丰富书籍和视频目录的其他代码包,您可以在github.com/PacktPublishing/查看它们!

下载彩色图像

我们还提供了一份 PDF 文件,包含本书中使用的截图/图表的彩色图像。您可以在此下载:static.packt-cdn.com/downloads/9781788830782_ColorImages.pdf

使用的约定

本书中使用了多种文本约定。

CodeInText:表示文本中的代码词汇、数据库表名、文件夹名、文件名、文件扩展名、路径名、虚拟 URL、用户输入和 Twitter 账号。示例:“该函数将从 Quandl 的SHARADAR数据库下载给定股票代码的价格数据。”

代码块如下所示:

#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 可以了解您对我们产品的看法,作者也能看到您对其书籍的反馈。谢谢!

欲了解更多有关 Packt 的信息,请访问packt.com

第一部分:金融行业中 AI 的简要回顾

本节提供了银行业的整体经济和金融概述——这在 IT 编程书中是很少见的。它旨在让技术人员和商业专业人士都能了解两方面的内容。

本节包括以下章节:

  • 第一章,AI 在金融中的重要性

第一章:人工智能在银行业中的重要性

人工智能,通常被称为AI,是一项非常强大的技术。精心实施 AI 可以在自动化业务功能方面创造奇迹。AI 具有通过应用改变各种行业的能力。随着计算机系统的不断发展,它们变得非常强大。因此,机器也变得非常强大,并且能够轻松地执行许多复杂的任务。例如,光学字符识别OCR)是一项即使是个人计算机也能在软件的帮助下轻松完成的任务。然而,OCR 需要智能才能将图像中的点转化为字符。因此,在理想情况下,OCR 将被视为 AI 的一个领域。然而,正因为机器的强大,我们往往不将其视为 AI 的应用。

在本章中,我们的重点是理解什么是 AI 及其在银行业中的应用。银行业是一个极其多样化和复杂的行业。为了简化复杂的银行业务功能,银行业需要不断提供先进的技术解决方案。正如福布斯最近的分析所示(www.forbes.com/sites/forbestechcouncil/2018/12/05/how-artificial-intelligence-is-helping-financial-institutions/#2e989fae460a),AI 在各种银行流程中的实施将在 2030 年之前为行业节省超过 1 万亿美元。因此,银行业将在不久的将来从 AI 系统中受益最大。

我们将从 AI 和银行业作为一个行业的简要介绍开始。在这里,我们将定义如何在软件系统中实施 AI 的方法。我们还将了解银行业如何从 AI 的应用中受益。完成本章之前,还有许多其他主题需要讨论。因此,不如直接跳入内容,而不是简单地讨论你可以从本章中期待什么!

本章将重点讨论以下主题:

  • 什么是 AI?

  • 了解银行业

  • 便捷银行服务的重要性

  • AI 在银行业中的应用

什么是 AI?

AI,也称为机器智能,是关于创造能够展示通常由人类表现的自然智能的机器。约翰·麦卡锡在 1955 年创造了人工智能这一术语。

AI 已经经历了两次寒冬:一次是在 1970 年代,随着国防高级研究计划局DARPA)(www.darpa.mil/),当时被称为ARPA,减少了资金支持;另一次是主要 IT 公司如德州仪器(www.ti.com/)和施乐(www.xerox.com/)放弃了专家系统的应用。

从某种程度上来说,人工智能有助于将决策过程从人类转移到机器上,这基于预定义的规则。在计算机科学领域,人工智能也被定义为智能代理的研究。智能代理是任何能够从环境中学习并根据所学做出决策以最大化实现其预定目标概率的设备。

人工智能能够解决广泛的各种问题。这些问题包括但不限于简单的数学难题、从一个地点到另一个地点的最佳路线、理解人类语言,以及处理大量的研究数据以生成有意义的报告。以下是系统必须具备的一些能力以及每项能力的简要描述:

  • 推理:解决难题和进行基于逻辑的推断的能力

  • 知识表示:处理研究人员和专家收集的知识的能力

  • 规划:设定目标并定义成功实现目标的方式的能力

  • 学习:通过经验来改进算法的能力

  • 自然语言处理NLP):理解人类语言的能力

  • 感知:利用传感器和设备,如摄像头、麦克风等,获取足够的信息来理解和解释环境中的不同特征的能力

  • 运动:移动的能力

机器是如何学习的?

让我们快速了解一下机器学习的基础知识。机器可以使用三种方法来进行学习:监督学习、无监督学习和强化学习,具体如下所示:

  • 监督学习基于挖掘有标签的训练数据的概念。训练数据表示为由提供的输入(也称为特征向量—这是一个数字向量,可以将输入数据作为特征用数字表示)和预期的输出数据(也称为标签)组成的一对。每对数据都会附上一个标签。下图展示了监督学习方法:

  • 无监督学习基于一种情况,即训练数据在没有任何数据背后信息的情况下提供,这意味着训练数据没有标签。无监督学习算法将尝试为这些训练数据找到隐藏的意义。下图展示了无监督学习方法:

  • 强化学习是一种没有训练数据的机器学习技术。这种方法基于两样东西——一个代理和给予该代理的奖励。代理预计会根据其经验获得奖励。下图展示了强化学习方法:

实施 AI 的软硬件要求

开源运动(将在可及银行业务的重要性部分讨论)推动了软件开发。该运动与硬件的改进(例如,GPU、CPU、存储和网络硬件)相伴而行。同时,也得到了无数英雄的支持,他们致力于改善硬件性能和互联网连接性。这些技术人员已经将 AI 算法开发到能够接近人类性能的程度。

以下图表展示了每当我们实施软件进行机器学习项目时应考虑的典型技术栈:

以下表格细分了贡献于前述图表中不同软件组件的几项关键技术:

序号 组件 软件/包名称 软件/包描述
1 用户界面/应用程序编程接口 API/Python API:应用程序编程接口是一种接口,允许程序通过互联网协议与其他程序进行交互。与 UI 相比,API 是为机器人设计的。它将用于从本书的各个编程章节中的数据源提取数据,在这些章节中,我们将为开放银行项目创建消费者银行服务。
2 机器学习与分析 TensorFlow, scikit-learn, 和 ImageNet 谷歌的 TensorFlow (www.tensorflow.org/) 自 2017 年起成为深度学习领域最受欢迎的框架之一。Scikit-learn (scikit-learn.org/stable/) 是一个方便的机器学习包,提供了许多有用的功能,用于机器学习管道中。TensorFlow 和 Keras (keras.io/) 将在我们处理深度神经网络时使用,而在处理较为简单的网络和数据准备工作时,我们将使用 scikit-learn。这些库将在全书中使用,从第二章到第九章,用于构建机器学习模型。ImageNet (www.image-net.org/) 由普林斯顿大学于 2009 年创建,旨在帮助研究人员基于数据集测试和构建深度学习模型,从而推动了基于深度学习网络的图像识别研究。我们将在第六章中将图像识别网络转化为识别股票趋势的模型,使用特雷诺尔·布莱克模型和 ResNet 进行自动化投资组合管理
3 数据结构 Pandas 和 NumPy Pandas (pandas.pydata.org/)和 NumPy (www.numpy.org/)是允许 Python 操作数据的数据结构。它们在本书的编码示例中被广泛使用。这些库是 Python 在数据科学家中流行的关键原因之一。这些库在第二章到第九章中都有使用。
4 3D 加速 Nvidia 如果在 TensorFlow 的后端使用 3D 加速(如 Nvidia 提供的软件和硬件(www.nvidia.com/en-us/)),那么与 Keras 相关的计算性能,例如在第三章中找到的编码,使用特征和强化学习自动化银行决策,将会得到增强。驱动程序将有助于提高 GPU 性能的某些元素。
5 操作系统 Ubuntu 这是一个免费的开源操作系统,兼容我们在本书中将使用的大多数 Python 库。可以说,它是 AI 社区的首选操作系统。
6 编程语言和开发环境 Python 和 IDLE Python 编程是 AI 的语言。Python 的诞生得益于 1999 年 DARPA 的资助,旨在提供一种通用的、易于阅读的编程语言。它是开源的。IDLE 是 Python 包中的一个开发环境,它允许编写、调试和运行程序。然而,开发者可以使用更多的环境来编写代码,例如 Jupyter Notebook、Spyder 等。我们将使用 Python 和集成开发与学习环境IDLE)来简化代码开发(你可以在docs.python.org/3/library/idle.html找到它们)。
7 版本控制 GitHub GitHub 是最受欢迎的基于云的协作网站之一。它的实现得益于云技术的普及,这些技术使得可扩展的计算和存储成为可能。我们的代码库将在这里存储和交换。

在我们简要介绍了将贯穿本书的工具、技术和包之后,接下来我们将探索 AI 的一个重要领域——深度学习。以下部分将详细解释深度学习和神经网络。

神经网络与深度学习

除了开源运动之外,神经网络的研究突破对改进 AI 算法的决策准确性起到了重要作用。你可以参考Deep Learningwww.deeplearningbook.org/)由 Ian Goodfellow、Yoshua Benjio 和 Aaron Courville 提供更为数学化和正式的介绍,以及Deep Learning with Keraswww.packtpub.com/big-data-and-business-intelligence/deep-learning-keras?utm_source=github&utm_medium=repository&utm_campaign=9781787128422)由 Antonio Gulli 和 Sujit Pal 提供开发人员简洁分析。

深度学习是机器学习的一个特殊子领域或分支。深度学习方法灵感来自于一种模仿人脑的计算机系统,称为神经网络

银行通过移动或网络应用程序聊天机器人进行在线客户支持是深度学习在银行业中的一个很好的例子。这些应用程序(即聊天机器人)在理解客户请求、偏好和兴趣的上下文方面非常强大。聊天机器人连接到与数据存储交互的后端应用程序。根据客户的输入或服务选择,聊天机器人向客户呈现各种可选的子服务。

聊天机器人或深度学习应用程序工作在层次结构中。它可以类比学习语言。例如,一旦一个人通过严格学习如何唯一地识别每个字母来掌握字母表,他们就有资格进入下一层复杂性——单词。这个人将开始学习小词和长词。掌握了单词后,这个人将开始组成句子,理解不同层次复杂性的语法概念。一旦他们达到这个层次结构的顶部,这个人就能掌握这门语言了。

你可能已经注意到,在每个阶段或层次的层次结构中,学习变得更加复杂。每一层都是基于从前一层复杂性中获得的学习或知识构建的。这就是深度学习的工作方式。程序不断学习,基于从前一层接收到的知识形成更多复杂层次的新知识。分层复杂性正是"深度"一词的来源。深度学习是一种无监督学习,因此比监督学习快得多。

深度学习的主要影响在于,模型的性能更好,因为它可以容纳更复杂的推理。我们希望金融决策能够准确执行。这意味着在平衡银行客户利益的同时,更有效地给股东合理的回报。

我们期望智能机器做到的事情就像输入处理输出一样简单,如下图所示:

在大多数金融应用场景中,我们部署的是监督学习,这类似于训练动物的过程——在这里,你为正确的结果提供奖励,并对错误的结果进行惩罚。这就是为什么我们需要有结果(即目标变量)来进行训练的原因。

实现 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 方法有多个阶段。我们可以如下详细解释它们:

  1. 商业理解:这一阶段涉及定义项目的商业目标。在这一阶段,你需要澄清与核心商业目标相关的问题。例如,一个核心商业目标可能是预测客户何时离开某个特定网站,使用客户与该网站互动的历史数据。需要澄清的相关问题可能是当前的支付界面是否是客户离开网站的原因。商业成功标准也会在项目执行的这一阶段被明确。

  2. 数据理解:这一阶段涉及理解在数据库或数据存储中挖掘的历史数据。数据会根据其大小、格式、数量、记录数、与商业相关的重要性、字段、数据来源等方面进行分析。

  3. 数据准备:这一阶段涉及将数据的质量提升到机器学习算法所需的处理水平。数据准备的例子包括将数据格式化为所需的格式,将数字四舍五入到可接受的精度,以及准备派生属性。

  4. 建模:这一阶段涉及选择要应用的建模技术或算法。建模算法用于找到一个函数,当输入应用时,能够生成期望的输出。

  5. 评估:这一阶段涉及评估在前一阶段构建的训练模型的准确性。根据需要对模型进行修正,以提高效率和准确性。

  6. 部署:这一阶段涉及定义训练模型在实际环境中针对新数据进行部署的策略。模型会被监控以确保其准确性。

在大致介绍了什么是人工智能、机器如何学习以及人工智能实现的方法之后,现在是时候将银行业作为一个行业来审视了。在接下来的部分,我们将探讨银行业的不同类型以及该行业所面临的挑战。

了解银行业

银行业被定义为一个专注于通过特定方法持有某些类型的金融资产的经济部门,这些方法可以使这些资产在一段时间内财务增长。银行业由政府或类似机构所施加的规则进行监管。

著名作家和金融顾问斯蒂芬·瓦尔德兹在他的著作《全球金融市场导论》中描述了全球金融市场中的不同类型的银行业务(请访问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 日发布的心理学研究论文《思考,快与慢》中所述。因此,没有计算机的帮助,做出概率决策是非常具有挑战性的。

人工智能在银行业的应用

根据麦肯锡全球研究院的报告(www.mckinsey.com/~/media/mckinsey/industries/advanced%20electronics/our%20insights/how%20artificial%20intelligence%20can%20deliver%20real%20value%20to%20companies/mgi-artificial-intelligence-discussion-paper.ashx),13 个行业中,金融服务排名第三,其后依次是高科技、电信以及汽车和组装行业。

由于麦肯锡报告未提及银行业的应用案例,经过一些研究后,我们或许可以看看人工智能在以下四种方式中创造价值,如下表所示:

  • 项目:预测和预期需求,优化采购,减少库存(资本)。

  • 生产:以更低的成本或更高的质量提供服务。

  • 促销:为合适的客户在合适的时间提供合适价格和合适信息的优惠。

  • 提供:丰富、个性化且便捷的用户体验。

让我们来看看每个金融参与者如何将人工智能应用于以下几个方面,如下表所示:

参与者 项目:更好的预测 生产:更低的处理成本 促销:个性化优惠 提供:便捷性
商业银行 优化资金需求。 通过人工智能,贸易融资处理可以自动化,从而提高效率。 人工智能可以提供实时的进出口融资报价,随着货物流转到不同的利益相关者,不同的风险类型和等级也能得到体现。 使用自然语言处理(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 假设存在一个可以描述的平稳趋势。自回归项pd各自在其方式上都是重要的:

  • p意味着影响当前周期值的过去周期数(例如,p = 1:当前周期的Y = 当前周期的Y - 1 周期 * 系数 + 常数*)。

  • 非季节性差分(d)是指过去几个周期的变化对当前周期值的影响(例如,d = 1:当前的Y与上一个周期的Y之间的差异)。

  • 滞后项(q)是指过去周期的预测误差对当前周期值的影响。

考虑一个例子,其中q = 1Y受到t - 1周期的误差影响——这里,误差是指实际值与预测值之间的差异。

简而言之,ARIMA 指定了前一时期的系数、常数、误差项,甚至是预测值如何影响当前的预测值。听起来有点吓人,但事实上它是非常易于理解的。

在模型拟合后,它将被要求进行预测,并与实际的测试数据进行比较。预测与测试数据之间的偏差将记录模型的准确性。在本章中,我们将使用一种叫做均方误差MSE)的度量标准来确定模型对数据的拟合度。

介绍神经网络——精准预测需求的秘密武器

我们可能有一个很好的数据源,但我们不应忘记我们还需要一个智能算法。你可能已经读过成千上万次关于神经网络的文章,但在我们在本书中广泛使用它们之前,让我们先来看一个简短的解释。神经网络是计算机模仿我们大脑工作方式的一种尝试——它通过不同的计算点/神经元连接来工作,且这些连接有不同的设置。

从架构上看,它像是公式的层次结构。你们中间阅读本书的读者可能有一定的代数基础,可以看到所关心的结果 Y 是如何与变量 X 相关联的,其中 b 是系数,c 是常数项:

Y 是我们希望在左侧预测的内容;在右侧,bX + c 是描述特征(X)与 Y 之间关系的形式。换句话说,Y 是输出,而 X 是输入。神经网络描述了输入与输出之间的关系。

假设 Z 是我们想要预测的内容:

看起来这些公式是相互关联的:

这是神经网络最简单的形式,包含一个输入层、一个隐藏层和一个输出层。每一层都有一个神经元(点)。

我鼓励你阅读关于机器学习的研究论文和入门教材,甚至可以报名参加在线课程。来自 Packt 的有用资源包括 Sebastian Raschka 和 Vahid Mirjalili 的《Python 机器学习》www.packtpub.com/big-data-and-business-intelligence/python-machine-learning-second-edition)和 Rowel Atienza 的《深度学习进阶与 Keras》www.packtpub.com/big-data-and-business-intelligence/advanced-deep-learning-keras)*。

反向传播

神经网络中还有其他概念,比如反向传播。它指的是一个反馈机制,用来微调神经网络的参数,这些参数大多数是在网络内连接神经元(除非它是层中的常数参数)。它通过比较输出层 Z(预测值)与 Z 的实际值(实际值)来工作。实际值与预测值之间的差距越大,就越需要调整 bcde

理解如何衡量误差也是一个重要的知识点——这就是所谓的度量,将在第三章中讨论,使用特征和强化学习来自动化银行融资

神经网络架构

架构关注的是每一层的神经元层数和数量,以及神经元在神经网络中的互联方式。输入层表示为特征。输出层可以是一个单一的数字或一系列数字(称为向量),生成从 0 到 1 的数字或一个连续值——取决于问题领域。

例如,为了理解神经网络的结构,我们可以预测它看起来像下面这个来自 TensorFlow Playground 的截图(playground.tensorflow.org/),这是另一个具有相同隐藏层——三个层,每个层大小为 6——的网络的可视化。

使用 epoch 进行神经网络训练

除了神经网络的设计外,我们还利用了epoch参数,它表示相同数据集被输入神经网络的次数。

如果我们没有足够的数据来满足神经网络中的参数数量,我们需要增加 epoch 的数量。假设我们在神经网络中有X个参数,我们至少需要X个数据点输入到网络中。不幸的是,如果我们的数据点只有X/2,我们需要将epoch设置为 2,以确保我们可以将X个数据点(所有数据点都会被输入两次)喂入网络。

缩放

在将特征输入机器学习模型之前,我们将对不同数量级的输入特征进行归一化,使其具有相同的数量级。例如,商品的价格和体积是不同类型的数值数据。缩放过程将确保它们都被缩放到相同的范围,从 0 到 1。在经典的统计建模过程中,这一步非常重要,以避免某些具有更大尺度的特征主导对预测的影响。

采样

除了数据列级的缩放外,我们还需要注意模型的采样偏差。通常,我们会保留一部分机器在训练和学习另一组数据时看不见的数据——这被称为训练集。稍后,测试集(即保留的数据集)将用于与模型所做的预测进行对比。

使用时间序列分析进行需求预测

在本节中,我们将首先看一个预测电力消费需求的例子,并使用时间序列分析预测能源费用。我们将从简要的问题陈述开始,并定义解决问题的步骤。这将帮助你更好地理解如何使用时间序列分析找到问题的解决方案。

今天,电力或能源是我们所有人的基本需求。我们使用电力并支付电费。现在,作为消费者,我们希望分析电力消费,预测未来的消费并预测能源费用。这就是我们在本节中要解决的问题。

时间序列分析是解决类似于前面问题描述中的问题的最佳方法。机器学习模型需要大量数据集供其处理,以便得出实际解决方案。这些大数据集被机器学习模型用来推导出模式,或者识别出散布的数据中可能无法看到的模式。同样,我们的第一步是获取大量数据并对其进行处理,以提取有意义的信息。这将是一个三步过程。以下是我们将遵循的步骤:

  1. 下载数据

  2. 数据预处理

  3. 模型拟合数据

下载数据

从下载有关电力消费和能源费用的数据开始。尽管我们现在可以从公共网站下载数据,但在实际的生产环境中,通常需要从内部数据库下载数据,并以平面文件的形式将其传递给用户(即没有数据库结构的文本文件)。

您可以从以下路径下载文件:

获取数据的方式有很多种,例如使用 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 模型的步骤:

  1. 对于汇总文件中的每个数据文件/字段,我们运行 步骤 3步骤 4(这在代码文件中的下一个代码块已经标明)。

  2. 如果布尔变量 parameter_op 设置为 True,则我们将运行 步骤 5(该步骤也已标明)。这将探索 ARIMA 中 pdq 参数的所有可能组合,具体设置如下:

  • p:范围从 0 到 12

  • d:范围从 0 到 2

  • q:范围从 0 到 3

  1. 对于前述任何组合的值,我们会计算数据与实际模式的拟合度,并测量误差值。选择误差值最小的组合作为 ARIMA 模型的选定参数。

以下是用于微调参数的代码片段(请参阅 GitHub 上的完整代码文件: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 交互)。以下是执行数据库操作的步骤:

  1. 创建 SQLite 数据库。

  2. 将数据导入为暂存表。

  3. 创建所需的表(一次性操作)。

  4. 将暂存表插入实际表,并进行数据类型和格式转换。

  5. 创建执行特征工程的视图。

  6. 将预处理后的视图输出为 CSV 数据。

导入库并定义变量

导入库并定义变量,以确保可以使用相关函数。导入所有相关库:

  • pandas:这是在数据输入机器学习模块之前用于数据存储的库。

  • keras:这是一个易于使用的机器学习框架,具有另一个库。

  • tensorflow:这被用作后台。

  • sklearn:这是一个非常流行的机器学习模块,提供了许多数据预处理工具集以及一些易于使用的机器学习模型。由于我们希望为后续更广泛的机器学习模型应用打下基础,因此本示例中没有使用模型。此外,sklearn 还有评估模型性能的度量标准。

  • matplotlib:这是默认的数据可视化工具。

以下代码块是导入所有列出库的代码:

'''*************************************
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)之前,了解银行业务及其运作方式是必要的。

拆解银行的功能

在银行内部,作为资金过剩者(存款人)和资金需求者(借款人)之间的中介,有两个重要问题需要回答:

  • 借款人的风险有多大?

  • 资金成本是什么?

这些是我们在查看支持业务运营所需的利润之前,需要考虑的两个重要问题,以覆盖其运行成本。

当这些决策没有正确做出时,会威胁到银行的生存能力。在这种情况下,可能会有两种结果:

  • 如果银行在发生风险事件时无法赚取足够的利润来覆盖风险和运营成本,银行可能会倒闭。

  • 如果银行未能满足存款人的要求或未能履行借款人贷款协议,就会损害银行的信誉,从而导致潜在客户流失。

主要风险类型

为了回答“借款人有多大风险?”的问题,我们首先需要了解影响风险的因素。

风险是指未来对银行运作产生不利影响的结果。对于银行而言,主要的风险因素包括以下内容:

  • 信用风险:这种风险涉及借款人在借款交易中无法按时偿还资本的问题;例如,借款公司面临财务困境,导致无法偿还贷款。

  • 市场风险:这种风险涉及金融市场中不利的价格变动,例如银行筹资来源市场的利率上升。

  • 操作风险:这种风险涉及银行作为组织在运营过程中发生的事件。这可能包括内部盗窃、网络攻击等。

有关风险类型的完整列表,请参考 BIS 的《巴塞尔框架》(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(data.world),提供了不同公司破产预测的数据。该链接中的数据来自于新兴市场信息服务EMIS)。EMIS 数据库包含了关于全球新兴市场的信息。

EMIS 分析了 2000 年至 2012 年期间的破产公司和 2007 年至 2013 年期间的运营公司。在数据收集后,基于预测期对数据进行了五类分类。第一类是包含预测期内财务数据的年份数据。另一类标签显示 5 年后破产状态的预测。

获取数据

我们将使用一个开源程序进行数据转换,然后使用另一个程序基于下载的数据训练模型:

  1. 我们首先获得从新数据源下载的数据。然而,这些数据是通过浏览器下载的,而不是通过数据流获取的。以.arff结尾的文件将从 data.world 获得。其网址为data.world/uci/polish-companies-bankruptcy-data。通常,我们可以使用 1 年的破产数据,因为模型预测的是 1 年内的破产情况。为了举例说明,我们将使用一个包含 5 年数据的数据集。

  2. 然后,我们将对数据进行预处理,并通过提取、转换和加载进行特征工程。在这种情况下,从 data.world 下载的文件为.arff文件格式,Python 无法直接读取。用于转换文件格式的代码可以在 GitHub 上找到(github.com/jeffreynghm/AIFinance_Packt)。

构建模型

在这个示例中,我们将尝试三种模型:逻辑回归、决策树和神经网络。

在计算能力尚未普及之前,通常会根据我们试图解决的问题以及机器需要提供的答案来选择模型。然而,如今,我们倾向于尝试所有可能的模型,并选择性能最佳的模型。

在这种情况下,我们可以将其标记为我们想要预测的内容。我们希望预测的目标行为是公司违约——在机器学习领域,这称为目标变量。我们将通过使用常见的评估指标,比较不同模型的性能,来评估模型在给定输入数据时预测目标变量的准确性。

在本示例中,我们将需要以下库:

  • os:用于文件路径操作。

  • re:用于匹配列头的正则表达式。

  • pandas:用于保存数据的 DataFrame。

  • matplotlib.pyplot:用于绘制模型结果,展示其准确性。

  • seaborn:一个美观的数据分析可视化工具。

  • sklearn:一个机器学习库,包含强大的数据准备功能,用于拆分、训练和测试数据集、重新缩放数据值以供神经网络使用、处理缺失值或异常值等。

  • pickle:用于保存机器学习过程生成的模型的文件格式。

  • graphviz:用于可视化决策树。

步骤如下:

  1. 使用以下代码导入所有相关库:
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

对于逻辑回归,决定选择哪些特征时,我们将依赖于测试不同特征的准确性。提供最高准确性的组合将被选中。

  1. 定义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
...
  1. 除了逻辑回归模型外,我们还将构建一个决策树。特征选择将在训练时由算法执行。因此,与逻辑回归模型不同,我们不需要限制作为输入提供给训练过程的特征数量:
'''
## 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
    ...
  1. 最后,我们将在模型中加入一个神经网络。它与决策树类似。特征选择将在训练时由算法执行。然而,进行超参数调优时,执行网格搜索是很重要的。我们正在寻找的超参数属于神经网络的架构,即我们需要构建多少层以实现最佳性能。以下代码用于训练逻辑回归模型:
##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)
    ...

对于本章中列出的所有模型,我们还需要衡量其准确性。我们将使用两种不同的方法来衡量准确性。在这个分类问题中,使用了各种度量指标。然而,当构建一个机器学习模型来判断一家公司是否违约时,我们需要确保其准确性。

  1. 在定义了这些函数之后,我们使用以下代码示例来实际调用函数。所有三个模型将依次构建。结果将存储在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()
  1. 使用以下代码可视化每个模型的性能:
'''
#4 Visualize the result
'''
print('********************')
print('f1 of the models')
print(f1_list)
print('********************')
  1. 使用以下代码示例来可视化模型:
#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%的概率期望利息减少。然后,这一预期将与银行在特定到期日的报价进行比较。如果银行满足这一预期,那么存款将继续留存;否则,存款将在相同的到期期内离开银行。

关于利率预期如何变化,存款人使用了两种不同的变化方式:一种是完全线性的,另一种则是符合正态分布的。如果存款离开了银行,我们假设相同金额的存款将被存入另一家银行。因此,在另一家银行存款到期时,存款人会设定他们的预期,并评估是继续留在该银行还是返回原银行。

对于借款人,假设其行为与存款人相同,具有相同的日终应计活动。然而,在一天之内,贷款到期的借款人会重新考虑是否留下。这通过利率预期来表示,模拟的具体方法与存款人的相同——但不同之处在于,银行提供的贷款必须低于借款人预期的定价,借款人才能选择留下并进行再融资。

得出解决方案

以下是创建借款人和存款人以便银行每天结账的步骤:

  1. 首先,我们需要从贷款和存款列表中导入数据,以生成借款人和存款人的列表。在这一步中,从电子表格加载场景,以模拟不同天数的借款人和存款人。以下代码示例展示了生成借款人和存款人列表的函数定义:
##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. 在每次迭代的开始(除了营业的第一天),会提供市场定价,银行也需要提供定价。我们生成一定数量的模拟(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的银行也执行相同的操作。

市场定价基于蒙特卡洛模拟初始定价的输入随机化。根据市场定价,借款人和存款人通过参考市场定价以及归因倾向来设定他们的预期。在设定预期之后,生成两种存款定价和贷款定价网格的变化。

  1. 存款定价和贷款定价是通过两个神经网络和蒙特卡洛模拟生成的。神经网络决定了贷款和存款定价网格所需的网格移动。然而,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:
...

这样,环境就已创建。在这里,环境对象包含提供给定定价网格(贷款和存款)回报估计的神经网络模型,以及市场定价、到期的借款人和存款人等外部环境。

  1. 生成当天的定价网格:
##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
...

银行的定价模型基于机器学习模型。市场是基于随机化过程,参考我们硬编码的初始值。同时,将计算到期概况(今天到期的贷款和存款),并建立客户对定价的期望。这一期望基于市场定价以及由定义的辅助函数随机化的内部需求。

  1. 生成可能的定价列表,预测回报,并选择最佳定价。此步骤在强化学习领域中被称为行动。行动是向客户和市场同行报价的行为。根据上一步生成的定价,我们创建更多的变体(在我们的案例中是 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
     ...

使用环境对象的机器学习模型,我们可以预测每个变体的结果,并选择最佳变体,以最大化盈利性,满足存款的资金需求。

  1. 执行定价网格。收入和支出根据所选的定价网格生成,该网格在满足自筹资金平衡目标的同时,生成最大估计净利润。一旦选择了银行的定价网格,就会与到期的借款人和存款人一起执行。有些人会留在银行,有些人则会离开:
#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),包括存款和贷款网格定价;对于环境来说,将反馈实际的盈利性和自筹资金状态到回报模型。

实际的损益和自筹资金状态将作为反馈提供给environment对象和bank对象,以便更准确地预测回报和定价。

  1. 每次模拟后,结果会保存在输出文件中,我们可以监控强化学习的进展。在每次模拟结束时,会输出最后一天的快照结果。使用以下代码生成输出:
#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 电脑可能是资本支出)。以这种方式,任何影响损益表的因素都会影响股本和资产,这意味着我们作为净收入所赚取的东西将成为我们的净值和资产的一部分。对于公司来说,资本支出用于获取房地产和设备。

负债: 债务资本和银行贷款是借来的钱和资产。当我们借这些负债时,它们通常以现金形式出现,但我们会立即将这笔现金用于资本支出。债券持有人和借款人是为公司提供债务资本和银行贷款的人。公司有责任支付利息(现金)以奖励借款人/债券持有人,主要是每半年一次。债券利息也称为 票息。我们借的金额称为 本金。因此,在每种借款关系中,我们既有本金,也有利息。

首席财务官的目标: 对于不同类型的资本或资金,你可能会想知道公司到底是为了什么。它应该做什么?根据 Max Weber (sk.sagepub.com/books/writers-on-organizations)的说法,公司应通过组织公司内部的资源高效地提供经济价值。因此,成为首席财务官意味着我们正在组织财务资源,支持公司主要的经济活动,这可能是为 Duke Energy 生成能源或组织商品,使其到达超市的最终客户手中。

优化公司结构的最佳理论

最佳的资本结构是将融资渠道用于公司发展,同时通过适当的风险承受能力最大化投资者的投资价值,以最符合公司业务的方式。例如,当公司处于发展阶段且未来不确定时,最好使用“粘性”资本进行融资,即股权。等公司稳定后,通常会配合稳定的资金来源,即债券。

需要做出哪些决策?

作为长期战略 CFO,我们需要做出的决策是如何在股权和债务之间找到合适的平衡,以便为公司提供资金。在股权方面,我们需要考虑发行多少股票来吸引这些投资者,以及支付多少股息(定期回报投资者)。在债务方面,我们需要考虑多少负债、债务类型、债务货币、利率以及还款期限。

资本结构的财务理论

其中一个很好的资源是 Aswath Damodaran 的《应用公司财务》(Applied Corporate Finance)( www.wiley.com/en-us/Applied+Corporate+Finance%2C+4th+Edition-p-9781118808931)。一方面,公司识别一个投资项目(投资决策),另一方面,公司为项目安排资金(融资决策)。我们不是要确定投资哪个项目,而是如何为项目融资以实现它。

根据 Bradley、Jarrel 和 Kim 的研究(econpapers.repec.org/article/blajfinan/v_3a39_3ay_3a1984_3ai_3a3_3ap_3a857-78.htm),存在一种最佳的股权和负债(称为债务)资本结构,可以实现最低的整体融资成本。虽然 Damodaran 已经总结了很多原因,但我们主要关注的是如何利用人工智能帮助 CFO 确定一个可量化、可衡量的最佳资本结构。

作为数据科学家,我们关注两种选择的成本和收益,这两者将帮助我们找到最佳的资本结构。我们来看看:

为什么选择股权? 为什么选择债务?
1) 如果没有利润,则无需支付股息——对于投资的灵活性更大,尤其是像技术这种现金流不明确的领域。2) 单纯增加股本不会提高股本成本——这可以近似为我们支付的股息。然而,增加债务会增加公司破产的概率,因为有更多的义务偿还利息或本金。3) 在某些财务比率的特定细节上更具灵活性;例如,一些债券借款人会限制公司某些财务比率在特定范围内。 4) 支付给贷方的利息被视为费用,因此无需缴纳税款,而如果作为股息支付(给股东),则不计入费用,因此需要缴纳利润税。5) 现有股东可以保持公司控制权,而无需稀释所有权。
  • 第一点关于项目产生高于融资成本回报的确定性,可以通过回报的方差来近似。

  • 第二点和第三点可以用公式编码:对于第二点,一个公式可以指定债务的百分比(称为杠杆)在增加破产风险中的作用(信贷风险模型在上一章中有解释)。对于第三点,这只是一个可以获得的比率,即公司的税率。

  • 第四点和第五点可以通过设定一个固定的阈值来实现,限制公司可以筹集的最大股本。对于家族企业来说,股本的变化很少发生,除非家族发生变化(例如创始人去世)。

总要素生产率用于衡量项目价值

这实际上是我们在第二章中提出的问题,时间序列分析,当时我们使用时间序列分析来自动化客户采购,并试图理解如何预测每个月的需求。对于长期预测,我们可以使用 ARIMA 模型进行投影。然而,在预测一个项目在组织内的成功时,并没有明确的模型,因为它需要团队成员的数据、项目的执行情况以及项目的类型和产出,这本身属于管理学中一个独立的学科领域。

我们可以通过三种方式来实现这一点:

  • 通过借鉴市场洞察,我们可以假设如果一个项目没有风险,它通常会产生市场的资本回报——其下限接近无风险利率。当然,高风险项目的回报应该更高。

  • 总的来说,如果项目与过去相似,则项目回报的预期值应为项目投资回报的现值。它必须等于公司的股本回报。

  • 如果一定要有一个模型,可以借鉴宏观经济学文献,生产率由总要素生产率公式来衡量:

在这里,Y 是产出,A 是技术效率,K 是资本支出,L 是劳动力。资本消耗效率在融资、采购和资源获取方面的效率由 alpha 表示。劳动力技能由 beta 表示。让我们更详细地讨论这些:

  • A (技术效率): 技术效率可能是每花费一美元机器的全面处理能力提供的理想经济价值。

  • L (劳动力): 劳动力意味着每花费一美元产生的劳动力的理想经济价值。

  • K (资本): 投资于技术和劳动力的资本金额。

  • alpha (资本消耗效率): 这可以是花费在无货物利润上的实际经济价值,由中介获取并在过程中。

  • beta (劳动力技能): 正如《人力资源与组织行为》一书所述,成功的项目交付直接与个体成员的能力及其在团队中扮演的角色相关。这可以从越来越多的体育比赛结果预测中看出,这些预测可以预测每场比赛的成功概率。

宏观经济模型确实是许多微观行为的集合行为。关于宏观经济学的下一个前沿,数据科学家从已应用于个体公司或聚合微观行为的宏观经济模型中获取见解可能是有意义的。

如果我们要提供一个预测每个公司项目价值的模型,我们经常会从其他学科中发现一些见解,并且可以通过预测模型来量化它。拥有这些技术、投资金额和劳动力的特征可能是研究宏观经济的一个良好起点。

这样做可以预测项目的经济价值,这本身可以成为一个机器学习模型。在本章中,我们不会涉及这一点,因为我们希望专注于高层次的财务决策,但是金融的下一个前沿可以产生价值。

项目的现金流模式

除了项目的生产力/经济价值之外,我们还需要找出项目的精确现金流支付或收款。答案是从一个集中的信任存储库跟踪项目的所有事件。但等等:为了让所有方共享有关同一项目的信息,而不是拥有一个成为黑客中心的中央存储库,我们需要一个完全分散的地方;这就是区块链的理念。最佳的现金流模式预测来自于获取触发现金流活动的数据:无论是由签署进度确认的项目状态、根据付款条件确认销售协议、在仓库确认货物收到等。

实际上,在今天的世界中,大多数这些步骤仍然需要人工输入,因此更容易要求相关人员提供前瞻性的现金流预测。当然,如果所有这些活动都实现自动化,并由智能机器处理并编码到结构化数据库中,那么可靠地预测未来的现金流似乎是可能的。

即使我们将数据输入交给人类,财务中仍然要求人类提供三种情景——最优情景、现实情景和悲观情景——每种情景都有不同的发生概率。预期的预测结果将是这三种情景的预测结果。然而,考虑到极端预测的潜在问题,似乎更好让人类做出一个现实的预测,并为这些现金流事件在短期内发生的可能性分配一个概率。

再次强调,我们讨论的是大额支付。对于小额支付和多次支付,我们有以下几种方法:

  • 规则性现金流

  • 不规则/事件触发的现金流

规则性现金流 基于商业规则;例如,工资支付每周五进行。但为了预测下周的工资现金流,我们需要获取人力资源数据库,并查看每个员工的薪水。

对于日常业务而言,规则性现金流是基于采购支付和销售产生的支出,我们可以依赖在上一章中开发的模型。一旦我们预测了需求(销售),就可以可靠地估算所需的采购量及对应的支付延迟时间——因为我们知道企业买家会延迟支付供应商,以获取流动性。为了澄清这一点,以下是几种解释:

  • 在财务中,通过 Churchill N.C.和 Mullins, J.W. 2001 年《How Fast Can Your Company Afford to Grow?》中的公式可以计算销售增长所需的营运资金比率。(hbr.org/2001/05/how-fast-can-your-company-afford-to-grow

  • 延迟支付对于供应链来说可能不是最优选择,因为我们知道这种延迟支付会导致上游供应商进一步增加其短期融资需求,以资助商品生产。如果上游供应商规模较小,那么如果这些高风险/小规模供应商以更高的利率获得融资,实际上会增加供应链的整体生产成本。

不规则/事件触发的现金流: 通常由其他方或外部事件触发。处理这一情况的最佳方法是改善与客户或供应商的数据交换。

财务报表项目预测

在这一部分,我们将讨论如何预测财务项目。让我们来看看:

  • 销售: 如果你是经过金融培训的专业人士,那么最大的驱动因素——即收入——必须基于公司所提供的商品/服务的需求来预测。以杜克能源为例,预测电力市场基本上是观察各个细分市场的市场增长:工业、商业和家庭。这是与市场营销合作的最佳方式。

在工业和商业(B2B)市场中,最可靠的预测是观察客户的情况;最终,商业实体将必须创造一些商品和服务供最终消费者消费。对于工业和商业市场,我们可以从观察加利福尼亚州主要的工业活动及其潜在的电力消费开始。然后,我们可以进一步观察他们生产的是什么。

家庭的电力需求取决于家庭收入、人口、私人电动汽车以及最重要的天气情况——无论是厄尔尼诺现象还是其他天气预报,这些都是重要因素。尽管我们可以使用宏观经济数据(及其预报,例如天气预报)来预测我们的销售额,但并非总能为财务报表中的每一项财务数据找到预测指标。在这里,我们可以利用已知/可预测的项目来预测其他项,这应当具有经济和统计上的意义。

简而言之,预测销售的最佳方式是预测个人部门的销售活动。

  • 商品销售成本: 这与销售量相关。尽管我们知道这并非 1:1 的关系,但作为首席财务官,我们可以获取每月的内部成本和销售数据,并建立一个基于销售额来预测这些成本的模型。或者,我们可以利用需求量来预测采购量。至于杜克能源,单位成本也主要来源于商品市场;鉴于我们已经设定了关于何时购买的目标采购策略,并且单位成本的全球市场受资本市场的驱动,我们可以从市场中获得前瞻性的定价(即 CME Henry Hub 的 12 个月定价,www.cmegroup.com/trading/energy/natural-gas/natural-gas.html))。

对于从事实物商品行业的公司,如果没有将任何固定成本(如设备、机械等)分配到某项商品上,那么商品销售成本与销售额的比例接近 1:1。一个典型的例子是时尚行业,在这种情况下,商品销售成本应与销售额对齐。这些销售额与我们购买的商品成本成正比。

为了说明这一点,让我们对不同行业的商品销售成本与销售额进行小规模分析:

  • 运营费用,包括销售、一般管理和行政费用SG&A):根据会计准则和公司实践,一些公司并未单独列出折旧和摊销,这些并非与销售活动呈线性关系。从前面的表格来看,我们看到的趋势是,固定资产密集型行业(称为资本支出)的销售对销售成本的预测能力较低。另一方面,人力密集型且固定资产较少的行业,其销售成本更有可能随着可变成本比例的提高而发生变化。

AI 建模技术

在本节中,我们将探讨两种重要的建模技术,分别是线性优化线性回归模型。在上一章中,我们学习了深度学习、神经网络、决策树和强化学习。

线性优化

线性优化模型在供应链业务中经常使用,它通过改变一些变量同时考虑一些约束条件,来实现优化目标(即最大化利润或最小化成本)。在线性优化的情况下,我们也实现了类似于资本结构优化过程的结构。

这不是一个机器学习模型,因为我们不需要训练机器来学习任何模式。

线性回归模型

这通常被称为回归模型。它的作用是找出一些因素对结果的因果关系。结果必须是数值型的。在统计学中,一些因素指的是自变量,我们假设这些因素彼此独立,而结果则是因变量。结果依赖于自变量。

寻找最优资本结构

现在,我们可以开始分析应当在资本市场筹集多少股权和债务资本来支持需求(新项目和业务,或者通过更换旧的或过时的机械设备)和供应(通过利润产生)。我们对最优资本结构的预测是有时间限制的;也就是说,它涉及给定时期的最优组合,比如下一年。当然,我们也可以将其扩展到未来五年。用来预测商业表现的公式如下:

收入增长 * 固定资本需求 / 销售额

最优资本结构是能够以最低资金成本提供所需资本,从而在公司内创造价值的资本结构。

实施步骤

在本节中,我们将学习如何实现一个机器学习模型,该模型能够找到最低资金成本的最优资本结构。

下载数据并加载到模型中

在我们的示例中,我们从外部金融数据提供商 Quandl 下载数据。这些数据是季度数据。假设我们是公司的 CFO,我们可以获得实时的每日预测,以定期更新我们的资金策略——每周、每月和每季度更新。步骤如下:

  1. 在这里,我们将使用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
  1. 定义公司 API 密钥和股票代码:
tkr = 'DUK'
quandl.ApiConfig.api_key = '[API key from Quandl]'
  1. 下载纽约证券交易所指数值和股票代码,然后计算纽约证券交易所与股票的回报,以得出 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')
  1. 下载公司的财务数据,以预测并获取目标公司两年的财务数据。这些数据将输入到信用模型中:
'''*************************************
## 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')
  1. 下载公司的历史财务数据,以便估算驱动因素之间的参数:
'''*************************************
## 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中。优化结果是通过尝试资本结构中债务比例(%)范围来最小化加权平均资本成本(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

恭喜!我们已经通过优化找到了公司的最优资本结构。

使用宏观经济情境提供财务表现预测

首席财务官的一个关键工作是提供财务表现的预测。那么,人工智能将如何改变这一工作?我们将基于我们在财务领域的知识,帮助进行会计规则之间的财务预测,并加入我们时代的预测能力来提升它。

作为上市公司的首席财务官,我们的一个关键职责是为前瞻性的财务数据提供管理层和分析师指导。假设数据由作者手工制作,旨在模拟会计系统的样子。

在这一部分,我们将探讨如何预测公司的财务表现。

实施步骤

在这一部分,我们将学习如何使用宏观经济情境推导财务表现预测。步骤如下:

  1. 通过从 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

...
  1. 从 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")
  1. 计算推导表现所需的各种参数:
#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。这并不是因为数学错误,而是因为某些过程的整合可以带来更好的结果。所以,当两个实体(公司)合并时,成本将更低,或者收入会更高。

根据《傻瓜指南》(www.dummies.com/business/corporate-finance/mergers-and-acquisitions/steps-of-the-ma-process/),并购交易可以通过以下步骤进行总结:

  1. 联系目标公司

  2. 交换文件和定价

  3. 进行尽职调查

  4. 完成交易

  5. 执行交易后整合

接下来,我们将探讨人工智能在并购中的应用。

人工智能在并购中的应用

关于人工智能在银行业务中的应用,人工智能被用来识别正确的目标,并帮助量化交易后的协同效应定价。在现有的设置下,这两个步骤(第一步和最后一步)都不太可靠,因为目前没有太多科学依据。首先,银行家的时间非常昂贵,而任何潜在交易的成功率非常低(例如,90%)。客户(买方/卖方)会有动机最大化银行家的服务时间,即使交易可能无法达成。鉴于银行家的时间有限,而客户有最大化银行家时间的矛盾目标,无论他们是否真正打算完成交易,最佳的方法是找到并基于并购交易得出的实际经济效益。如果从根本上可行,就应更紧迫地宣布并推动投资银行家参与交易执行/公告。

这种建模方法实际上今天已经存在于信用风险建模中,正如我们在前面章节中提到的。根据财务数据,我们预测某一事件是否会发生的二元结果。在信用风险模型的情况下,可能在X年内发生破产;而在并购的情况下,基于财务数据,它可能是在X年内发生收购或剥离公告。我个人认为,如果能够如此估计破产概率,那么这些建模方法之间并没有什么区别。

其次,在量化交易后协同效应时,通常考虑的是成本效率、收入增长,或通过员工的知识转移实现更高的生产力:

  • 关于成本效率,我们可以轻松地运行销售分析,验证行业中的成本关系,以定量方式确认这是否是行业的实际行为,或者仅仅是供应商会接受合并公司支付较低款项的空想。

  • 关于收入协同效应,这是一项庞大的数据交换工作,只能通过适当的机器学习模型来完成。例如,如果协同效应是关于更好的市场准入(例如,买方竞争对手 A 收购同行业的竞争对手 B),那么竞争对手 A 的目标模型应在竞争对手 B 的客户数据库上运行,以推测可能产生的收入。这种情况也出现在联合数据库营销项目中,例如通过银行销售的保险(银保)。在这种情况下,保险公司提供模型,应用于银行的客户数据库。

  • 关于与人力资源协同相关的专业知识,我认为将人力资源分析应用于衡量和量化知识、技能水平、文化适应性以及团队表现是同样具有可行性的。在协同效应分析前期,需要对员工的硬性与软性素质进行衡量、预测和模拟。

为了实现这一点,我认为现有的并购银行家不会愿意做太多的改变,因为考虑到目前客户和员工的数字化程度尚未普及,完成这项任务所花费的时间会非常长。这意味着现有的功能和模型无法实现这一目标。但我确实相信我们应该致力于这一未来的并购模型,特别是现在我们正在构建并购的未来,并培养下一代人才。

与金融投资相比,并购在运营整合方面具有巨大的不确定性,这正是人工智能应当发挥价值的地方。已经有许多研究探讨了成功的并购交易中决定性因素,这些因素能够实现预期的协同效应;这些来自学术研究的发现或特征需要被收集并进行分析,以生成可量化的成功可能性,并在计算报价时进行定价。

上市公司报备义务

为了确保公开上市证券的投资者拥有公平的市场,交易所要求我们宣布诸如财务结果发布、重大影响证券估值的公司活动等事件。例如,您可以参考纽约证券交易所的 IPO 指南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%。

另一个关于聚类算法的关键问题是如何确定输入的特征数量。我们可能会因过度权重某些类型的财务比率(例如,使用两种不同的盈利能力比率,如股本回报率和资产回报率)而导致聚类偏差。解决方法是进行主成分分析,它通过将相似的特征合并为同一特征来去除冗余特征。

对于非金融/银行领域的示例,您可以参考 Suresh Kumar Gorakala 的《构建推荐引擎》www.packtpub.com/big-data-and-business-intelligence/building-practical-recommendation-engines-part-1-video)。

新发行自动配售

如果有问题,背后一定有投资者。传统的投资银行会雇佣一组专业人士,组成一个被称为联合配售台的团队,负责将证券问题分配给能够购买这些股票和债券的投资者。

如果我们考虑投资银行联合配售台的角色,我们的工作就是识别即将发布的新证券中的基石投资者,因为 CFO 在股权方面有资金需求。为此,我们将使用来自 SEC 备案的美国股票的机构持股数据,通过 Quandl/Sharadar 来帮助我们找到那些投资偏好相似的投资者,并将这些与同样持有类似股票的投资者匹配,如杜克能源。

关于卖给谁,我们将以美国股票的最大投资者作为我们的投资者群体。联合配售台的工作是将任何股票发行的主要仓位卖给这些投资者。通过使用无监督学习方法,我们将相关的股票推荐给合适的投资者作为首次公开发行(IPO)。这可以通过证券相似度(称为持仓相似度)和投资风格(称为投资者相似度)来实现。

解决问题

以下图表展示了解决当前问题所涉及的步骤:

我们将在接下来的章节中详细讲解每个步骤。

构建相似度模型

在这里,我们将构建两个相似度模型——一个是股票相似度模型,另一个是找出相似投资者的模型。两个模型都是聚类模型,属于最后一种机器学习方法——无监督学习。我们选择了 21 个财务比率来构建股票层级的聚类模型,而在投资者模型中,我们最多使用 60 个特征(六个市值规模 * 五个投资决策 * 两种指标类型):

  • 六个市值规模:纳米级、市值小型、市值中型、市值大型、市值超大、和巨型

  • 五个投资决策:两个买入决策(全新或部分),一个持有决策,两个卖出决策(全卖或部分卖)

  • 七个指标:季度回报(总回报、已实现、未实现)、新资金变化率的均值和标准差,以及当前市值

导入所有相关库,然后通过读取 CSV 文件加载股票代码的集合,并同时加载描述股票的规模字段。为了减少处理时间,加载投资者列表,而不是所有投资者。对于每个投资者,计算每个市场细分股票的方向(即,我们使用规模作为唯一的市场细分,实际上,我们应使用国家×行业×规模)。

构建投资者聚类模型

为了构建投资者聚类模型,遍历投资者并计算其变动和利润(已实现和未实现利润),如下所示:

  1. 导入所需的库和数据:
'''************************
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
  1. 准备投资者概况:
## 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)
    ...
  1. 准备聚类投资者,以及输出聚类和结果:
## 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%的变化。最后,输出聚类结果;即聚类结果、聚类模型和标准化器。

构建股票聚类模型

为了构建股票聚类模型,我们将加载数据,准备股票概况,聚类股票,并输出聚类结果:

  1. 加载行业、股票代码和函数,并导入库以及 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
...

...
  1. 使用sklearn来运行训练模型。使用pickle加载结果和模型。然后,下载股票代码的最新年度财务基本数据:
#define important functions
#download fundamental data of the ticker
def download_tkr(tkr):
    ...
  1. 定义所需的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():
    ...
  1. 然后,计算行业的聚类模型。行业中股票代码总数的一半应该是聚类的最大数量。聚类模型将在达到最大轮廓系数 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)
        ...
  1. 输出标准化器、聚类模型和聚类结果:
    '''*************************************
    2D. Output the clustering model and scaler for the industry
    '''    
    #Output clusters
    ...

通过采用我们在前一章中开发的财务预测方法,我们可以推导出财务报表,从而得出后续分类股票所需的财务比率。

在前一章我们查看的示例中,我们展示了发行债务和股本后资本结构的变化。但最初,我们并没有假设股价发生任何变化,比如市盈率,而仅假设盈利能力、规模等因素发生变化。

为了预测新股票的财务数据,执行以下步骤:

  1. 导入所有相关库并使用pickle加载结果和模型:
#import relevant libraries
import os
import pickle
import math
import numpy as np
import pandas as pd
import quandl

...
  1. 利用我们在上一章中构建的程序,并运行前面一节定义的财务预测。然后,计算预计上市公司财务的各项指标:
#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 有相似特征的股票感兴趣。

执行聚类的步骤如下:

  1. 查找与我们计划上市/联合发行的股票具有相似财务状况并且属于同一行业的股票。

  2. 根据我们找到的股票,我们找出这些股票的现有持有者。

  3. 我们查找持有我们检查过的股票的投资者列表;也就是说,选择的投资者。

  4. 我们找到所有投资者的聚类 ID。

  5. 给定选择的投资者,找出聚类及与该聚类 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. 导入所有必需的库并定义关键变量:
'''*************************************
#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]'
  1. 下载给定股票的财务数据(从前面的示例中提取),并定义您将用于训练决策树和神经网络的函数,包括网格搜索(所有这些都可以从第三章中获得,使用特征和强化学习自动化银行融资):
'''*************************************
#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):
...
  1. 筛选具有大量股票代码的行业,并运行通过行业及其相应股票代码来构建决策树和神经网络:
def filterIndustriesByTickets(ind):
  1. 按行业输出 ROC 曲线的结果:
def displayCurveChart(type, ind):
  1. 从文件中加载公司列表以及它们的行业,就像我们自动合作一样。选择至少有 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
  1. 逐个循环遍历所选行业,并加载公司的历史财务。对于每家公司,我们将加载 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表示。然后,我们将公司财务和事件结合在一起——我们将t-1年的财务与年度t的二进制事件指示符结合起来。我们将空事件转换为0。大部分这种逻辑是通过download_tkr(tkr)来准备财务和事件的。

  1. 将行业数据拆分以训练模型:
    #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 和并购的概念。基于你在本章中学到的数据技术,你应该能够建模领域需求。通过使用聚类模型技术,你现在可以创建高性能的人工智能系统。

在这之后,我们完成了一个练习,解决了新发行问题的自动联合发布问题。我们还看了一个示例,讲解了如何识别收购方和目标方。

在下一章,我们将重点讨论投资组合管理、资产管理,以及一些适用于投资组合管理领域的人工技巧。

第六章:使用特雷诺-布莱克模型和 ResNet 的自动化投资组合管理

在上一章中,我们介绍了投资银行的基本概念。我们还学习了并购M&A)和首次公开募股IPO)的概念。我们探讨了聚类模型,它是人工智能中的一种建模技术。我们查看了详细的步骤和例子,解决了自动化联合的问题。我们实现了一个示例,识别了收购方和目标方。因此,前两章主要针对投资银行证券方面的发行人。

本章将探讨投资者的动态。投资者以战略方式推动投资行为。股权或债务的发行可以通过两种方式进行——通过一级市场或二级市场。一级市场的角色是代表公司、政府或其他团体发行新证券,以通过债务或股权导向的证券获得融资。二级市场的角色是为有兴趣的各方提供买卖已发行证券的便利。投资组合经理的角色是根据证券的价格波动做出更智能的决策,以增加客户的利润。投资组合经理试图了解投资者的需求,并将资金投入那些能够产生最大回报的投资。

本章将涵盖以下主题:

  • 金融概念

  • 马科维茨均值方差模型

  • 特雷诺-布莱克模型

  • 使用特雷诺-布莱克模型的投资组合构建

  • 趋势预测

金融概念

在本节中,我们将探索各种金融概念。若要深入了解该领域的知识,建议参考特许金融分析师CFA)的课程大纲。

资本资产定价模型中的 alpha 和 beta 回报

根据资本资产定价模型CAPM),投资回报等于risk-free rate + alpha + beta * 市场回报 + 噪声(噪声的均值为零)。Alpha 是公司或投资者优异表现所赚取的回报,而 beta 是资产相对于整体市场回报的风险性。投资风险较高时,beta 值较高,表明投资比市场平均风险更大。噪声是随机波动或运气,长期回报为零。

资产管理行业,尤其是专业的投资经理,通常根据 alpha 向客户收费。这也解释了人们为何如此关注 alpha。

已实现和未实现的投资回报

投资回报(收益)可以是已实现的或未实现的。已实现回报是实际获得并已收入囊中的回报。未实现回报是如果今天卖掉资产并以现金结算,我们本应获得的回报。

投资政策声明

投资行业的运作是代表资产所有者进行投资。作为资产管理者,我们的受托责任是为客户提供建议并代表其进行投资。到目前为止,在本书中,我们通过观察行为/交易数据来理解投资者的投资需求。然而,关键数据实际上是投资者将要制定的投资政策声明IPS)。

一份 IPS 包含投资者制定的回报目标、风险承受能力和约束条件。回报目标和风险承受能力都是可以量化定义的变量。回报可以定义为扣除通胀率后的净年回报率。如果目标回报率为 1%,通胀率为 1%,这意味着随着物价水平按通胀率增长,资本的价值保持不变。从长远来看,我们投入投资组合的购买力保持不变,因为其价值与物价水平同步增长。

这些变量可以用数学方式表示如下:

  • 回报目标:这个回报目标叫做资本保值。1%的回报率叫做名义回报率。从名义回报率中扣除通胀率之后,得到的叫做实际回报率:

  • 风险承受能力:风险承受能力可以定义为回报的波动性。我们通常这样定义它:

风险承受能力的选择是主观的——有些人喜欢伴随兴奋而来的起伏。而有些人则喜欢坐在沙发上阅读这本书(挺无聊的,是吧?),有些人则喜欢坐在桌子旁的椅子上阅读。有人喜欢在枯燥的 9 到 5 工作中稳定拿薪水,而另一些人则喜欢创业公司的刺激,抱有迅速致富的希望,同时承担失败的风险。

也就是说,无聊并不意味着被解雇的风险较低,而令人兴奋的工作并不意味着失业的风险较高。有些明显的情况是,我们可以拥有令人兴奋的工作、高潜力和稳定性。这正是通过这个资产配置过程所希望达到的目标结果。

鉴于本书涉及工作中的实际问题,关于更多细节,我推荐 CFA 协会的《Managing Investment Portfolio, A Dynamic Process》(www.wiley.com/en-us/Managing+Investment+Portfolios%3A+A+Dynamic+Process%2C+3rd+Edition-p-9780470080146)。我们在这里的目标是定义执行机器学习程序所需的参数。

在 AI 时代的挑战是如何将这个政策转化为机器能够理解的代码形式。实际上,投资界的任务是将投资政策数字化。

区块链的最新进展带来了智能合约,其基于某些声明可以作为逻辑进行数字化的假设。如果合同可以在区块链上作为智能合约进行编码并执行,那么为什么不可以是投资政策呢?假设在本章剩余部分中,投资政策被编码化。

资产类别

投资组合管理是根据资产类别或风险因素的特征,将资金分配到不同投资资产的过程。我们将从资产类别分配开始讲解。资产类别被定义为具有相似特征的资产组合。实际上,这听起来很像聚类模型的结果。

为了融入我们的金融知识,资产类别通常指的是股票、债券、货币市场和另类投资。另类投资可以细分为房地产、私人股本、对冲基金和商品。股票是指在公开交易市场上发行的股权,而债券是指公司发行的债务。货币市场是指期限在一天到一年之间的短期债务。它们不同于债券,因为货币市场具有高度流动性(市场交易活跃,定价公允),而债券市场则可能非常不流动,或者由某些投资者主导。债券通常指期限较长的债务,例如 10 年期或更长的到期债务。当然,它也可以包括任何超过 1 年的债务,通常称为票据

投资行业的参与者

投资者在金融行业中扮演着核心角色。然而,同样重要的是要了解其他主要参与者——投资经理(管理投资者资金的人)、被称为卖方的经纪人(通常是投资银行或证券公司),以及为投资者提供如何选择投资经理的专业建议的顾问和顾问公司。保管人指的是负责投资交易和与交易所市场的结算及行政事务的方。

如果投资经理来自机构,他们被称为机构投资者,而如果是个人自己操作,则被称为个人投资者。机构投资者对投资资金的受益所有者负有受托责任。这些受益者是投资经理的真正客户。例如,在杜克能源的案例中,最终的受益者可能是杜克能源的员工。在这其中,可能是管理基金的财务主管作为投资经理,也可能是外包的投资基金经理作为选定的投资经理。

在行业的销售方面,基金可以面向机构投资者、个人投资者,或通过银行或保险公司面向零售分销。在零售分销的情况下,确保投资符合所有者需求的责任在于分销商。虽然机构投资者或个人投资者是与投资经理直接接触的对象,但匹配的责任则由投资经理或顾问来承担。

基准 – 比较的基础线

基准被投资组合用来定义他们应该与之对比的市场平均回报。它可以指市场回报或 CAPM 中的 beta。任何高于平均水平的部分被称为alpha。在本章的示例中,我们假设全球股票交易型基金ETF)是市场基准。

如果我们要为全球资产中的投资者构建全球市场基准,我们可以通过分析创建这样一个指数,权重分配不同的指数或回报篮子。

投资者追求回报

国际结算银行的一项研究显示,投资者表现出追逐回报的行为。这意味着投资的一个关键原则是跟随市场(回报)。这也意味着,如果我们仅仅依赖回报来驱动我们的资产配置决策,我们将永远比市场慢。所以,在人工智能的世界里,可能有两种方式来提升:

  • 使用超快速的机器迅速跟随回报趋势

  • 比大众更好地预测市场

ETF 承诺做前者,前提是我们足够快速地将资金分配给 ETF——这反而违背了跟随市场的初衷,因为市场上有太多不同种类的 ETF。只有当我们投资于真正的市场代表时——例如,一个主要的市场指数 ETF——我们才能实现这一目标;否则,我们仍然会面临同样的挑战,即试图分配到正确的证券/投资,以产生 alpha(战胜市场)。

在大多数交易书籍中,作者会隐藏他们的获胜策略——这使得我们理解什么是策略变得困难。为了保持实际性,我们将从一个失败的策略开始,您可以在此基础上进行改进。这至少向您展示了从头到尾的策略开发过程,并给您一个全面的交易工作方式。

趋势跟随基金

在将资产配置给基金经理之后,我们来深入探讨所投资的基金。如果我们是 ETF,我们的一个关键需求是跟踪基础证券。例如,如果基金的任务是根据一组规则跟踪一篮子证券的表现,我们可以简单地购买并持有这些基础资产直到赎回(即投资者提取他们的钱)。

然而,如果我们尝试提前预测价格波动并据此采取行动,我们有可能获得超越基准的收益——这就是我们所说的阿尔法

使用技术分析作为生成阿尔法的手段

一种交易思维方式认为证券定价中展现出的趋势是非常重要的。这就是所谓的技术分析。它假设过去的定价走势可以预测未来的走势。以下图表展示了证券价格在某一时期内的趋势:

从一个非常高的层次来看,我们可以看到证券价格是按趋势波动的,但趋势的持续时间并非总是相同的。关于如何解读价格波动中的模式,已有大量研究。然而,这难道不是一个计算机视觉的挑战吗?与我们手动挑选无数特征不同,是否应该让计算机来读取图表并学习如何画出趋势线?

关于模式类型,一个好的起点是《金融市场的技术分析:交易方法与应用的综合指南》(纽约金融学院)。有关用于检测模式的精确数据处理的信息,请参考《机器学习进展》。在这里,Prado 博士通过在数据输入机器之前,给你提供深入的见解,将这一领域提升到了另一个层次。

交易决策 – 策略

交易策略是指在交易活动中需要考虑和采取的行动。因此,在本章中,我将展示一个在设计时失败的实际策略,而不是排除这些策略。对于真实的交易员来说,公开成功的交易策略会导致其失效,因为别人可以反其道而行之——例如,反向交易者可以在你预期买入时卖出,反之亦然。

我们在这里提出的简短策略,与使用相同资产的简单买入持有策略相比,并未产生正的阿尔法。然而,我会指出改进它的方法。

要了解更多关于交易员和银行家行为的比较,请参考《金融补偿专家》(《金融学杂志》)onlinelibrary.wiley.com/doi/abs/10.1111/jofi.12372

理解马克维茨均值-方差模型

投资组合管理的目标是通过最小化风险来确保目标回报,在这个过程中,我们根据特定投资者的目标回报和风险容忍度(从投资政策声明(IPS)和历史回报中获取)来进行决策。行业中常用的典型投资组合优化模型包括马克维茨均值-方差模型和特雷诺-布莱克模型。

一位名叫哈里·马克维茨(Harry Markowitz)的经济学家在 1952 年提出了均值-方差分析,这也被称为现代投资组合理论MPT)。由于这一理论,他获得了诺贝尔经济学奖。

均值-方差模型是一个用于组建资产组合的框架,以便在给定的风险水平下最大化回报。它是投资多样化的扩展。投资多样化是一种建议投资者应投资于不同类型金融资产的理念。与仅投资单一类型资产相比,投资多样化的风险较低。

投资者选择最大化回报的资产配置,这也被称为回报方差。在进行资产投资时,风险与回报的比率成为关键决策因素。风险与回报比率是预期回报与可能损失的比率。预期回报与实际回报之间的差异被称为风险。关键挑战是计算目标组合的回报方差。例如,它可能是 40%的股票和 60%的债券,或者是一个更复杂的资产类别配置,如房地产、商品等。要得出 40%股票和 60%债券的回报方差,我们首先需要分别计算股票和债券的回报方差。同时,我们还需要考虑股票和债券之间的协方差,即股票和债券的回报是如何同步或完全不同步的。

关于资产和财富管理行业如何发展的详细见解,请参考普华永道,2017 年,《资产管理 2020:回顾与展望,资产与财富管理见解》

想象一个团队中的每个人(每个人代表一个资产类别)共同完成一项任务,以提供回报。投资组合经理的工作是确定团队内每个人在组内的发言权大小(资产配置工作)。这取决于个人的生产力(回报)和表现波动性:有些人表现极端,而有些人在生产力(方差)方面相当稳定。我们还需要了解个人团队成员之间的互动——这种互动还必须考虑每个成员如何互补或增强彼此的生产力(相关性)。一些团队成员之间表现出强烈的化学反应,能够共同取得极好的结果(正相关),有些人则在一天的不同时间工作——一个是夜猫子,另一个是晨型人——他们各自有不同的工作时间(负相关),还有一些人没有任何一致的相似性或不相似性模式(零相关)。

下图展示了两个资产(i 和 j)之间的相关性矩阵。灰色的对角线表示证券的回报方差,剩余的单元格表示证券间的回报协方差。黑色单元格是多余的,因为它们与对角线对面的值是镜像关系。对于仅 20 个证券,我们将需要估算 190 个值:

为了进一步说明这个问题,假设证券20是非流动性的,我们无法可靠地估计它与另一证券的协方差。我们可能已经影响了与其他 19 个证券的协方差数据质量。在实际应用中,这个模型的问题如下:

  • 一些资产没有足够的数据点来计算它们与其他资产的相关性(例如,团队中新加入的成员)。

  • 在金融市场中,资产之间的相关性是动态变化的,且很难预测未来的相关性。

  • 相关性不是线性的。

该模型适用于具有高效定价和大量数据点的公共股权市场,但不适用于非流动性资产——例如初创公司的私人股本、发展中市场的证券或债券,这些资产的定价往往无法完全透明,且很多情况下需要通过分析重建。

风险中的一种特定类型的相关性是信用风险——在经济景气时,资产间的风险相关性较低;而在危机时,相关性飙升并朝着相同方向变化。有关违约相关性的示例,请参考 Duffie D. 和 Singleton, K.J.的《信用风险定价、衡量与管理》

一些成熟企业的财务主管负责管理自己的养老金资金。我们假设财务主管需要处理养老金基金的目标资产配置。我们将使用每个资产类别的指数回报数据。我们将使用 Quandl 提供的 ETF 订阅数据作为数据来源。

ETF 是指可以在公共交易所(如纽约证券交易所NYSE))买卖的基金。它是一种基金,因为它投资于更多的基础证券,如股票或债券。随着它允许投资者专注于基金所投资的主题,而不是单一股票,因此变得越来越受欢迎。例如,我们可以通过购买投资美国最大 500 只股票的基金,来对美国经济的强势做出明确判断。

探索特雷诺-布莱克模型

由于马克维茨均值-方差模型在处理多资产类别投资组合相关问题时的不稳定性,特雷诺-布莱克模型应运而生。特雷诺-布莱克模型适用于现代投资组合配置方法,其中某些投资组合是主动的,另一些则是被动的。这里的“被动”指的是一种跟随市场回报率的投资方式——目标不是超过市场平均回报,而是紧密跟随市场回报。

主动投资组合是指我们力求实现超过市场平均回报的投资组合。市场回报越低、市场风险水平越高,投资组合越大。然后,我们将总资本分配到一个主动投资组合中。那么,如果市场回报已经足够好,为什么还要承担更多的风险呢?Treynor-Black 模型旨在将更多的权重分配给那些能够在总风险/回报水平下提供更高回报/风险水平的资产。

介绍 ResNet——用于模式识别的卷积神经网络

应用计算机视觉类型的神经网络的特殊之处在于,我们可以使用以下隐藏层。在我们的例子中,我们将使用 Keras 实现的 ResNet 作为示例来说明这些概念。我们还将展示一种提高性能的方法——然而,您需要深入研究超参数调优。

卷积层就像是对输入图像的一个子集进行处理。在技术分析中,它就像使用滑动窗口来计算统计值。每种类型的滑动窗口都会被训练来检测某种模式,比如上升、下降和平坦的线条。在神经网络术语中,每种类型被称为过滤器。对于每种类型的过滤器,都会有多个窗口来完全运行(或滑动)整个输入图像;这个数字由层中的神经元数量表示。

为了说明术语,我们以一个大小为3 × 3的输入图像和一个2 × 2的卷积核形状为例。在编码示例中,我们的实际输入比这个大小要大。

输入图像是一个3 × 3的图像,图像中有一条从左下角到右上角斜着穿过的黑线(由 3 个像素表示)。它显示了股价每天上升 1 个像素:

滑动窗口的形状叫做卷积核。卷积核是一个函数,它可以将输入的矩阵/向量转换为另一种形式,如下图所示:

为了说明,我们假设卷积核大小为2 × 2步长 = 1,并且默认使用零填充,除非另有说明。

下图中的数字显示了卷积核移动的顺序。每次移动都会由卷积层中的一个神经元表示:

下图显示了2 × 2的卷积核,且卷积核移动了 4 次(即需要 4 个神经元):

  • 卷积核形状:当卷积核移动时(我们称之为滑动),它可能会覆盖相同的输入像素,也可能不会,这使得蓝色变得更深,我们想显示哪些像素被多次覆盖:

卷积核形状 = 2 × 2,它需要 4 次移动才能覆盖整个图像:

卷积核形状 = 1 × 1,它需要 9 次移动才能覆盖整个图像。

  • 步幅:这表示每次向右和向下移动多少像素:

这里,步幅 = 1,需要 4 步才能覆盖整个图像。注意,每次移动时,像素会有所重叠:

这里,步幅 = 2,需要 4 步才能覆盖整个图像。注意,每次移动时,滤波器覆盖的像素不会有任何重叠。

  • 填充:这表示输入图像周围有多少个白色像素:

以下图展示了零填充:

这里,填充 = 1,这允许边缘单元格被不同的神经元覆盖。

池化层

池化层的含义非常直白——它的作用是从输入中池化结果。想象一下,在卷积层之后,对于每种滤波器,都会有多个输出——例如四个。我们能否将这四个输出压缩为一个变量,而不是四个输出变量?池化可以起到压缩这些信息的作用。例如,可以取四个输出中的最大值(最大池化)或四个输出的平均值(平均池化)。从视觉角度来看,池化层的意义在于模糊图像或计算移动平均趋势。

ReLU 激活层

对于金融专业人士来说,整流线性单元ReLU)层就像一个看涨期权的支付结构——一旦超过某个阈值,输出值就会随着输入的增加线性变化。它的意义在于减少定价中的噪音,确保只考虑强烈的市场趋势。

Softmax

Softmax 是我们在本书早些章节中接触的逻辑回归模型的超级增强版,能够进行多个预测结果——例如,逻辑回归模型中的第一版二元结果。在我们的案例中,我们希望确定下一天的定价。

使用特雷诺-布莱克模型的投资组合构建

假设我们给定了 10 天的定价数据,技术分析的工作就是画出右侧的趋势线,以理解趋势并生成第 11 天的定价。很明显,这正是卷积神经网络可以处理的任务。

事实上,我们所看的时间单位可能是每 100 毫秒或每 10 毫秒,而不是 1 天,但原理是一样的:

继续以杜克能源为例。在这个假设的案例中,我们假设我们是杜克能源的财务主管,管理着一个资产总额为 150 亿美元的养老金计划,且该计划为固定缴款计划。假设我们知道我们的投资政策声明(IPS)是数字化格式:

  • 目标回报 = 实际回报的 5%(即扣除商品通货膨胀后的回报)

  • 风险 = 回报波动率为 10%

  • 约束条件:不包括电力公用事业公司,以避免投资其他同行/竞争者

请注意,这是一个假设性的示例。不会对实际公司做任何推断。

使用 IPS,我们将首先展示如何将资金分配到各个资产类别作为第一个示例。然后,在第二个示例中,我们将探讨趋势跟踪策略,以帮助投资经理跟随市场,鉴于当前被动投资的趋势。

解决方案

我们创建了两个独立的 Python 文件,因为资产参数应该独立于资产如何分配。这个过程有四个步骤,其中两个主要步骤(即文件)如下:

我们将下载并估计资产参数,并生成目标资产配置:

  1. 为了下载并估计资产参数,我们将导入库和关键变量值。然后,我们将定义函数以下载每个资产的数据、市场回报、无风险利率、资产回报以及其他参数。

  2. 为了生成目标资产配置,我们将导入库和关键变量值,找出证券在活跃投资组合中的权重,并找出活跃投资组合在总投资组合中的权重。

随着章节的推进,我们将通过这个示例尝试展示传统数据库的使用,而不是创建一个没有数据库存储的数据转储。这也符合我们之前提到的观点:结构化的数据库(SQL 数据库)非常适合证券定价数据,因为这些数据是结构化的。我们使用 SQLite,它是数据库的轻量版。它的目的是向金融专业人士展示数据库在我们应用场景中的作用。对于实际的 IT 实现,当然可以使用许多企业级的数据库,它们既安全又快速。

下载目标资产的价格数据

本示例中使用的单个资产和市场资产都是 ETF。数据通过 Quandl 下载,包含免费和付费订阅数据——包括由美国国债代表的无风险数据和由全球股票 ETF 代表的市场回报。下载的数据是每日结束数据,我们还需要定义我们所称的价格。在我们的示例中,我们取每日最高价和最低价之间的中间点作为当天的价格。

步骤如下:

  1. 导入必要的库;sqlite3 是本章新引入的内容。这展示了如何将 SQL 数据库用于交易数据的应用场景。我们将使用一种轻量级的 SQL 数据库,称为 SQLite,它本身以文件的形式展示:

6A_1_cal_assetpara.py

'''*************************************
#1\. Import libraries and key variable values
'''
import quandl
import pandas as pd
import numpy as np
from sklearn import linear_model
from sklearn.metrics import r2_score
import sqlite3
import math
import os
#not needed when using database
import pickle

#API Key

#dates variables for all the download

#db file
  1. 定义函数以下载每个资产的数据:
'''*************************************
#2\. Define function to download data for each of the asset
'''

如果没有 Python,你也可以通过工具直接评估文件,例如 Chrome 浏览器的插件、SQLite 查看器等。

该函数将从 Quandl 的SHARADAR数据库下载给定代码的价格数据。除此之外,它还将按天计算该代码的回报。

它的功能是下载数据并计算回报序列。

计算无风险回报率并定义市场

在我们的示例中,我们以美国 3 个月期国库券作为无风险回报率的代表。在投资世界中,美国被认为是无风险的,政府永远不会违约。任何我们获得的超出无风险回报率的收益,都是我们承担更多风险所得到的回报。

整体市场可以通过全球所有投资资产的回报来表示——理论上这很简单,但在现实中却很难定义。最具挑战性的部分是定期生成这个市场回报,以便在下一步中使用。我们将采取捷径,使用 ETF 来代表市场回报:

'''*************************************
#3\. Market Return
'''

给定一个代码作为市场代理,运行前面的函数:

'''*************************************
#4\. Risk Free Rate
'''
#day count

#risk free rate

# override return of market

无风险回报率相对复杂。根据行业惯例,通常使用 3 个月期国库券。为了获得整个期间的无风险回报率,我们需要使用约 10 年的数据来计算该期间的无风险回报率。

然而,我们还需要将利率年化。根据 3 个月期国库券的定义,计算的天数是 360 天。利率是指每天都被计算在内的。

计算每种资产类型的阿尔法、贝塔和误差方差

在了解了无风险回报率和市场回报率之后,我们的下一个任务是通过回归市场回报与资产回报,找出阿尔法(alpha)、贝塔(beta)和误差方差:

投资回报 = 无风险回报率 + 阿尔法 + 贝塔 * 市场回报 + 噪声(误差方差)

在执行此计算后,我们将把数据保存在 SQLite 数据库中,以便以后检索。

我相信,在初创企业的未来,我们的机器人顾问将专注于 ETF/智能贝塔——也就是将各个行业配置在一起,以便对抗市场生成回报。因此,在这个示例中,我选择了 ETF 代码。

我们将对行业 ETF 与市场基准进行线性回归。然而,ETF 和市场的价格报价日期可能不同;因此,我们只在行业 ETF 和市场 ETF 都有价格时才进行回归——在 SQL 中使用内连接命令。

内连接隐式要求行业 ETF 和市场基准的索引在连接之前必须相同。数据集的索引是指回报的日期:

'''*************************************
#5\. Asset Return and parameters
'''
#list of stocks for selection in the active portfolio

#connect to the databases and reset it everytime with drop indicator

#write out the risk free and market parameters

#loop through the tickers
for tkr in list_tkr:
 #calculate the CAPM:
 #download data for the ticker

#make sure the ticket we select has market data

 #linear regression

#obtain the result and write out the parameters

计算最优投资组合配置

我们已经进入第二个主要过程——即计算投资组合配置。首先,我们将计算主动投资组合的规模和不同资产在主动投资组合中的权重。步骤如下:

  1. 导入所有相关的库:

6A_2_treynor_black.py

'''*************************************
#1\. Import libraries and key variable values
'''
import sqlite3
import datetime

#create a table to store weight
  1. 计算主动投资组合的参数,并将其与市场表现进行比较,以找出我们应该从总投资组合中分配给主动投资组合的权重:
'''*************************************
#2\. Find out the weight of the securities in the active portfolio
'''
#total alpha/variance of the active securities

#insert into the table the weight of each active securities

主动投资组合的权重通过聚合属于该投资组合的证券(行业 ETF)的参数来求解。

  1. 然后,根据市场回报/风险与主动投资组合回报/风险的比率,主动投资组合表现越强,分配给该组合的总投资组合权重就越大:
'''*************************************
#3\. Find out the weight of the active portfolio in the total portfolio
'''
#calculate the parameters of the active portfolio

#read back the risk free and market para

#calculate the weight of active portfolio

#display the result

获得最优投资组合后,下一步是根据 IPS 的回报和风险要求将其分配给

以下两个约束条件需要满足:

  • % 最优投资组合 x 最优投资组合的回报 + (1-%最优投资组合) x 无风险资产的回报 >= IPS 要求的回报

  • % 最优投资组合 x 最优投资组合的风险 <= IPS 要求的风险

恭喜!你已经学会了如何将资本分配到不同的投资资产上,从而获得最佳的回报和风险水平。在接下来的章节中,我们将通过一个示例来讲解如何预测证券的趋势,这将帮助投资者做出明智的投资决策。

预测证券的趋势

在前面的示例中,我们扮演了一个跟随财务主管设定的投资组合分配的交易员角色。假设我们的工作是跟随财务主管要求的证券,我们作为交易员的盈亏关键在于如何通过低买高卖获利。我们使用证券的日常定价历史数据来建立模型。在接下来的部分中,我们将展示如何在做出买入决策之前预测资产的趋势。

解决方案

有两个主要过程——一个是模型开发,另一个是模型回测。两个过程总共包括八个步骤,用于实时部署,这里我们不再包含。然而,它与模型回测非常相似。以下图示展示了该过程的流程:

加载、转换并存储数据

在这一步中,我们将加载数据,将数据转换为图像数组,然后将其存储为 HDF5 数据文件格式。首先,我们将从 Quandl 加载数据作为数据框架,然后将数据转换为数组——这将像之前展示的那样绘制数据。在我们的示例中,我们通过仅绘制一天的日终数据点来简化问题。我们只取当天的最高点和最低点的中间值,而不考虑其交易量。

当我们要在一个固定尺寸的数组上绘制价格时,在 y 轴——即价格——我们将开发一个函数,通过缩放数据点,将最大值和最小值固定到固定尺寸内。这称为 归一化。在 x 轴上,每一天由 x 轴上的一个点表示,最左边是给定窗口大小的最早日期,最右边是最新日期。在某一点上,价格点的颜色是相同的,颜色 = 255 用于显示图片,或者为 1 用于神经网络输入。

对目标变量也进行相同的处理——它仅是使用相同尺度的 y 轴表示的第二天图表。如果第二天的价格实际上高于最大值或低于最小值,我们可以强制它取当前的最大值和最小值。

在准备好数组后,我们将按指定的持续时间堆叠数组——每一天由一个图表表示,展示过去的 X 天,其中 X 是窗口大小。堆叠完成后,我们将整个数组放入 HDF5 文件中——这是一种分布式文件格式,允许文件存储在多个物理位置。

定义库和变量。我们已经定义了一个股票代码列表用于下载步骤:

6B_1_trendFollowing.py

'''*************************************
#1\. Import libraries and key variable values

'''
import quandl
import plotly
import plotly.graph_objs as go
import numpy as np

from datetime import datetime
try:
    import Image
except ImportError:
    from PIL import Image
import os
import h5py

#dates parameters
...
#quandl setting
...
#parameters for the image generation
...
#create path for the output dataset
...
#ticker lists
...
#generate png file for each of the input or now
...
#generate interactive plot to the ticket stock price or not
...

定义函数将股票价格的变量范围转化为固定高度和宽度的固定尺寸图像。它将返回一个已经按比例缩放的数值列,并附带缩放因子:

  • 像素值 = (价格值 - 列的最小值) x 每个值的像素数

  • 像素数 = (列的最大值 - 列的最小值) / 总像素数

代码如下:

'''*************************************
#2\. Define the function to rescale the stock price according to the min and max values

'''
#input_X is a series of price
#output_X is a series of price expressed in pixel
def rescale(input_X, pixel, min_x,max_x):
...

逐个股票代码,我们将下载并转换数据,作为机器学习的输入图像和目标结果。代码中最具技术性的部分与 HDF5 文件保存有关。在文件内部,它进一步划分为数据集,在数据集内我们可以存储文件。数据集的一个特性是,它的大小在创建时一旦定义就固定。此外,它不应当动态更新——尽管从技术上讲,这是可能的。

彩色图像存储在三个通道中——红色、绿色和蓝色——每个通道都是一个矩阵,其中每个像素的值在 0 到 255 之间。然而,在我们的示例中,我们将只使用一个通道来处理黑白图像。在将图像存储到 HDF5 之前,所有数字会被除以 255,这样输入变量就会被归一化到 0 和 1 之间,方便后续神经网络训练。

为了让你更直观地感受数据,我们还提供了另一个交互式图表功能(使用ploty)。这个功能已被关闭以提高速度。然而,对于首次使用该代码的用户,建议你尝试一下,看看数据如何被下载。

请参考图像处理相关书籍进行深入讨论——我最喜欢的是 Nixon M.S. 和 Aguado, A.S. 的《计算机视觉中的特征提取与图像处理》,因为它更侧重于提取我们需要的特征,而不是仅仅阐述理论背景。

然而,缺点是本书中的代码不是用 Python 编写的——考虑到学习原理比演化中的代码更为重要,这是一个可以接受的挑战:

'''*************************************
#3\. Go through the tickers
'''
for tkr in tkr_list:
    ...
    #if the ticker has been downloaded, skip the ticket and go for the next 
     one
    ...
    #download and create dataset
    ...
    #sort the date from ascending to descending...
    ...    
    #charting interactive chart for viewing the data
    ...
    #calculate mid price of the day
    ...    
    #remove the file if there is one
    ...
    #remove the file if there is one
    ...
    #create dataset within the HDF5 file
    #now we create the dataset with a fixed size to fit all the data, it 
     could also be create to fit fixed batches    
    ...

    #loop through the dates
    for i in range(num_img):
        ...
        #create min and max values for the mid price plot within a given 
         timeframe
        ...
        #in case of low liquidity ETF which has the same price, no graph be 
         drawn
        ...
        #draw the dot on the x, y axis of the input image array
        ...
        #output the image for visualization
        ...        
        #draw the dot on the target image for training
        ...        
        #stack up for a numpy for Image Recognition
        ...

设置神经网络

根据 Keras 示例中的 ResNet 代码,我们不会对网络设计做任何修改。我们同时使用版本 1 和版本 2,并禁用批量归一化,因为数据点的颜色相同,并且y轴已针对给定的窗口大小进行归一化,因此进一步归一化没有太大意义。

批量归一化与在当前批次记录中协调网络中看到的值有关——如果我们绘制的图像中包含不同颜色,它的效果会很好。然而,由于我们已经在每个数据点的y轴上对定价进行了归一化,因此目前代码保持不变,因为我们需要这种处理,当输入具有不同规模和分布的数据时。

将数据加载到神经网络进行训练

我们之前从 HDF5 文件中获取了数据,并将其放入在前一步中刚设置好的网络中。数据会被分成训练集、测试集和验证集。然而,在我们的案例中,我们将所有数据同时作为训练集和测试集。验证集可以是另一只股票——因为我们仅在训练一般智能来观察股票的技术走势。

我们将批量归一化和一定的训练周期数一起输入到网络中。这一步需要耗费最多的时间。

在训练过程中,我们保持一个性能日志,以便后续可视化:

6B_2_TrainCNN.py

'''*************************************
#1\. Import libraries and key variable values
'''
'''*************************************
#2\. Define functions
'''
def lr_schedule(epoch):
def resnet_layer(inputs,
                 num_filters=16,
                 kernel_size=3,
                 strides=1,
                 activation='relu',
                 batch_normalization=True,
                 conv_first=True):
def resnet_v1(input_shape, depth, num_classes=10):
def resnet_v2(input_shape, depth, num_classes=10):

请参考 arxiv.org/abs/1512.03385 了解设计的解释,并参考 Keras 文档获取进一步的实现细节:keras.io/applications/#resnet50

代码本质上是创建两个不同结构的神经网络设计——鉴于我们有一个相当大的数据输入,且数据源可用,读者只要数据量足够,便会在版本 2 中体验到更好的性能:

#3\. Execute the model training
'''
# Computed depth from supplied model parameter n

# Model name, depth and version

# create list of batches to shuffle the data

#check if the prev step is completed before starting

#decide if we should load a model or not

#loop through the tickers

#load dataset saved in the previous preparation step

#start if both file exists:

#calculate number of batches
 #do it at the first one

# Input image dimensions.
        # Prepare model model saving directory.

        # Prepare callbacks for model saving and for learning rate 
          adjustment

        # loop over batches

            # Run training, without data augmentation.

        #when model training finished for the ticket, create a file to 
         indicate its completion

# Score trained model.

保存并微调神经网络

最后,网络被保存。在这个示例中,我们没有对模型进行微调——但这与超参数调优有关——这意味着我们应该调节网络中的每个单一参数。我建议你阅读 Andrew Ng 的《机器学习的渴望》(www.deeplearning.ai/machine-learning-yearning/)。这个步骤在本示例中没有实现,但我们在第三章中进行了更详细的说明,标题是《使用特征和强化学习自动化银行融资》。

加载运行时数据并通过神经网络进行处理

网络可以重新加载并在新数据集上运行作为验证集。然而,在我们的示例中,我们使用另一只股票来测试这个通用的技术分析机器是否有效。网络的输出是对第二天价格的预测。

在这个程序中,最特别的数据将是策略参数。一切从一个货币值开始。我们正在测试三种策略——一种买入并持有,作为基准,另外两种根据不同的价格输出进行交易。

相关步骤如下:

  1. 导入所有必要的库和变量:

6B_3_RunCNN.py

'''*************************************
#1\. Import libraries and key variable values
'''
#folder path

#date range for full dataset

#Create list of dates

#API key for quandl

#Parameters for the image generation

#model path

#number of channel for the image

#strategies parameter

使用 ResNet v2,我们有接近 100 万个参数,而我们正在输入大约 300 万条记录 ~14.5 年 x 200 个交易日 x 125 个股票代码(但某些股票代码不具备流动性进行交易)。

  1. 然后,定义将价格点适配到具有固定高度的图像的函数:
'''*************************************
#2\. Define functions
'''
  1. 获取新数据并运行预测价格的函数。从票据中加载数据并准备数据;然后运行从训练过程中构建的模型:
'''*************************************
#3\. Running the test
'''
#Get the data

#write header for the log of the strategy back-testing

#loop through the dates
 #make sure both start and end dates are valid

#prepare the input data

#if no trend, then drop this data point

#stack up for a numpy for Image Recognition
 #print the historical data

#make prediction
#Obtain predicted price

从结果中生成交易策略并进行绩效分析

对于给定的价格预测,我们可以设计出不同的操作方式来利用这个价格预测。

该循环的目标是通过依赖前一部分模型的预测来衡量交易策略的盈亏。

在任何给定的日期,只有一个价格预测,其形式为一个 1D 数组,表示在给定比例下每个价格点的概率。各种策略(1 和 2)处理如何使用该预测:

#calculate expected values

#Strategy Back-Testing
 #Benchmark - Strategy 0 - buy and hold

#Testing of strategy1

#Testing of strategy2

#print the final result of the strategies

恭喜!你已经完成了使用计算机视觉模型进行价格预测的过程。

在现实世界中,可能会有更多由不同模型做出的预测,这将增加测试的策略复杂度。我们需要一个基准来判断这些策略是否优于正常的市场情况,也就是买入并持有策略。如果我们的策略成功,它们应该能够通过显示更高的盈亏数字来超越市场。

在策略回测中,我们通常将其部署到一个未见过的、未来的数据样本中。

概述

在本章中,我们学习了多种投资组合管理技巧。我们将它们与人工智能结合,以实现自动化决策过程,特别是在购买资产时。我们了解了用于投资组合构建的 Markowitz 均值方差模型和 Treynor-Black 模型。我们还看了一个使用 Treynor-Black 模型进行投资组合构建的实例。我们还学习了如何预测证券交易的趋势。

在下一章,我们将探讨资产管理中的卖方部分。我们将了解情绪分析、投资产品的算法营销、网络分析,以及如何提取网络关系。我们还将探索如 Network X 等技术和 Neo4j、PDF Miner 等工具。

第七章:在卖方感知市场情感的算法营销

在上一章中,我们了解了投资组合管理。我们还学习了一些投资组合管理技术,例如马克维茨均值-方差模型和特雷诺–布莱克模型,用于投资组合构建。我们还了解了如何预测证券的趋势。因此,上一章是基于市场的买方部分,描述了投资组合经理或资产管理人的行为。

在本章中,我们将探讨市场的卖方部分。我们将了解投资组合经理对手的行为。卖方指的是证券公司/投资银行及其主要服务,包括销售、交易和研究。销售指的是向投资者营销证券,告知他们可以出售的证券。交易指的是投资者用来买卖证券的服务,以及为了帮助投资者评估证券而进行的研究。银行的一个关键职能是以客户为中心,感知终端投资者的需求和情感,进而推动资产管理人从银行购买产品。我们将通过几个概念和技术来开始本章的讨论。我们将通过一个例子来说明如何感知投资者的需求。我们还将通过另一个例子分析年报并从中提取信息。

本章将涵盖以下主题:

  • 了解情感分析

  • 使用情感分析感知市场需求

  • 使用 Neo4j 进行网络构建与分析

了解情感分析

情感分析是一种文本挖掘技术,用于提取上下文信息。上下文信息从源材料中识别并提取出来。它帮助企业理解其产品、证券或资产的情感。利用人工智能的先进技术进行深入研究,在文本分析领域非常有效。对交易进行分类时,重要的是围绕以下概念进行分类:

  • 买卖双方关心的证券方面

  • 客户对证券的意图和反应

情感分析被认为是最常见的文本分析和分类工具。它接收一条传入的消息或交易,并根据该交易所涉及的情感是积极、消极还是中性进行分类。通过使用情感分析技术,可以输入一句话并理解该句背后的情感。

既然我们已经理解了什么是情感分析,接下来我们来看看如何在以下章节中感知市场需求。

使用情感分析感知市场需求

一家证券公司/投资银行在卖方的一个关键要求是为市场制造相关的证券。我们在第四章《机械化资本市场决策》和第五章《预测投资银行家未来》中探讨了公司在这方面的基本行为和责任。我们在第六章《使用 Treynor-Black 模型和 ResNet 的自动化投资组合管理》中了解了动量方法。尽管市场并不总是理性运作,但听听市场的情绪可能会很有趣。这也是我们在本章中要做的。

在这个例子中,我们将扮演投资银行交易大厅的销售员角色,进行股票交易。我们想要了解的是市场对证券的喜好和厌恶,以便能够营销相关证券,包括衍生品。我们的见解来自 Twitter Search,股价数据来自 Quandl。所有这些数据都需要付费许可。

解决方案与步骤

使用编码实现获取市场情绪的过程总共有三个主要步骤。数据如下面的图所示:

步骤如下:

  1. 数据将从 Twitter 获取并以 JSON 文件格式保存在本地。

  2. JSON 文件将被读取,进一步处理,通过计算正面和负面词汇的数量,并作为记录输入到 SQL Lite 数据库中。

  3. 最后,情感将从数据库中读取,并与从 Quandl 获取的股票价格进行比较。

我们将在接下来的部分中更详细地阐述这些步骤。

从 Twitter 下载数据

通过使用 Twitter Search 商业许可,我们下载与 Shalender(Quandl)行业分类定义的相同行业的数据。我们将使用 API 密钥逐一搜索并下载包含公司名称或标记为公司名称的最新 500 条推文。所有推文都以 JSON 格式接收,看起来像一个 Python 字典。然后,JSON 文件将保存在计算机中,供进一步处理。

可以在 GitHub 上找到示例 Python 代码(github.com/twitterdev/search-tweets-python),特别是关于身份验证的部分。以下是从 Twitter 下载推文的代码片段:

'''*************************************
#1\. Import libraries and key variable values

'''
from searchtweets import ResultStream, gen_rule_payload, load_credentials
from searchtweets import collect_results
import json
import os

script_dir = os.path.dirname(__file__)
#Twitter search commerical accounts credential
premium_search_args = load_credentials("~/.twitter_keys.yaml",
                                      env_overwrite=False)
MAX_RESULTS=500 #maximum at 500

#list of companies in the same industry
...

'''*************************************
#2\. download tweets of each company

'''
for comp in comp_list:
   ...

将下载的推文转换为记录

推文的消息及任何链接的页面将被一个简单的语言处理程序加载并读取,该程序将计算消息和链接页面正文中正面和负面词汇的数量。解析后的推文将被转换为结构化的 SQL 数据库格式并存储在 SQL Lite 数据库中。

以下是将推文转换为记录的代码片段:

'''*************************************
#1\. Import libraries and key variable values

'''
import json
import os
import re
import sqlite3
import 7A_lib_cnt_sentiment as sentiment

#db file
db_path = 'parsed_tweets.db'
db_name = 'tweet_db'

#sql db
...
#load tweet json
...
#loop through the tweets
    ...
    for tweet in data:
        ...
        tweet_txt_pos,tweet_txt_neg = sentiment.cnt_sentiment(tweet_txt)
        keywords,sentences_list,words_list = \
                                           sentiment.NER_topics(tweet_txt)
        ...
        if len(url_link)>0:
            ...
            url_txt = sentiment.url_to_string(url)
            temp_tweet_link_txt_pos, temp_tweet_link_txt_neg = \
                                           sentiment.cnt_sentiment(url_txt)
            link_keywords,link_sentences_list,link_words_list = \
                                           sentiment.NER_topics(tweet_txt)
            ...

前面的程序调用了三个函数。一个是用于计算正面和负面词汇,另一个是分析关注的主题,最后一个是从推文中给定的 URL 中提取文本。

以下代码片段定义了程序中使用的函数:

import os
import requests
from bs4 import BeautifulSoup
import re
import spacy
import en_core_web_sm
nlp = en_core_web_sm.load()

...
#cal the positive and negative sentiment words given the text
def cnt_sentiment(text_to_be_parsed):
    ...

def noun_phrase(sentence,item_list,lower):
   ...

#NER
import spacy
from spacy import displacy
from collections import Counter
import math

#text has to be less than 1000000
def NER_topics(text_to_be_parsed):
    ...
    MAX_SIZE =100000
    ...
    for nlp_cnt in range(number_nlp):
        start_pos = nlp_cnt*MAX_SIZE
        end_pos = min(MAX_SIZE,txt_len-start_pos)+start_pos-1
        txt_selected = text_to_be_parsed[start_pos:end_pos]
        ...
        sentences_list = [x for x in article.sents]
        full_sentences_list+=sentences_list
        for sent in sentences_list:
            phrases_list =[]
            phases_list,items_list = noun_phrase(sent, items_list, \
                                                 lower=True)
     ...

#convert the URL's content into string
def url_to_string(url):
    ...

执行情感分析

存储解析过的推文的数据库将被另一个程序读取。对于每一条记录,情感将以每日汇总情感的形式表示。每条推文的情感得分是通过将负面情感的总数从正面情感的总数中减去来计算的。这个情感得分的范围应该在-1 到+1 之间,-1 代表完全负面,+1 代表完全正面。每一天的情感得分是所有推文的情感得分的平均值。相同领域中所有证券的情感得分将绘制在图表上,类似于以下内容:

例如,在我们覆盖的短时间段内,Dominion Energy(道明能源)有着最有利的情感评分(在 10 月 29 日至 10 月 30 日之间)。

Dominion Energy(道明能源)的示例输出如下图所示:

情感是橙色线,股价是蓝色线(请参阅本书提供的彩色图表)。

以下是情感分析的代码片段:

'''*************************************
#1\. Import libraries and key variable values

'''
import sqlite3
import pandas as pd
import plotly
import plotly.graph_objs as go
import quandl
import json

# Create your connection.
db_path = 'parsed_tweets.db'
cnx = sqlite3.connect(db_path)
db_name = 'tweet_db'

'''*************************************
#2\. Gauge the sentiment of each security

'''
...
sql_str = ...
...
print('Sentiment across securities')
field_list = ['positive','negative']
for sec in sec_list:
    ...

比较每日情感与每日价格

在我们获得每只股票的情感得分后,我们还想了解情感对股价的预测能力或影响。当天的股价是通过中午时分的最高价和最低价来计算的。对于每只股票,我们绘制并比较情感和股价在一段时间内的变化。以下截图展示了 PG&E 公司情感与股价的对比:

以下是针对每日价格的情感分析数据的代码片段:

#run it on different companies
print('Retrieve data')
df_comp = pd.read_csv('ticker_companyname.csv')
corr_results={}

for index, row in df_comp.iterrows():
    tkr = row['ticker']
    name = row['name']

    target_sec = '"'+name +'"data.json'

    corr_result = price_sentiment(tkr,target_sec,date_range)
    try:
        corr_results[name]=corr_result['close'][0]
    except Exception:
        continue

f_corr = open('corr_results.json','w')
json.dump(corr_results,f_corr)
f_corr.close()

恭喜!你已经开发了一个程序,帮助销售人员找到热门证券以开发产品。

从我们看到的情况来看,比较这个例子与技术分析例子,我们可以发现情感数据所提供的信息远高于技术趋势。到目前为止,我们只看到了趋势、基本面和情感的初步影响;然而,企业在我们的社会中是相互关联的。那么,我们如何才能建模公司和个人之间的关联呢?这将引出下一个话题——网络分析。

使用 Neo4j 构建和分析网络

作为卖方分析师,除了找出新闻对公司产生的主要影响外,我们还应该找出任何新闻的次级影响。在我们的例子中,我们将找出新闻对股票的供应商、客户和竞争对手的影响。

我们可以通过以下三种方法来实现:

  • 通过直接披露,例如年度报告

  • 通过次级来源(媒体报道)

  • 通过行业推断(例如,原材料行业,如石油行业,为交通行业提供输出)

在本书中,我们使用公司直接披露的信息来说明这一点。

我们扮演的是公司股票的股权研究员,其中一个关键角色是理解相关方与公司之间的联系。我们通过阅读公司年报,寻找公司——杜克能源的相关方。

解决方案

总共有四个步骤。下图展示了数据流:

接下来,我们将更详细地介绍以下各个步骤。

使用 PDFMiner 从 PDF 中提取文本

除了存储外,我们还需要从文本文档中提取关系。在开始处理文本之前,我们需要将 PDF 数据转换为文本。为此,我们使用一个叫做PDFMiner的库(具体来说,该模块叫做pdfminer.six,适用于 Python 3+)进行转换。PDF 是一种开放标准,用于描述文档。它存储了文档中的行、文本、图片以及它们在文档中的精确位置。我们仅使用 PDFMiner 中的一个基础函数来提取其中的文本。尽管我们也可以提取坐标,但为了简化工作,我们将跳过这一部分。在提取文本后,我们将所有行拼接成一行超长文本。

以下代码片段导入了必要的库,并初始化了一个待处理的 PDF 文件:

'''*************************************
#1\. Import relevant libraries and variables

'''
#custom made function
import 7B_lib_entitiesExtraction as entitiesExtraction
import 7B_lib_parser_pdf as pdf_parser
import json
import sqlite3

pdf_path = 'annualrpt/NYSE_DUK_2017.pdf'
...

实体提取

我们采用了一种叫做词性POS)标注的语言分析方法来决定词汇 X 和 Z 是公司还是个人,以及 Y 是产品还是服务。由于句子的结构,我们知道这些是名词,而不是因为我们知道 X、Y 和 Z 是什么。

然而,仅仅标注实体仍然不够。一个实体是一个独立的主语或宾语。由于实体种类繁多,我们应当仅仅标注首字母大写的实体,作为那些对我们的工作相关的独特组织或资产。

实体类型包括ORGPERSONFACNORPGPELOCPRODUCT——即使用 SpaCy 模型的组织、个人、设施、国籍或宗教或政治团体、地理空间、地点和产品。

在从步骤 1 的 PDF 中获取文本片段后,我们运行 SpaCy 提取每个句子中的实体。对于每个句子,我们将实体类型和实体存储在数据库记录中。SpaCy 在分析文档时有技术限制,因此我们将非常长的文本片段切割成不同的块,以遵守技术限制。然而,这样做的代价是会在文本片段的切割点拆分句子。考虑到我们正在处理数百页的内容,我们将采取这个快捷方式。当然,最好的切割方法是大致围绕文本块切割,同时遵守标点符号,以保持完整的句子。

以下代码片段演示了如何提取各种实体:

'''*************************************
#2\. NLP

'''
#Named Entity Extraction
print('ner')
#see if we need to convert everything to lower case words - we keep the original format for this case
lower=False
common_words, sentences, words_list,verbs_list = entitiesExtraction.NER_topics(text,lower)
entities_in_sentences = entitiesExtraction.org_extraction(text)
...
#create this list to export the list of ent and cleanse them
...
print('looping sentences')
for sentence in entities_in_sentences:
    ents_dict[sentence_cnt] = {}
    for entity in sentence:
        ...
        if ent_type in( 'ORG','PERSON','FAC','NORP','GPE','LOC','PRODUCT'):
        ...
    #handle other type
    ...

通过词汇表进行实体分类: 在我们的用例中,我们需要进一步将组织分类为供应商、客户、竞争者、投资者、政府或姊妹公司/资产——例如,作为公司信用投资者的银行,首先会被分类为银行,然后在其年度报告中被推断为公司的信用投资者/银行家。因此,一些关系需要我们与组织数据库核对,以进一步分类它们。获取此类知识需要我们下载相关数据库——在我们的案例中,我们使用 Wikipedia 下载银行列表。只有在与银行名称列表核对后,我们才能将组织分类为银行与否。在我们的示例中,我们没有执行此步骤,因为我们没有通常可供银行使用的词汇集。

使用 NetworkX 存储网络结构

处理完数据后,实体将被存储在 SQL 数据库中,并通过 NetworkX 进一步分析——这是一个处理网络数据的 Python 包。边和节点是任何图的构建块;然而,还有许多其他指标可以用来衡量和描述图,以及节点和边在图中的位置。现在对我们工作来说,重要的是看看节点是否与我们关注的公司相连接,以及它们之间的连接类型。

在 NetworkX 的最终图中,数据仍然非常抽象。我们需要更好的交互式软件来查询和处理这些数据。因此,我们将把数据输出为 CSV 格式,供 Neo4j 进一步处理,因为它提供了与数据交互的用户界面。

然而,距离实际使用仍然很远——需要大量时间来清理数据集并定义所涉及的关系类型。Neo4j 是一个完整的图形数据库,能够满足复杂的关系结构。

必须在公司年报中提到的实体与数据库中存储的实体之间建立关系。在我们的示例中,我们没有对实体进行任何过滤,因为前一步的 NLP 模型具有 85% 的提升率,因此它在识别实体时并不完美。我们仅提取人物和组织作为实体。对于关系类型(边),我们不区分不同的边类型。

在定义网络结构后,我们准备了一个列表,用于存储节点和边,并通过 matplotlib 生成图形,但它本身不足以进行操作或可视化。因此,我们将 NetworkX 的数据输出为 CSV 文件—一个存储节点,另一个存储边。

以下是生成实体网络的代码片段:

'''*************************************
#1\. Import relevant libraries and variables

'''
#generate network
import sqlite3
import pandas as pd
import networkx as nx
import matplotlib.pyplot as plt

#db file
db_path = 'parsed_network.db'
db_name = 'network_db'

#sql db
conn = sqlite3.connect(db_path)
c = conn.cursor()

...

network_dict={}
edge_list=[]
curr_source =''
curr_entity = ''
org_list = []
person_list = []

'''*************************************
#2\. generate the network with all entities connected to Duke Energy - whose annual report is parsed

'''
target_name = 'Duke Energy'
#loop through the database to generate the network format data
for index, row in df_org.iterrows():
    ...

#Generate the output in networkX
print('networkx')

#output the network
G = nx.from_edgelist(edge_list)
pos = nx.spring_layout(G)
nx.draw(G, with_labels=False, nodecolor='r',pos=pos, edge_color='b')
plt.savefig('network.png')

使用 Neo4j 进行图形可视化和查询

我们将安装 Neo4j 并导入 CSV 文件,以在 Neo4j——这一行业级图形数据库中构建数据网络。不幸的是,Neo4j 本身需要另一套编程语言来操作其数据,称为Cypher。这使我们能够提取和搜索我们需要的数据。

我们生成 Neo4j 所需的文件。以下代码片段初始化 Neo4j:

#Generate output for Neo4j
print('prep data for Neo4j')
f_org_node=open('node.csv','w+')
f_org_node.write('nodename\n')

f_person_node=open('node_person.csv','w+')
f_person_node.write('nodename\n')

f_vertex=open('edge.csv','w+')
f_vertex.write('nodename1,nodename2,weight\n')
...

在终端中,我们将输出文件复制到 Neo4j 的主目录。以下是从终端执行的命令:

sudo cp '[path]/edge.csv' /var/lib/Neo4j/import/edge.csv
sudo cp '[path]/node.csv' /var/lib/Neo4j/import/node.csv

sudo service Neo4j restart

在 Neo4j 中,我们通过浏览器登录。以下是输入到浏览器中的 URL:

http://localhost:7474/browser/

以下是 Neo4j Cypher 的示例代码片段:

MATCH (n) DETACH DELETE n;

USING PERIODIC COMMIT
LOAD CSV WITH HEADERS FROM "file:///node.csv" AS row
CREATE (:ENTITY {node: row.nodename});

CREATE INDEX ON :ENTITY(node);

USING PERIODIC COMMIT
LOAD CSV WITH HEADERS FROM "file:///edge.csv" AS row
MATCH (vertex1:ENTITY {node: row.nodename1})
MATCH (vertex2:ENTITY {node: row.nodename2})
MERGE (vertex1)-[:LINK]->(vertex2);

MATCH (n:ENTITY)-[:LINK]->(ENTITY) RETURN n;

以下是结果输出的截图:

恭喜!你已经成功提取了年报中大量需要聚焦进一步分析的重要名称/主体。

总结

在本章中,我们学习了市场卖方的行为。我们了解了什么是情感分析,以及如何使用它。我们还看了一个例子,使用情感分析来感知市场需求。我们学习了使用 Neo4j 进行网络分析,Neo4j 是一种 NoSQL 数据库技术。我们学习了使用 PDF miner 工具进行文本挖掘。

在下一章,我们将学习如何使用银行 API 来构建个人财富顾问。本章将重点关注消费者银行业务。我们将学习如何访问开放银行项目(Open Bank Project)以获取财务健康数据。我们还将学习文档布局分析。让我们不再拖延,直接开始吧。

第八章:使用银行 API 构建个人财富顾问

在上一章中,我们分析了交易所卖方的行为。我们还学习了情绪分析,并通过学习如何使用情绪分析来分析市场需求,深入了解了这一主题。接着,我们学习了 Neo4j,这是一个 NoSQL 数据库技术。然后,我们使用 Neo4j 构建并存储了一个涉及证券交易的实体网络。

在本章中,我们将重点关注消费者银行业务,理解如何管理客户的数字数据需求。接着,我们将学习如何访问开放银行项目,这是一个开源平台,旨在促进开放银行业务。之后,我们将查看如何将人工智能模型与银行 API 结合使用的示例。最后,我们将学习文档布局分析。

本章将涵盖以下主题:

  • 管理客户的数字数据

  • 开放银行项目

  • 执行文档布局分析

  • 使用开放银行 API 进行现金流预测

  • 使用发票实体识别追踪日常开支

让我们开始吧!

管理客户的数字数据

在这个数字化时代,没理由认为资金不能做到 100%透明,也没有理由认为资金转账不能在实时、全天候(24/7)进行。消费者有权拥有自己的数据,因为数据代表了他们的身份。无论是否可能,我们都应该开始整合自己的数据——实际上,这应该在今天以及未来几年内实现。最好将我们的银行数据整合到一个地方;例如,我们的常客飞行里程。关键是要有两层数据架构——一层用于数据整合(包括存储),另一层用于运行将通过智能设备进行数据分析的人工智能服务,也就是所谓的移动应用程序。如果不了解数据整合层的运作,设计一个 AI 算法是很痛苦的。

在这里,我们的数据来源可以是身份数据、生物/心理数据、财务数据、可能影响这些静态数据的事件以及社交数据,后者代表我们与他人的关系(包括人类、物体、生命体等)。事实上,这与企业对企业B2B)环境非常相似,其中任何公司都可以通过其法律身份、股东/所有权结构、财务状况、事件以及商业关系来表示,正如在第七章《在卖方市场中感知市场情绪进行算法营销》中所概述的那样,利用情绪分析来理解市场需求。这也意味着我们在本章学到的内容可以帮助你更好地理解本书前几章的内容。

然而,对于所有个人,包括你和我们,我们的财务需求是相当基础的——它们包括支付、信用和财富。这些勾画了金融服务的核心活动。保险作为财富的一部分被纳入其中,因为它旨在保护我们的财富免受不良事件和风险的影响——这就像是第二章中关于采购成本风险对冲的衍生品,时间序列分析

然而,我也认为从消费者那里得出的数据同样属于处理交易的银行。这就像父母身份——所有关于数据(父母的孩子)的决策都是由数据所有者(消费者)和数据生产者(银行)之间达成的协议。目前缺乏的是能够迅速将这些数据以及其使用所带来的经济利益归属到某些经济活动(例如市场营销)中的技术。如果某个组织(例如超市)为消费者数据付费给社交媒体(例如谷歌、Facebook 和 Twitter)用于市场营销目的,那么数据所有者应当获得一定比例的经济利益。没有数据技术的进步,单纯的法律法规将不具备实际可操作性。

开放银行项目

允许消费者整合自己数据的世界上最先进政策被称为开放银行项目。它始于 2016 年在英国,遵循欧洲的支付服务指令 PSD2——修订后的支付服务指令(www.ecb.europa.eu/paym/intro/mip-online/2018/html/1803_revisedpsd.en.html)。这一政策通过降低使用银行信息进行财务咨询的准入门槛,改变了银行的竞争格局。这使得机器人顾问成为可行的商业模式,因为银行所拥有的金融数据不再是隔离的。

这个项目面临的挑战是,现有的主导性银行几乎没有动力开放它们的数据。在消费者方面,数据整合的缓慢影响了银行服务中这种互联网络的经济价值。这遵循了梅特卡夫定律,即一个网络的价值等同于连接用户数量的平方(在我们的案例中是银行)。下表使用博弈论分析了这种情况,预期了银行和消费者的结果——假设消费者市场中只有两家银行,有四种可能的结果:

单元格值 = 银行 A/银行 B/消费者的收益 银行 B:开放银行 API 银行 B:未开放银行 API
银行 A:开放银行 API 0.5\0.5\2 0.5\1\1
银行 A:未开放银行 API 1\0.5\1 1\1\1

对于现状(即没有开放银行 API 的情况下),假设银行 A 和银行 B 将各自享有 1 个单位的收益,而消费者也将拥有 1 个单位的收益。

任何银行要开发开放银行 API,都需要消耗其 0.5 的资源。因此,我们将展示两种情况:银行 A 或 B 开发开放银行 API,而另一家则没有。开发开放银行 API 的银行将获得较少的收益,因为原本 1 个单位的 0.5 将需要用作维持 API 的资源。在这两种情况下,由于数据没有整合,消费者无法享受任何额外的收益。

只有在所有银行都采用开放银行 API 的情况下,消费者才能看到逐步增加的收益(假设再增加一个单位,使总数变为两个,仅为任意假设),而两家银行的收益却减少。当然,这种情况可能是错误的,因为整体市场会变得更加竞争激烈,这也是英国虚拟银行所发生的情况——由于这一举措,已经创造了一个新的子领域!所以,归根结底,所有银行的收益可能都会得到改善。

话虽如此,大多数现有银行的现实情况是,它们必须维持两套银行服务——一套完全虚拟,而另一套银行渠道仍然是传统的实体存在,且不可扩展。或许前进的道路是,在现有银行渠道之外再建立一个新的银行渠道,并将客户转移到那里。

由于理想状态尚未实现,目前,要构建数字化你,需要来自英国开放银行项目OBP)的金融交易数据(uk.openbankproject.com/)、来自欧盟 Digidentity 的身份验证(www.digidentity.eu/en/home/)、新加坡 IHiS 存储的健康记录(www.ihis.com.sg/)、Facebook、Twitter、Instagram 和 LinkedIn 的事件与社交数据、保险公司提供的生活事件等。简而言之,我们仍需为每个相应系统的推出做好准备,才能整合所有这些数据源。

智能设备——使用 Flask 和 MongoDB 作为存储的 API

你的智能设备就是一位个性化的私人银行家:软件将与市场和你自己互动。在智能设备中,核心模块是持有模块和用户互动模块。持有模块将保障用户/客户的投资,而用户的互动和用户本身则由用户互动模块迎接并连接。

持有模块处理投资的定量方面——这正是我们在前两章中讨论的内容,但是在个人层面——通过管理投资组合并捕获各种市场数据。然而,区别在于,我们需要通过在用户互动模块中捕获的行为数据,更好地理解用户/客户。持有模块是智能设备的认知大脑。

用户互动模块提供了智能设备的互动方面——它理解用户在投资和互动中的偏好。这些投资偏好记录在投资政策声明(IPS)中。然后,这些互动通过行为分析器处理,分析用户偏好的时间、渠道和沟通方式,以及关于用户个性和风险偏好的财务行为,这些信息都来自于通过设备使用获得的外部数据源或用户生成的数据。最后但同样重要的是,沟通渠道Comm Channels)通过语音、文字或通过物理机器人与用户互动。

这很好地总结了我们在第一章《人工智能在银行业中的重要性》中提到的内容,作为人工智能的定义——一种能够像人类一样进行理性或感性(或两者兼具)思考和行动的机器。持有模块是人类的理性大脑,在市场中根据此理性行动,而情感则由用户互动模块处理——通过行为分析器同情并根据沟通渠道与用户互动。下图展示了通过银行功能实现的市场与用户互动:

由于我们在前两章中已经讨论过持有模块,主要聚焦于投资过程,因此在这里,我们将更多地关注用户互动模块。具体来说,我们将深入探讨投资政策声明(IPS),它记录了用户的投资需求。

理解 IPS

正如我们在第六章《使用 Treynor-Black 模型和 ResNet 的自动化投资组合管理》中提到的,我们将在这里开始研究个人的投资政策声明。为此,我们需要收集数据,以便为个别客户构建 IPS。

这是为一个家庭构建 IPS 所需的内容:

  • 回报和风险目标
目标 注释
投资回报目标 由投资者输入,并通过行为分析器——个性化分析
承担风险的能力 由投资者输入,并通过行为分析器——个性化分析
承担风险的意愿 由投资者输入,并通过行为分析器——个性化分析
  • 约束条件
约束条件 注释
流动性 资产的流动性可以通过智能设备中的价格来确定。
时间范围 规划你孩子的未来——他们的学业(在哪里、上什么学校、学费等)、住房计划、工作、退休等。
税收(美国公民) 通过 Digidentity 验证公民身份。
法律和监管环境 这可能涉及商业交易、公民身份、就业和居住限制。你也可能需要考虑管理你财富的法律实体,如家庭信托。
独特情况 兴趣和特殊情况没有被公开,包括社交媒体或与标准用户不同的医疗档案——这需要在用户之间匿名对比,提供真实的、独特的情况。

行为分析器 – 支出分析器

类似于第二章,时间序列分析,我们将预测市场中的日常现金流。由于大多数情况下的收入(甚至是大多数按月领薪的工作人群)是固定的,唯一变动的部分是支出。在这些支出中,可能有一些定期支出,如购买日常杂货,和一些不定期支出,如购买家电甚至是汽车。为了让机器追踪并预测定期支出习惯以及不常见的支出,实际的方法是当这些支出发生时,能够高效地记录这些习惯。

将 AI 服务暴露为 API

虽然我们在第六章,使用 Treynor-Black 模型和 ResNet 的自动化投资组合管理中建立的投资组合优化模型很出色,但本章将要讨论的关键技术是如何通过 API 将 AI 模型封装并提供给用户。关于技术建模技能,本章不会向我们的技能库中添加任何新技术。

执行文档布局分析

在机器学习中,有一门学科叫做文档布局分析。它实际上是研究人类如何理解文档的过程。它包括计算机视觉、自然语言处理和知识图谱。最终目标是提供一个本体,允许任何文档都能像文字处理软件那样被导航,但方式是自动化的。在文字处理软件中,我们需要定义某些词汇,这些词汇出现在标题中,也出现在不同层次的层级中——例如,一级标题、二级标题、正文文本、段落等。而没有人为定义的是句子、词汇、单词、字符、像素等。然而,当我们处理相机或扫描仪拍摄的图像时,最低级别的数据是像素。

文档布局分析的步骤

在本节中,我们将学习如何执行文档布局分析。步骤如下:

  1. 从像素形成字符:这项技术用于将像素转换为字符,称为光学字符识别OCR)。这是一个众所周知的问题,可以通过许多深度学习示例来解决,包括 MNIST 数据集。或者,我们可以使用 Tesseract-OCR 来执行 OCR。

  2. 图像旋转:当图像没有正确的垂直方向时,可能会给人们阅读字符带来挑战。当然,当前在这一领域的研究表明,有些技术似乎能够跳过这个步骤。

  3. 从字符形成单词:实际上,我们不能等待几分钟才能完成这个过程;在人类的表现下,我们可以做对这一点。我们怎么知道一个字符要与其他字符组合形成一个单词呢?我们知道这一点是通过空间线索。然而,字符之间的距离并不是固定的,那么我们如何教机器理解这个空间距离呢?这也许是大多数患有阅读障碍的人面临的挑战。机器默认也会遭遇阅读障碍。

  4. 从词语构建意义:这要求我们了解文章的主题和单词的拼写,这有助于我们查阅各种词典来理解文档的内容。学习(在本书中指深度学习)可能只是一个与教育相关的主题,而我们之所以知道这一点,是因为你理解到这本书是由 Packt 出版社出版的机器学习书籍——一个你以前学过的出版社名称。否则,仅仅通过阅读“Packt”这个词,我们可能会猜测它与一个包装公司有关(也就是 PACK-t)?此外,我们还可以从标签词中获得线索——步骤 3本身就像是标签词,用来引导右侧的实际内容。

将词语分类为各种通用类型的实体是有帮助的——例如,日期、序列号、金额、时间等等。这些是我们通常在开源领域看到的通用实体,比如我们在第七章中使用的 spaCy,在卖方算法营销中感知市场情绪

关于词语的空间线索,我们可能会在关注较大的词语时,忽视较小的词语。词语在页面上的位置也很重要。例如,在阅读英文时,我们通常是从上到下,从左到右,而在一些其他语言中,我们需要从右到左,从上到下阅读,比如古代汉语。

使用 Gensim 进行主题建模

在我们的主题建模示例中,我们将专注于步骤 4来限制我们的工作范围。我们在此过程中会默认步骤 1步骤 3的预工作,并跳过步骤 5步骤 6。我们将使用的数据集图像已经过清理、旋转和 OCR 处理——这包括将字符绑定成单词。我们手头的数据集每条记录由一个文本块表示,可能包含多个单词。Gensim 关注的是追踪文本中的名词。

Word2vec 的向量维度

Word2Vec 通过不同的特征定义单词——每个单词的特征值由出现在同一句子中的单词之间的距离定义。它的目的是量化概念和话题之间的相似性。在我们的 Word2Vec 示例中,我们将使用一个预训练模型将文本转换成单词。然而,对于每个文本块,可能涉及多个值。在这种情况下,这些向量会被压缩成一个值,使用一个叫做特征值的值。我们将采用这种简单的方法进行降维,这通常用于减少变量的特征数量(维度)。降维的最常见方法叫做主成分分析PCA)。它主要应用于标量,而不是变量的向量。想象每个单词都由一个向量表示。在这里,两个单词的文本块将由一个由两个向量组成的矩阵表示。因此,PCA 可能不是这种降维任务的理想解决方案。

在解释代表单词主题的向量时,分析涉及的维度非常重要,因为每个维度代表一个语义/意义组。在我们的 Word2Vec 示例中,我们将跳过这一步,以避免将过多的维度引入有意义的提取过程。这意味着我们会为说明目的缩小特征空间。

使用 Open Bank API 的现金流预测

未来,我们需要机器人顾问能够理解我们的需求。最基本的步骤是能够从不同银行提取我们的财务数据。在这里,我们假设我们是来自美国的消费银行服务客户,当前居住在英国。我们正在为一个四口之家——一对已婚夫妇和两个孩子——寻找财富规划。我们希望机器人顾问为我们执行所有的财务活动。

我们将通过Open Bank ProjectOBP)API 检索所有必要的交易数据,以预测我们的支出。我们将使用遵循 OBP 格式的模拟数据。我们不会深入探讨任何软件技术,而是专注于构建财富规划引擎。我们使用的家庭描述来自美联储(www.federalreserve.gov/econresdata/2016-economic-well-being-of-us-households-in-2015-Income-and-Savings.htm)关于美国家庭财务的相关数据。

以下表格展示了美国家庭的典型数值,帮助我们了解消费银行的一般需求:

收入/支出 数值(单位:美元) 数据来源(OBS)
收入 102.7
工作人员工资 102.7 每月最大自动支付,月薪固定。
生活费用 67.3
年度支出 57.3 从信用卡、储蓄和活期账户中提取所有交易。
债务偿还 10.0 与债务账户相关的交易。
净资产 97
资产 189.9
金融资产 23.5 证券账户的未偿还余额。401 计划无可见性。
非金融资产 158.9 由 Zillow 提供的房产估值。
负债 92.6
抵押贷款 59.5 债务账户的未偿还余额。
汽车贷款和教育债务 32.8 汽车贷款:债务账户的未偿还余额;学生贷款(联邦),对应为联邦学生贷款;学生贷款(私人):债务账户的未偿还余额。

欲了解更多关于 Zillow 的细节,请参考此链接:www.zillow.com/howto/api/APIOverview.htm

所涉及的步骤

使用开放银行 API,我们需要做以下操作:

  1. 注册使用开放银行 API。

  2. 下载所需数据。

  3. 创建一个数据库来存储这些数据。

  4. 设置一个预测用的 API。

让我们开始吧!

注册使用开放银行 API

我们可以通过几种方式访问开放银行项目——我们将在其中一个方式中进行操作,我们已在demo.openbankproject.com/注册。

创建并下载示例数据

这一部分的代码可以从 GitHub 下载(github.com/OpenBankProject/Hello-OBP-DirectLogin-Python)。基于此库中的hello_obp.py文件,我们已修改程序,使其能够下载所需的数据。使用以下代码片段下载示例数据:

# -*- coding: utf-8 -*-

from __future__ import print_function    # (at top of module)
import sys
import time
import requests

# Note: in order to use this example, you need to have at least one account
# that you can send money from (i.e. be the owner).
# All properties are now kept in one central place

from props.default import *

# You probably don't need to change those
...

#add the following lines to hello-obp.py before running it
#add lines to download the file
print("")
print(" --- export json")
import json
f_json = open('transactions.json','w+')
json.dump(transactions,f_json,sort_keys=True, indent=4)

创建 NoSQL 数据库以本地存储数据

我更倾向于使用 MongoDB,因为它能够以层级方式导入 JSON 文件,而我们无需提前定义结构。即使我们需要将 NoSQL 文件以 SQL 数据库格式存储(就像在上一章中那样),每当需要使用 ML 模型进行预测时,它仍然有助于我们在运行预测之前将下载的数据物理缓存起来。

所以,你可能会想知道为什么我们需要将数据存储在 NoSQL 数据库中——难道我们不能像上一章处理推文数据时那样直接保存吗?不——我们希望使用数据库,因为为了更快地检索数据,我们将存储数十万个 JSON 文件,而不是批量下载的数据。这也取决于我们希望多频繁地下载数据;如果我们希望每天更新数据库,可能就不需要将 JSON 数据存储在 NoSQL 数据库中,因为我们处理的数据文件不会很多。然而,如果我们需要查询数据或持续向训练数据集中添加新特征,存储原始数据可能更有利。

以下代码用于建立与 MongoDB 服务器的连接:

from pymongo import MongoClient
import json
import pprint

#client = MongoClient()
client = MongoClient('mongodb://localhost:27017/')
db_name = 'AIFinance8A'
collection_name = 'transactions_obp'

f_json = open('transactions.json', 'r')
json_data = json.loads(f_json)

...

#to check if all documents are inserted
...

以下代码用于创建数据库:

#define libraries and variables
import sqlite3
from pymongo import MongoClient
import json
from flatten_dict import flatten

client = MongoClient('mongodb://localhost:27017/')
db_name = 'AIFinance8A'
collection_name = 'transactions_obp'

db = client[db_name]
collection = db[collection_name]
posts = db.posts

...

#flatten the dictionary
...

#create the database schema
#db file
db_path = 'parsed_obp.db'
db_name = 'obp_db'

#sql db
...
sqlstr = 'drop table '+db_name
...
print('create')
...
#loop through the dict and insert them into the db
...

for cnt in dict_cnt:
    ...
    for fld in tuple_fields_list:
        ...
    ...
    sqlstr = 'insert into '+ db_name+ '(' + str(fld_list_str)+') VALUES \
                                       ('+question_len[1:]+')'
    ...

设置预测用 API

为了进行支付预测,我们需要知道我们想要构建什么样的预测模型。我们是想要一个时间序列模型,还是机器学习模型?当然,我们希望有一个能够提供更多信息的模型。

在我们的示例中,我们没有为此准备任何模型,因为我们将使用的方法与我们在第二章中使用的模型类似,时间序列分析。这里的主要目的是说明如何设置 API 服务器,以及如何使用另一个程序来调用该 API。请确保这两个程序同时运行。

服务器将被设置为监听请求,以便它可以运行预测。我们将简单地加载模型,而不运行任何预测。以下代码片段用于将我们连接到 Open Bank API 服务器:

#Libraries
from flask import Flask, request, jsonify
from sklearn.externals import joblib
import traceback
import pandas as pd
import numpy as np

# Your API definition
app = Flask(__name__)

@app.route('/predict', methods=['POST'])
def predict():
    ...

#Run the server
if __name__ == '__main__':
    ...

以下代码片段用于从客户端应用程序创建请求:

import requests

host = 'http://127.0.0.1:12345/'

r = requests.post(host+'predict', json={"key": "value"})
print(r)

恭喜!你已经建立了一个能够读取银行数据的机器人,并使其能够在这些数据上运行 AI 模型。

对于家庭来说,限制支出以增加现金流变得至关重要。在接下来的部分,我们将探讨如何使用发票实体识别技术来追踪日常支出。

使用发票实体识别技术追踪日常支出

虽然我们一直在梦想通过 AI 在金融领域实现数字化的最终目标,但现实是有些数据被困住了。而且这些费用往往以纸质的形式存在,而不是 API 数据流。如果我们要转型为一个完全数字化的世界,所有信息都存储在 JSON 文件或 SQL 数据库中,处理纸质文档将是不可避免的。我们无法避免处理现有的纸质信息。通过一个纸质文档数据集的例子,我们将展示如何建立发票实体提取模型的引擎。

在这个示例中,我们假设你正在开发自己的引擎来扫描并将发票转换为结构化数据格式。然而,由于缺乏数据,你需要解析专利图像数据集,该数据集可以在machinelearning.inginf.units.it/data-and-tools/ghega-dataset找到。在这个数据集中,有图像、文本块以及我们希望从中提取的目标结果。这被称为实体提取。这里的挑战在于,这些发票并不是标准化格式。不同的商家开具的发票尺寸和格式各不相同,但我们仍然能够理解视觉线索(字体大小、线条、位置等)以及单词及其周围的单词(称为标签)。

涉及的步骤

我们必须遵循六个步骤,使用发票实体识别来追踪每日开销。这些步骤如下:

  1. 导入相关库并定义变量。在本示例中,我们引入了主题建模技术,包括词向量Word2vec),使用gensim,以及使用re进行正则表达式匹配,这是一个内置模块。以下代码片段用于导入所需的库:
import os
import pandas as pd
from numpy import genfromtxt
import numpy as np
from gensim.models import Word2Vec
from gensim.models.keyedvectors import WordEmbeddingsKeyedVectors
import gensim.downloader as api
from gensim.parsing.preprocessing import remove_stopwords
from gensim.parsing.preprocessing import preprocess_string, strip_tags, remove_stopwords,strip_numeric,strip_multiple_whitespaces
from scipy import linalg as LA
import pickle
import re
from sklearn.model_selection import train_test_split
from sklearn.neural_network import MLPClassifier
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import classification_report,roc_curve, auc,confusion_matrix,f1_score

#please run this in terminal: sudo apt-get install libopenblas-dev
model_word2vec = api.load("text8") # load pre-trained words vectors
  1. 定义之后需要使用的函数。将有两组函数——一组2A用于训练和测试神经网络,另一组2B旨在将文本转换为数值。以下代码片段定义了将用于发票实体识别的函数:
#2\. Define functions relevant for works
##2A Neural Network
##2A_i. 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):
...
##2A_ii train network
def train_NN(X,Y,target_names):
...
#2B: prepare the text data series into numeric data series
#2B.i: cleanse text by removing multiple whitespaces and converting to lower cases
def cleanse_text(sentence,re_sub):
...
#2B.ii: convert text to numeric numbers
def text_series_to_np(txt_series,model,re_sub):
...

  1. 准备数据集。在本示例中,我们将尝试使用numpy来存储特征,因为它们相当大。我们还将使用pandas处理每个文件,因为使用 DataFrame 来操作和选择列更加方便,前提是每个图像的大小不太大。以下代码片段用于准备数据集:
#3\. Loop through the files to prepare the dataset for training and testing
#loop through folders (represent different sources)
for folder in list_of_dir:
    files = os.path.join(path,folder)
    #loop through folders (represent different filing of the same 
     source)
    for file in os.listdir(files):
        if file.endswith(truth_file_ext):
        #define the file names to be read
         ...

        #merge ground truth (aka target variables) with the blocks 
         ...

        #convert the text itself into vectors and lastly a single 
        value using Eigenvalue
        text_df = f_df['text']
        text_np = text_series_to_np(text_df,model_word2vec,re_sub)

        label_df = f_df['text_label'] 
        label_np = text_series_to_np(label_df, model_word2vec, \
                                     re_sub)
         ...
Y_pd = pd.get_dummies(targets_df)
Y_np = Y_pd.values
  1. 执行模型。在这里,我们使用之前步骤中定义的函数来执行我们准备的模型。以下代码片段用于执行该模型:
#4\. Execute the training and test the outcome
NN_clf, f1_clf = train_NN(full_X_np,Y_np,dummy_header)
...

恭喜!到此为止,你已经构建了一个能够从扫描图像中提取信息的模型!

  1. 从单词的空间和视觉环境中提取线索。前述这一行明确区分了步骤 4步骤 5。注意这些线条如何被投射出来,也有助于我们将相似的单词分组。对于需要原件的文档,我们可能需要查看签名和标志,并将其与真实的已验证签名或印章进行比对。

  2. 构建这些文档的知识图谱。这是我们可以深入了解文档中所蕴含的知识的时候。在这里,我们需要使用图形数据库来追踪这些知识(我们在前一章中已介绍过)。

这就结束了我们关于追踪每日开销的示例,也结束了这一章的内容。

总结

在这一章中,我们介绍了如何使用 API 提取数据并提供 AI 服务。我们理解了管理客户数字数据的重要性。我们还理解了开放银行项目和文档布局分析。通过两个示例我们学习了这些内容——一个是关于现金流投影,另一个是关于追踪每日开销的。

下一章将继续聚焦于消费者银行业务。我们将学习如何为客户资料中缺失的信息创建代理数据。我们还将查看一个示例聊天机器人,用于服务和与客户互动。我们将使用图形和自然语言处理技术来构建这个聊天机器人。

第九章:客户终身财富的大规模定制

在上一章中,我们学习了如何管理客户的数字数据。我们还介绍了开放银行项目和开放银行 API。此外,我们还学习了文档布局分析,并查看了一个投影典型家庭现金流的示例。然后,我们查看了另一个使用发票实体识别跟踪日常支出的示例。

在本章中,我们将学习如何结合来自调查的数据进行个人数据分析。我们将学习 Neo4j 等技术,这是一个图数据库。我们将构建一个全天候为客户服务的聊天机器人。我们还将学习如何使用 NLP 和 Neo4j 预测客户响应,以一个示例为例。之后,我们将学习如何使用 Cypher 语言操作来自 Neo4j 数据库的数据。

本章将涵盖以下主题:

  • 财富工具的金融概念

  • 集成学习

  • 预测客户的响应

  • 构建一个全天候为客户服务的聊天机器人

  • 使用自然语言处理(NLP)和图表进行知识管理

财富工具的金融概念

在这一部分,我们将回答消费银行营销人员提出的一些问题。然后,我们将研究另一个重要的模型开发技术——集成学习,这在将不同模型的预测结合起来方面非常有用。

财富的来源:资产、收入和天赋

零售银行客户分析中最常见的任务之一是获取额外数据,以帮助解释客户的投资行为和模式。毫无疑问,我们将了解客户的响应,但模型的工作是找出他们为什么做出这样的响应。令人惊讶的是,关于个人行为的聚合信息有很多,例如人口普查数据。我们还可以从社交媒体获取数据,用户使用社交媒体进行身份验证。然后,可以将相关的社交媒体信息与我们在组织内部观察到的个人级交易数据进行链接。为了解释个人银行行为,我们最希望的相关补充数据是关于他们财富的信息。

客户生命周期

典型的生命周期包括三个主要阶段——获取、交叉销售/增值和保留。以下图表说明了这三个阶段:

获取是我们开始与客户建立商业关系的时刻。然后,我们进入交叉销售向上销售。交叉销售是提高向客户销售的产品/服务数量。向上销售是通过同一产品与其他产品/服务加深客户的资金份额。保持是指维持关系,这是银行保护关系的防御性举措。我们的第一个例子(将在后面的章节中描述)涉及交叉销售(如果客户没有该产品)和向上销售(如果客户拥有该产品)。

集成学习

集成学习是一种提升技术,可以帮助我们提高预测的准确性。我们还将学习如何使用图数据库进行知识存储。知识存储是当前知识表示中的挑战,可以用来增强人工智能在专业级金融服务中的应用。

集成学习是一种用于总结多个模型以提供更稳定预测的方法。在深度神经网络流行之前,这是非常常见的一种方法。为了完整性,我们不想忽视这种建模技术,即使这是一本非常简短的书。特别是,我们使用了随机森林,这意味着我们建立了大量的决策树作为森林,并应用逻辑来削减那些表现较差的树。另一种方法是将较弱的模型结合起来产生强大的结果,这被称为提升方法。我们在这里不详细讲解,但鼓励读者深入阅读 scikit-learn 文档(scikit-learn.org/stable/)。

通过图数据库进行知识检索

要使机器在客户服务中像人类一样交流,其中一个关键要素是对话组件。当我们进行对话时,正常情况下人类客户可能无法提供处理所需的全部信息。人类能够应对模糊性。人类能够理解上下文,因此可以推断出意义,而无需明确提及概念。知道机器只能解决明确的问题,而人类能够处理模糊性,机器的任务是从它所拥有的知识图谱中推断出客户的意义。图数据库就是为此目的而使用的工具。

预测客户响应

到目前为止,我们还没有讨论银行的日常营销活动。现在,我们终于来看看如何确定营销前景。尽管每个客户都是独特的,但他们仍然是通过算法以相同的方式处理的。

在这个示例中,你将扮演一名数据科学家的角色,负责推广定期存款产品。我们将训练模型来预测定期存款的营销活动。与银行内部客户数据及其对营销活动的历史响应相关的数据来自机器学习与智能系统中心(archive.ics.uci.edu/ml/datasets/bank+marketing)、布伦信息与计算机科学学院和加利福尼亚大学尔湾分校。有关个人财富的调查信息来自美国人口普查局(www.census.gov/data/tables/time-series/demo/income-poverty/historical-income-households.html),它作为对银行内部数据的补充。

解决方案

完成此示例有四个步骤:

  1. 我们引入了随机森林,它是一种机器学习算法,利用集成学习,使得可以通过多个模型进行预测。最终的模型是多个模型结果的组合。以下是导入所需库并定义变量的代码片段:
#import libraries & define variables
import pandas as pd
import os
from sklearn.ensemble import RandomForestClassifier
from sklearn.datasets import make_classification
  1. 人口普查数据提供了关于年龄段存款和财富的信息,这些数据被存储在银行中。以下是处理人口普查数据的代码片段:
cat_val = ''
cat_dict = {}
for index, row in df_xtics.iterrows():
    ...

df_bank['age_c'] = pd.cut(df_bank['age'], [0,35,45,55,65,70,75,200])

#ID Conversions
df_bank['age_c_codes']=df_bank['age_c'].cat.codes.astype(str)
age_map={'0':'Less than 35 years'
,'1':'35 to 44 years'
,'2':'45 to 54 years'
,'3':'55 to 64 years'
,'4':'.65 to 69 years'
,'5':'.70 to 74 years'
,'6':'.75 and over'}
  1. 我们希望通过使用年龄来引入财富数据,说明如何将一列数据映射。以下是将人口普查数据与银行数据结合的代码片段:
#3\. map back the survey data
df_bank['age_c1']=df_bank['age_c_codes'].map(age_map)
df_bank['age_c1_val']=df_bank['age_c1'].map(cat_dict['Age of Householder'])

X_flds = ['balance','day', 'duration', 'pdays',
       'previous', 'age_c1_val']
X = df_bank[X_flds]
y = df_bank['y']
  1. 以下是训练模型的代码片段:
X, y = make_classification(n_samples=1000, n_features=3,
                           n_informative=2, n_redundant=0,
                           random_state=0, shuffle=False)
clf = RandomForestClassifier(n_estimators=100, max_depth=2,
                             random_state=0)
clf.fit(X, y)
print(clf.feature_importances_)

恭喜!你已经将外部数据集与内部数据集合并,增强了我们对客户的理解。

建立一个 24/7 服务客户的聊天机器人

当我们与机器人互动时,我们期望它能够理解并与我们对话。机器人为我们工作的好处在于它可以 24 小时全天候为我们服务。实际上,现在的聊天机器人与客户的互动表现较差,因此我们应该尝试拆解这些聊天机器人的组成部分,并将其标准提高。对于应用类型的开发,你可以使用谷歌助手、亚马逊的 Alexa 或 IBM 的 Watson。但为了学习目的,让我们拆解这些组成部分,并集中关注关键挑战:

聊天机器人执行两个高级操作。一个是将语音输入转为文本,另一个是将文本输出转为语音。这两个操作都涉及提取实体和理解意图。在这个例子中,生成的文本是一个实体,而文本的意义则是意图。它代表了服务请求者和服务提供者之间的对话。当面对一个服务请求时,聊天机器人将语音指令转为文本,并为接收到的信息添加上下文。一旦上下文构建完成,聊天机器人就会处理这些信息并生成文本格式的输出。然后,聊天机器人必须将其转换为可听见的语音输出,呈现给服务请求者。整个场景在前面的图示中已做解释。

现在,让我们只专注于聊天,不考虑语音识别和语音输出——也就是说,我们忽略语音转文本和文本转语音。在我看来,由于这个任务涉及大量的机器运算和内存消耗,而且数据在许多地方都可以获取,这个任务不适合初创公司去做;相反,我们应该将其交给具备强大基础设施的主流云服务提供商来提供服务。

对于仅文本聊天,关键的重点应放在意图分类和实体提取上。虽然我们在上一章中已提及实体提取,但输入仍然需要在提取之前进行分类。意图分类与实体提取的工作原理类似,但将整个句子作为一个实体进行分类。

虽然使用 ChatterBot 或 RasaNLU 来运行聊天机器人是非常常见的,但我们可以从下往上分解这些组件来运行。

假设我们是一个简单的银行,提供存款和贷款服务。我们正在构建一个只能为现有客户服务的简单聊天机器人,目前我们只有两个客户,一个叫做abc,拥有存款账户,另一个叫做bcd,拥有贷款账户:

abc 的存款余额为 100 个单位,定价为 1,而 bcd 的贷款余额为 100 个单位,定价为 2。

使用自然语言处理和图谱进行知识管理

从本质上讲,我们有两种方法来检索和更新我们现实世界的知识。一种是将知识存储在向量空间中,并在运行时使用诸如 Word2Vector 和 BERT 等程序将文件读取到内存中。另一种方法是将知识加载到图数据库中,例如 Neo4j,并检索和查询数据。这两种方法的优势和劣势在于速度和透明度。对于高速主题分类,内存模型表现更好,但对于需要透明度的任务,例如银行决策,数据更新需要完全透明和永久记录。在这些情况下,我们将使用图数据库。然而,就像我们在第七章中简要介绍的例子Sensing Market Sentiment for Algorithmic Marketing at Sell Side一样,需要使用 NLP 从文档中提取信息,然后才能将信息存储为图格式。

实际实现

以下是完成此示例的步骤:

  1. 使用 Cypher 语言将 csv 文件导入数据库。我们假设 CSV 文件是从传统 SQL 数据库中导出的。以下是从命令行执行的命令:
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
  1. 打开浏览器并导航至 http://localhost:7474/browser/。然后,创建一个 username 并设置一个 password。这将仅执行一次:
username: test, password: test
  1. 删除所有节点:
MATCH (n) DETACH DELETE n;
  1. 创建客户数据:
LOAD CSV WITH HEADERS FROM "file:///customer.csv" AS row
CREATE (c:Customer {customer_id: row.customer});
  1. 创建产品数据:
LOAD CSV WITH HEADERS FROM "file:///product.csv" AS row
CREATE (p:Product {product_name: row.product});
  1. 加载 CSV 文件:
LOAD CSV WITH HEADERS FROM "file:///edge.csv" AS line
WITH line
MATCH (c:Customer {customer_id:line.customer})
MATCH (p:Product {product_name:line.product})
MERGE (c)-[:HAS {TYPE:line.type, VALUE:toInteger(line.value)}]->(p)
RETURN count(*);
  1. 匹配并返回数据:
MATCH (c)-[cp]->(p) RETURN c,cp,p;

Cypher 本身是一种语言;我们所做的基本上是创建产品和客户。然后,我们加载另一个连接客户和产品的文件。

  1. 我们将连接到刚刚填充数据的Neo4j数据库。参数遵循默认设置。请注意 Cypher 的独特语法。此外,加载了 NLP 模型以用于输入指令的相似性分析。Cypher 查询存储在字典中。读取意图后,检索查询字符串。然后,我们使用图数据库构建知识:
#import libraries and define parameters
from Neo4j import GraphDatabase
import spacy

#define the parameters, host, query and keywords
uri = "bolt://localhost:7687"
driver = GraphDatabase.driver(uri, auth=("test", "test"))
session = driver.session()

check_q = ("MATCH (c:Customer)-[r:HAS]->(p:Product)" 
 "WHERE c.customer_id = $customerid AND p.product_name = \
  $productname" 
 "RETURN DISTINCT properties(r)")
...
intent_dict = {'check':check_q, 'login':check_c}

#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')
  1. 用户应使用 SQL 数据库正确进行身份验证和标识。为了便于说明,我们将使用GraphDatabase,但显然使用GraphDatabase进行身份验证是不正确的,因为我们希望将大量数据与用户名和密码存储在专用表中,其访问权限设置为少于数据库上总人数的个体。以下是验证用户的代码片段:
if name == '' or reset:
    name = input('Hello, What is your name? ')
    print('Hi '+name)
    #check for login
    query_str = intent_dict['login']
    result = session.read_transaction(run_query, query_str, name, \
                                 product, attribute, attribute_val)

句子意图和实体提取利用 spaCy 进行相似性分析。基于预训练的词向量模型,意图和实体的保留词与输入的句子进行比较,以提取相关的意图和实体。该模型过于简化,读者有足够的创作空间,通过使用更好的语言模型,如 BERT,来增强提取工作,假设我们已经制作了相关的模型来执行相关的分类任务。

以下是提取实体并添加意图的代码片段:

#Sentences Intent and Entities Extraction
input_sentence = input('What do you like to do? ')
if input_sentence == "reset":
    reset = True 
entities = intent_entity_attribute_extraction(nlp, input_sentence, \
                         tokens_intent, tokens_products, tokens_attribute)
#actually can build another intent classifier here based on the scores and words matched as features, as well as previous entities
intent = entities[0]
product = entities[1]
attribute = entities[2]
attribute_val = entities[3]

交叉检查并进一步请求缺失信息

程序将不断地请求意图、产品和属性,直到这三项信息对程序明确为止。在每个参数的分类下,我们使用 Word2vec 进行简化的分类。实际上,我们可以运行一个一流的话题分类模型,例如 BERT,来理解语言和话题。

以下是请求用户提供缺失信息的代码片段:

while intent == '':
    input_sentence = input('What do you want to do?')
    entities = intent_entity_attribute_extraction(nlp, input_sentence, \
                     tokens_intent, tokens_products, tokens_attribute)
    intent = entities[0]

while product == '':
    input_sentence = input('What product do you want to check?')
    entities = intent_entity_attribute_extraction(nlp, input_sentence, \
                     tokens_intent, tokens_products, tokens_attribute)
    product = entities[1]

while attribute == '':
    input_sentence = input('What attribute of the ' + product + \
                        ' that you want to '+intent+'?')
    entities = intent_entity_attribute_extraction(nlp, input_sentence, \
                      tokens_intent, tokens_products, tokens_attribute)
    attribute = entities[2]

提取答案

当所有信息填写完成后,将执行 Cypher 查询,信息将呈现给用户。以下是提取答案的代码片段:

#execute the query to extract the answer
query_str = intent_dict[intent]
results = session.read_transaction(run_query, query_str, name, \
                                    product,attribute,attribute_val)
if len(results) >0:
    for result in results:
        if result['TYPE'] == attribute:
            print(attribute + ' of ' + product + ' is '+ \
                  str(result['VALUE']))
else:
    print('no record')

交互样本脚本

以下片段展示了用户的输入和输出。它旨在展示 NLU 如何使用密切相关的词汇提取意图和实体,得益于 spaCy 字典使我们能够找到相似的词汇。这个示例的关键是展示,对于那些需要在做出决策之前获得完整信息的情况,图数据库允许我们管理对话并在执行任何指令以服务用户之前跟进缺失的信息。这在做出专业决策时非常重要,因为我们需要其推理过程对机器能够理解的语言具有较高的透明度和准确性。以下是聊天机器人的样本对话片段:

loading nlp model
Hello, What is your name? testing
Hi testing
Failed to find testing
Hello, What is your name? abc
Hi abc
What do you like to do? do sth
matching...

What do you want to do?check sth
matching...
check 
What product do you want to check?some product
matching...

What product do you want to check?deposit
matching...
 deposit 
What attribute of the deposit that you want to check?sth
matching...

What attribute of the deposit that you want to check?pricing
matching...
 pricing
pricing of deposit is 1

恭喜!你已经构建了一个非常简单的聊天机器人,它可以向你展示聊天机器人的核心功能。

我们使用的示例非常好地反映了我们在商业银行中使用借款人和存款人数据结合强化学习的起点。当时,数据是在运行时存储在变量中的。现在,我们展示了将数据存储在图形数据中的另一种可能性。事实上,与第三章中“使用特征和强化学习来自动化银行融资”的示例相比,如果我们将数据存储在图数据库中,而不是 Python 程序中的变量中,强化学习的速度会较慢。因此,我们将使用图数据库,但仅在生产和应用级别使用,当个别对话可以容忍相对于计算密集型训练阶段的延迟时。

总结

在本章中,我们学习了自然语言处理(NLP)和图数据库,并了解了分析客户数据所需的金融概念。我们还学习了一种名为集成学习的人工智能技术。我们通过一个例子来预测客户的响应,使用了自然语言处理技术。最后,我们构建了一个聊天机器人,能够 24/7 为客户提供服务。这些概念非常强大。NLP 能够让程序理解人类自然使用的语言。而图数据库则有助于设计高效的算法。

在下一章中,我们将学习在构建模型来解决日常挑战时需要考虑的实际因素。此外,我们还将讨论在为数据科学家提供与 IT 开发人员互动的语言时,涉及到的实际 IT 考虑因素,这些开发人员将算法应用到现实生活中。

第十章:现实世界中的考量

本章是本书的结论。它总结了我们即将生活的近未来银行世界。我们还将提供一些有用的提示,介绍在日常生产环境中融合这些人工智能引擎所需的考量因素。这部分对应于 CRISP-DM 中的业务理解步骤,CRISP-DM 是我们在第一章中介绍的实现任何数据挖掘项目的方法,人工智能在银行业中的重要性

在本章中,我们将首先总结你在第 2 至第九章中学到的技术和知识,然后我们将讨论一些前瞻性话题,这些话题将延续我们在银行业的旅程。这些将要讨论的主题和知识包括:

  • 涵盖的技术总结

  • 对银行从业人员、监管者和政府的影响

  • 如何提出特征并获取领域知识

  • 与人工智能部署相关的 IT 生产考量

  • 寻找更多应用场景的地方

  • 哪些领域需要更多的实践研究?

涵盖的技术总结

在银行业务领域,我们已经涵盖了相当多的数据和人工智能技术。我们也通过了模型,但极少使用复杂的公式或术语。

人工智能建模技术

我们已经涵盖了统计模型、优化和机器学习模型。在机器学习模型中,我们涵盖了无监督学习、监督学习和强化学习。关于监督学习模型运行的数据类型,我们涵盖了结构化数据、图像和语言(自然语言处理)。关于数据处理,我们也介绍了帮助我们的多种抽样和测试方法。现在,我们将回顾本书中迄今为止涵盖的人工智能建模技术:

  • 从监督学习开始,这是一个在处理之前对输入数据进行标记的技术。模型被构建以从标签中学习,以便下一个输入数据集可以自动完成标记。另一方面,无监督学习不对输入数据进行标记。它没有标记或经过训练的数据。处理是通过基于模式和重复识别对象来进行的。

  • 强化学习基于实现下一个即时目标并评估与最终目标的距离。这项技术需要来自用户的即时反馈或输入,以达到最终目标。

  • 人工神经网络是一个模仿人脑神经网络的概念。人脑中的神经元在人工神经网络中由节点表示。

  • 深度学习是机器学习和人工神经网络的一个领域。深度学习算法使用多个层次从原始输入数据中提取更高层次的信息。

  • CRISP-DM 是数据挖掘的标准,代表跨行业数据挖掘标准。它提供了一个结构化的方法来规划数据挖掘和数据分析项目。

  • 时间序列分析是一种预测技术,依赖于特定时间间隔内捕捉的历史数据。在时间序列分析中,我们决定一个观察参数,并在特定时间间隔内捕获该参数的值。例如,这可以是银行分支机构记录的每月支出。

  • 自然语言处理(NLP)关注人类语言与机器语言之间的对话。一个能够理解并解释人类语音并执行命令的语音转文字引擎可以是 NLP 的一个例子。

  • 最后,集成学习通过使用多个机器学习算法,获得比单一机器学习算法预测更优的预测结果。

对银行业从业人员、监管机构和政府的影响

我们已开始了在商业银行(第二章,时间序列分析和第三章,使用特征和强化学习自动化银行融资)、投资银行(第四章,资本市场决策的机械化和第五章,预测投资银行家的未来)、证券销售与交易(第六章,使用 Treynor-Black 模型和 ResNet 进行自动化投资组合管理和第七章,感知市场情绪以支持卖方算法营销)、以及消费银行(第八章,通过银行 API 构建个人财富顾问和第九章,客户生命周期财富的批量定制)等领域的银行业。此部分通过一位企业客户——杜克能源公司——的案例,展示其从商业银行业务到投资银行业务的过程。在投资银行中,我们首先介绍购买公司发行证券的投资群体,然后在第六章,使用 Treynor-Black 模型和 ResNet 进行自动化投资组合管理和第七章,感知市场情绪以支持卖方算法营销中完全转向投资方的内容。讨论投资话题时,我们会将其延续到最后两章编程内容——第八章,通过银行 API 构建个人财富顾问和第九章,客户生命周期财富的批量定制——并深入聚焦财富管理的视角。

最后一章帮助我们聚焦于客户端的数据聚合问题。从本质上讲,所有银行的客户——个人、企业和机构——都将以集中化的方式拥有并管理他们的数据,以培养他们自己的资产——数据。

消费者市场帮助我们看到推动数据管理前沿的各种组件类型。而对于机构和企业而言,涉及法律实体的数据要复杂得多,因此需要更好的知识管理模型来组织描述企业数据的深度。

实际上,如何组织与商业和机构相关的数据已经不再是知识管理时代讨论的话题,尽管它曾是 2000 年代初商业学校中一项蓬勃发展的议题。

在知识管理领域曾提出了许多模型和框架,但许多组织缺乏通过最小化努力来收集这些知识的技术解决方案。当时我在一家咨询公司工作,亲眼目睹了维护知识体系的痛苦,而知识体系是咨询行业的核心资产——商业诀窍。现在,随着我们计划让机器变得智能并做出专家级别的金融决策,我们将重新回到这一话题。当我们能够明确地以数据质量管理的名义维护这些机器时,机器人的边界将得到拓展。

对银行从业者的影响

关于银行当前使用的商业模式的不断争论正在进行中。我个人的观点是,关于前瞻性风险和回报预测的核心决策依然存在。归根结底,我们需要一家银行来为未来的活动提供资金,而在做出金融决策时,这些活动并非完全确定。我们还在做出有关未来财富的决策,而我们也无法完全掌控这些财富。变化的是,随着机器的出现以及这些专家决策数量的快速增加,这些决策逐渐被交给了外行人,风险和回报视角的更新速度也变得更快。

今天的银行业,不仅是银行从业者,政府、监管机构以及消费者也将共同推动边界的扩展,创造更加高效的金融市场,实现数据的自由流动,并明确数据的所有权和技术,以便在各行各业的决策中赋予数据的价值。

在整个行业中,根据 Michel E. Porter 的五力模型,开放 API 仍然是现有企业的痛点,而对于新入行的公司来说,这是一个竞争定位中的争议话题。

除了开放银行 API,它只是获取数据的一个通道,目前并没有对银行数据标准进行有价值的讨论,尤其是对于客户和客户而言。的确,API 看起来很时髦,但它们也带来了一个巨大的问题,那就是如何处理客户为自身利益存储数据的问题。考虑到数据的可用性将会在能够组织和不能组织的群体之间产生分化,个体客户考虑这个话题似乎并不理想。

监管者的影响

曾经银行的指令是尽力而为的时代已经过去;如今,模型和验证机制已经到位,以保证服务质量并保护投资者利益。投资者需要知道哪些特征可能会在金融估值中引发波动。也许时效性成为了关键,而不是期待银行对可能发生的事件有明确看法?银行设定的关于风险事件的概率是可以验证的。

政府的影响

我们如何提供技术,允许个人拥有自己的数据?政府在存储个人身份以及所有足迹方面如何发挥主导作用?个人数据标准有助于减少分享、存储和让个人管理自己数据的经济成本。

欧洲的 GDPR 是一项很好的法规,但它本质上缺乏执行它所需的技术,就像知识管理的情况一样。同样,描述公司、企业、机构和公共市场之间互动的数据将被视为政府提供的公共设施,因为证券交易所拥有这些数据。

按照公共利益的理念,目标不是赚取巨额利润,而是提供促进其他经济活动的公共服务。我认为,政府在公共领域数据分发方面应有更多干预。这将为机器人提供更为友好的工作环境,因为数据可用性问题是整本书的核心。我们不难发现,它在所有经济活动领域中对 AI 应用的推动产生了更大的阻力。为了平衡这种与数据相关的开放性,我们同样需要对数据进行更好的控制——无论是对公司还是个人来说。

开放数据运动已经成为一个热门话题,旨在使数据更易获取。开放政府数据可能涉及诸如证券交易所数据等问题,这些数据有时由某些准政府组织在特定的许可证或规定下运营。同样,开放银行数据也是全球金融监管机构的推动力,目的是为银行客户提供他们自己的数据。

从实践层面来看,数据是人工智能的关键要素,在某些情况下,数据经过清理、维护,并作为一种费用由纳税人支付!然而,数据维护所花费的资源也取决于能够在自动化和更好决策方面节省成本的人工智能应用场景。根据这一简单逻辑,必须有人来付费:要么通过政府预算中的共享资金池(即纳税人,包括你),要么通过使用数据的人(又是你!)。而数据可访问性面临的挑战之一就是跟踪其使用情况。如果我们想让任何使用过数据的人为每个特定数据点甚至字段层级支付,这就容易得多。

人工智能可能是明日的电力,但数据将首先作为今天的电力提供。

如何提出特征并获取领域知识

在到目前为止的所有章节中,我们并没有解释我们从哪里获得这些领域知识。一个典型的人工智能项目需要我们站在金融专业人士的角度来思考。那么从哪里开始呢?以下是一个帮助你入门的清单:

  • 教科书和培训课程:最简单的路径是遵循这些专业人士的培训方式。这些课程包含了各自工作类型所需的术语、方法和流程。

  • 银行与金融领域的研究论文:当谈到寻找正确的数据时,金融和银行领域的研究可以证明是一个非常有价值的资源。它不仅能告诉你从哪里获取数据,还能展示那些具有强大预测能力的特征。然而,我通常不会迷失在各作者和市场之间特征的不一致性中。我只是尽可能多地将它们全部包含在内,并且有研究者的理论支持。

  • 观察仪表盘:商业智能(BI)捕捉了对人类用户有意义的关键特征。这些 BI 报告中使用的数据字段是能够生动描述由人类专家规定问题的好特征。

  • 程序手册:如果你在一个已经建立了流程和程序的组织中工作,那么程序手册就是一个宝贵的资源,能够描述人类如何工作,尤其是那些处理密集型工作的过程。

  • 机构:有些人说设计思维,有些人说这仅仅是将自己置于他人角度,试图以假设性的方式进行任务处理。

  • 观察儿童发展:如果任务涉及感知和传递信息等方面,我们可以观察人类如何学习构建这些要素,并理解神经网络架构应该是什么样子的。

  • 寻找 Excel:Excel 已成为商学院中的主流工具,是一种半标准化的决策方式,尤其在金融建模领域。这是理解人类如何做出决策及其复杂规则的一个良好起点。

以上几点涉及商业领域的考量,但我们还需要考虑推出该模型的 IT 方面。

与人工智能部署相关的 IT 生产考虑事项

如果算法没有在银行的日常决策中运行,那么人工智能只是一个文件。当然,趋势是将人工智能作为服务提供给编写程序的软件开发者。除此之外,还有一系列需要关注的事项:

  • 加密:数据至关重要,所有人工智能都运行在敏感数据上。尽管数据在通过 Scaler 将其转换为 0 到 1 的范围时已经在一定程度上匿名化,然而,确保数据在网络传输过程中加密并且保存在加密的数据库中,仍然至关重要。

  • 负载均衡:需要正确处理请求的容量,并且创建足够的服务器来运行算法。随着越来越多的公司采用云服务商的无服务器架构,这个问题在一定程度上得到了缓解。然而,这个问题仍然存在,只是被外包了。作为一名工程师,要理解容量和如何处理负载,体现的是服务的水平。我们希望的是一台永远在线的智能机器人,而不是一个在关键时刻消失的智能引擎。为了实现这一点,需要理解使用流量、硬件和软件容量规划,并能够根据流量变化执行这些任务。

  • 认证:组织通常会有自己的认证偏好,这可能会对客户体验产生较大影响,同时安全问题仍然是关注的重点。

如何寻找更多的使用案例

本书列出的人工智能应用主要集中在前台银行服务,后台处理工作没有被详细讨论。退一步来说,如果你想启动自己的项目,你应该在哪些方面寻找机会呢?

  • 长时间工作;枯燥的工作:枯燥意味着重复,而这正是机器能够发挥优势的地方,数据也非常丰富。

  • 庞大的劳动力:在商业案例中,寻找就业量大的职位是比较容易的。这意味着巨大的商业潜力和易于证明的实施可行性。这对人力资源专业人士来说构成了巨大的挑战。

  • 高薪:如果我们希望让金融变得更加可及,是否能使这些高薪工作更具生产力?以投资银行家、安全结构师和对冲基金交易员为例,如何减少他们的非生产性时间?

  • 独特的数据集:如果数据集无法为外部人员所访问,那么领域可能不会得到关注,因为研究人员和初创公司无法发现这个问题。

哪些领域需要更多的实际研究?

在某些领域,本书已经达到了研究的瓶颈,这些研究领域可能有助于推动银行业中人工智能应用的发展:

  • 自主学习:人工智能将取代人工智能工程师的工作——因为机器将能够学习。鉴于如今数据的丰富性,机器将自行采用其网络结构。

  • 透明 AI:随着机器开始做出决策,人类将要求关于决策过程的透明性。

  • 知识体系:在专家知识的情况下,进一步的研究将探讨组织如何利用人工智能生成知识体系。从实践角度来看,存储在 BERT 或任何语言模型中的 Wikipedia 形式并不适合人类消费或知识培养。那么我们如何将知识图谱压缩成神经网络,反之亦然?

  • 数据掩码:为了使数据能够自由流动和交换,一个灵活的数据掩码机制至关重要,该机制可以保留字段内及字段之间的分布特征。它允许数据与研究人员共享,甚至开放给智能数据科学家进行攻击。与良好掩码机制相关的一个次要问题是,数据拥有者是否可以与研究社区共享其数据,以便解决现实世界的挑战?这是否被视为捐赠,因此可以税前扣除?

  • 数据聚合与标准化:如本章前面所述,这描述了客户数据如何被标准化,以及个人和公司如何拥有并管理其数据。

  • 跨学科任务聚焦应用:为了发现更多的研究课题,来自不同学科的研究人员合作解决任务聚焦问题至关重要,而不是仅仅围绕解决单一研究课题的数据集进行工作。

  • 数据生命周期技术:由于数据在许多地方被使用,并且在不同系统间被修改、更新和复制,我们是否拥有合适的技术来跟踪所有这些数据的流动?一旦我们能够跟踪其流动,就可以将数据的价值归属于供应链中的数据贡献者,从而激励数据生产。有人提倡使用区块链,但将大量数据保存在区块链上似乎不太实际。

摘要

本书旨在通过公共领域信息,展示目前在技术方面的可能性。我希望它能够帮助培养人才和研究人员,以支持行业发展。同时,它也为任何潜在的初创企业创建了一个基准水平,企业需要超越这个水平才能够符合资格。由于书中的所有代码现在都是开源的,我很高兴在技术解决方案方面处于性能的底部!

有很多书籍仅仅是富有远见的,还有一些书籍讨论了技术考虑,但却未触及问题的核心。还有一些书籍充满了数学和公式,涉及加密知识。这本书的目的是填补远见和技术考量之间的空白。我相信,未来的世代应当在一个 AI 乌托邦中学习,为改变我们的工作世界做准备。对于行业专业人士和希望提升技能的人们,我希望这本书能够提出一些值得关注的领域,进一步巩固他们的知识。

这只是一个开始。

posted @ 2025-07-17 15:21  绝不原创的飞龙  阅读(131)  评论(0)    收藏  举报