十二、将零售机器学习货币化
在这一章中,我将提出一些创新的想法,这些想法可以利用机器学习来实现货币化。我还将向您展示一些使用类似方法并取得成功的例子。
货币化的三个领域如下:
-
互联零售店
-
相连的仓库
-
协作社区移动商店
在某种程度上,正如我将进一步解释的那样,互联零售店和互联仓库的概念是相互联系的。但是,我们将分别研究它们,以便更详细地理解它们,然后看看它们如何协同工作。
互联零售店
为了让我们理解我所说的互联零售店是什么意思,让我们先了解一下什么是互联零售店。我也看到许多大公司有这种误解。
-
互联零售店不仅仅是将数字功能扩展到您现有的实体店。
-
互联零售店不仅仅是给你的产品添加 RFID 标签,并对消费者行为进行分析。
-
互联零售店不使用蓝牙或在线方式向购物的顾客发送产品和优惠。
-
互联零售店不会在顾客在店内购物时使用电话向顾客提供优惠。
在了解了什么是互联零售店之后,现在让我们来看看什么是互联零售店,以及我们是否有任何可以效仿或学习的例子。让我们来看看图 12-1 中一个真正互联商店的示意图。
图 12-1
关联商店图
在这个示例图中,我向您展示了一组五个相连的零售商店,它们属于任意一个城市中的一个零售组织。红线表示城市范围,蓝线表示同一社区或地区的商店。“互联商店”主题的核心概念是,每家零售店每天都有大量的商品和服务流动。
顾客走进一个城市不同地区的任何或所有这些商店。如果你熟悉零售业,那么你会知道不是所有的商店对任何给定的产品都有相同的销售额。例如,在图 12-1 中,我们可以让商店 A 比商店 E 销售更多的冷冻产品,商店 B 比商店 c 销售更多的牛奶和面包,也可能出现这样的情况,例如,在某些季节性周期中,商店 D 开始比任何一家商店销售更多的糖果和巧克力。某些地区对某些产品的需求突然激增,导致该特定商店的存货下架。为了照顾消费者的这些突然需求,我们可以有预测模型;然而,由于互联商店这一新概念,将商品从仓库运送到商店的物流(这是目前世界上所有主要商店的运营模式)将会发生变化。
现在让我们举一个联网商店系统如何工作的例子。假设在节日期间,两家商店(商店 E 和商店 A)的巧克力和糖果的货架销售水平较低。商店 E 知道,在过去的一周里,对巧克力和糖果的需求很大,因此在接下来的一周里,它很可能会缺货。在连接商店的情况下,商店经理自动向中央零售商店系统提出请求,以根据下周的预测需求获得更多的糖果和巧克力。在传统的零售商店组织中,这种需求将被送到中央仓储系统,然后中央仓储系统将在库存到达时慢慢满足各个商店的需求。考虑到整个城市中只有两家商店对巧克力和糖果的需求增加了。还有三家商店,它们的货架上有过多的存货,而消费者目前并不购买。现在,商店经理可以申请中央零售商店系统,并立即从商店 B、C 和 d 获得下周的库存。
然而,在不同地点的不同商店之间移动货物会有物流方面的挑战,因此可以开发一种机器学习算法,该算法可以根据商店的地理位置查看商店之间的距离,然后计算最近的商店,该商店具有超过申请商店经理所要求的特定产品的货架容量。在我们的例子中,在图 12-1 中,我们可以看到商店 B 离商店 A 最近。因此,通过将一些多余的产品从商店 B 转移到商店 A 来满足商店 B 和商店 A 之间的巧克力和糖果需求是有意义的。由本地商店算法来确定商店 B 中有多少多余的库存,在确定了多余的数量后,它接受来自商店 A 的征用请求,并准备好其送货无人机来将多余的产品从商店货架上推出。这只是这个系统如何运作的一个例子。然而,一旦这个系统实现自动化并建立起来,它将为在城市中拥有多个商店的组织节省数百万美元。商品将根据算法序列和机器学习模型从一家商店转移到另一家商店,这些模型预测需要保留在特定商店的最有效数量。拥有这种连接的商店系统的主要优点是减少商店货架上的过期或即将过期的商品。另一个优势是及时满足需求,从而增加顾客对商店的信心,并提高收入和顾客忠诚度。该系统还将降低产品在组织仓库和零售店的仓储成本。
这些是互联商店系统通过实现最新技术(如机器学习和人工智能)可以实现的一些巨大优势。我在沃尔玛、梅西百货或其他零售连锁店中找不到这种联网商店的伟大实现。一家正在使用无人机、机器学习和人工智能的公司是亚马逊,过去几年开设的亚马逊 go 商店 [1 ]确实使用无人机送货;然而,在公共领域,尚不清楚他们是否通过利用无人机的力量在各个零售店之间移动产品。我所说的联网商店和 Amazon go [1 ]实现的商店之间的区别是商店的前端和后端。Amazon go 讲的是不排队,不结账;但是,我说的不是那种客户体验。我说的是商店的后端运营,以创造当前零售商店运营的效率和可预测性,从而降低成本并增加长期收入。
相连的仓库
现在我们来看下一个概念:互联仓库。这种连接仓库的概念也是零售店运营后端系统的一部分。我这里要给出的思路,也和之前的互联商店的思路有关;然而,这里我谈论的是连接任何组织的零售商店操作的不同仓库。在这个机器学习和 AI 操作中,我正在展示一个公司的不同仓库如何根据一定的标准进行内部连接。让我们以任何一家大型零售公司为例,比如塔吉特或沃尔玛;他们在一个城市里有不同的商店,为了服务这些商店,有一个对顾客不可见的仓库网络。一些仓库位于零售店的后面,一些仓库位于市区或郊区之外。这种仓库网络的目的是能够为特定城市范围内的零售店提供服务。任何给定的公司都可以在城市范围之外建立仓库,因为那里满足了对廉价土地的需求;然而,在后端运营中,我们知道如果我们不管理存储在各自仓库中的商品和服务的数量,那么整个零售系统将变得低效,并将花费公司大量的美元来维护。大多数这种规模的组织都有内部库存管理系统;这不是我在这里谈论的。我说的是连接同一家公司在一个城市或多个城市的不同仓库,以某种方式,基于机器学习和基于人工智能的系统根据季节性需求或特定商品和服务需求的任何随机峰值,预测城市每个地方对特定商品和服务的需求。现在请看图 12-2 来理解连接仓库图。
图 12-2
关联仓库图
为了更好地理解这个系统,我现在将借助一个例子来解释整个系统是如何工作的。让我们假设在图 12-2 中,一个给定的组织在城市的郊区有两个仓库。在一号仓库中,对冷冻产品的需求预计在下个月会大幅增加。在另一个仓库中,有一个对家庭清洁用品的预测需求,该需求预计在下个月会上升。机器学习和人工智能系统会查看这两个仓库中每个仓库的当前库存水平,然后查看这些仓库中每个仓库下个月的预测需求,然后拟定那里的多余物品数量,并传输到各自的位置。如果它发现仓库位置 2 的数量比冻结商品所需的数量多,那么它将命令系统将商品从位置 2 移动到位置 1,以获得过量的产品。同样,运输方式可以基于使用能够运载大量货物的大型无人机。同样,我没有看到这个概念直接用于仓库的实际应用。我们知道,亚马逊正在利用这一点进行从仓库向消费者交付商品的操作。我看到的一个技术限制是大型无人机的可用性,以及公司为使其具有商业可行性所需的法律手续。但这种程度的运营将不得不开始,因为世界各地的道路正被交通堵塞,零售业务需要在仓库地点之间送货,这种方式通过航空比通过公路更快。从长远来看,这种投资将在降低成本和增加收入方面产生巨大的效果。存储低需求产品的成本下降,将需求产品转移到需求最大的仓库会提高客户忠诚度,因为他们看到需求最大的产品的等待时间减少了。我在这次行动中没有讨论的一个方面是行动的供应方面,我假设货物的供应可以根据需要从制造商那里获得。
协作社区移动商店
技术将使现在创造飞入式零售店的概念成为可能,我现在就要谈到这一点。这家商店将是一个自动化系统,将由零售商店组织使用两种技术进行监督:一种是小型飞行汽车,另一种是自动飞行或自动驾驶技术。当这两种技术结合在一起时,将会给我们带来我称之为飞行商店的东西。
在我开始列举和讨论你如何将这个概念货币化之前,我们先来看看这个概念本身的必要性。我们知道在今天的现代社会中有三个主要问题,人们必须在工作场所工作更长的时间,并且这种趋势在全世界范围内每天都在增长。另一个趋势是道路上的交通,在高峰时间和其他时间,交通也在增加并堵塞道路,使人们外出购物成为一场噩梦。第三个问题是,在特定的社区或地区,商店没有与居住在那里的居民合作。
让我们看看飞行商店如何帮助大型零售组织解决消费者的所有这三个经常导致销售额下降的问题。
人们越来越忙,他们需要在工作场所或家庭附近购物,因为他们在那里度过了大部分的工作或个人生活。在工作日,他们没有时间经常去商场或其他零售商店;因此,他们需要在离工作场所或家很近的地方购物。飞行商店肯定有助于解决这个问题,因为它可以自己飞到任何人集中的地方,如大型办公大楼或大型公寓大楼。商店的这种能力,其中消费者不去商店,而是商店来找消费者,实际上是要通过它的实现来扭转零售游戏。这是一个等待实现的想法,首先实现它的零售链将获得主要的收入销售增长。
飞行商店能够解决的第二个问题是,由于道路上的交通流量大,人们不会来商店。飞来商店搬到指定的社区,当地人可以在方便的时候来购物,这对他们来说是一大优势。想象一下,如果一个人来上班,迎接他的是一家飞来商店,里面有他们一直想从公寓附近的当地杂货店或时装店购买的产品。这家商店还可以飞到当地的大型公园,停在那里,让附近的市民来购物。这种就近购物的额外便利将使这个想法获得巨大成功。因此,我们将交通堵塞带来的街道堵塞问题转化为零售店的优势,因为零售店现在更贴近消费者,能够在他们更方便的时候送货。这种飞行商店的另一个优点是,汽车也可以在主要的商业中心附近停下来,这些商业中心集中了在其中工作的员工。在空闲时间(例如,午餐休息和咖啡休息),这种商务中心的员工可以在他们方便的时候购物。这里的优点是他们不必为了给家里买东西而在车流中等待。当然,这可能不适用于像家用电器这样的大件物品,但肯定适用于家庭杂货等物品。
我们已经知道美国的购物中心正在关闭,这一趋势的主要原因之一是人们没有时间去购物。随着飞入商店的实现,商店走向人民,而不是人民来商店。为了顺利实现这项技术,我们需要小型自动驾驶或飞行汽车,它们可以避开交通,进入任何地方,正如零售组织的中心主题所要求的那样。
这家自动驾驶的飞来零售店要解决的第三个问题是基于社区的合作。让我进一步解释一下我所说的基于社区或基于地区的协作。我们主要讨论两个实体,一个是零售商店组织,另一个是当地的居住社区。住所可以属于任何城市的任何主要社区;然而,如果你去任何一个购物中心或零售商店,他们很少与当地居民互动,也不会与他们或他们的当地需求进行交流。
我强调这种当地社区合作,因为我从零售数据中看到,当地社区或当地居民在不同时间对产品的需求通常不同于城市其他地区。例如,与位于不太富裕地区的商店相比,位于更富裕地区的商店可能需要存储不同类型的高端产品,甚至外来类型的产品。每家零售店都明白这种差异,并相应地花费时间进行销售。这只是一个基于经济标准划分的例子;然而,这种消费者和地区的划分不仅仅局限于他们的财务背景,还可以细分为季节性需求,例如由于天气条件的变化,在特定季节对特定种类的物品的高需求。这就是我们需要机器学习和人工智能的帮助,根据消费者的本地需求挖掘数据,并在这种模式再次出现时预测他们对某些商品的需求。需要对这些数据进行深入研究,并提供给城市中每个地区的零售组织。当然,零售店可能不会将目标锁定在一个城市的所有地区,而是可以选择在他们发现对其产品的需求将会很高的特定地区锁定和销售他们的产品。
大型零售组织目前缺少的地区或社区协作的另一个方面是利用基于地区的产品需求数据的能力。让我举一个例子来进一步解释我的意思。比方说,美国的一家大型零售店希望向马里布的居民销售其产品,马里布是洛杉矶最高档的社区之一,有许多名人居住在那里,该商店需要利用该社区名人居民需求的主要商品的数据,而不仅仅是该社区特有的季节性或任何基于模式的需求。为了找到关于一个地方或一个社区中人们的好恶的信息,数据将需要利用该地方居民的本地社交媒体数据。一旦它有了关于这个社区的居民的好恶的反馈,数据现在就可以寻找目标,并为它希望在这个社区进行的即将到来的零售销售活动做广告。同样,社交媒体广告可以用来让市民意识到并产生对事件的认识。正是零售组织未来销售产品方式的这种变化,将带来高收入方面的重大红利,目标需求将得到目标供应的满足。商店可能不再出售“所有的东西”,而只出售特定社区居民所需要的东西。零售店现在正与当地社区合作,关注他们的当地需求,并通过频繁的飞临零售活动满足他们的需求。
当然,当零售商店组织将其销售集中在它认为适合举办飞行活动的特定社区时,它还必须通过当地社区广告牌广告或向各种社区中心派遣社区工作人员来与当地居民互动,居民聚集在社区中心参加活动,以便让他们知道未来将发生的任何活动。这还不包括针对居民的社交媒体活动,当飞行活动启动时,这将有助于他们取得巨大成功。
这并不局限于飞行汽车;我们还可以拥有自动驾驶的移动巴士零售店,这些零售店经过改装后可以为消费者提供环境零售体验。这种技术实现的一个例子是 Robomart [2 ],它正在等待法律障碍的消除,然后才能投入运营。
尾注
-
亚马逊 Go 商店:
https://www.amazon.com/b?ie=UTF8&node=16008589011
-
Robomart-自驾零售店:
https://www.youtube.com/watch?v=FJMC40vkTTQ
十三、金融中的机器学习综述
几年前,一位来自东南亚地区的金融客户找到我,希望我能帮助他们进行机器学习,因为他们刚刚在自己的行业中实现了机器学习,而他们已经陷入了在金融咨询服务领域中实际实现机器学习算法的困境。在实现过程中,我研究了世界各地的金融行业,以便更好地掌握实现这项任务所需的条件。
即使在今天,机器学习和人工智能在金融行业领域的实现仍有很大的空间。
在非常广泛的意义上,金融服务[1; https://en.m.wikipedia.org/wiki/Financial_services
】根据维基百科的定义,由管理资金的企业组成。这些机构包括信用合作社、银行、信用卡公司、保险公司、会计公司、消费金融公司、股票经纪公司、投资基金和个人基金经理。当然,在我们的讨论中,我不会谈论与政府有关的金融服务。
就金融服务市场的细分而言,我将使用表 13-1 中描述的以下广泛细分。
从表 13-1 中可以看出业务方法的明显差异。
表 13-1
金融业的不同领域,广泛分类
|类型
|
焦点
|
服务和差异化
|
| — | — | — |
| 消费金融 | 提供个人贷款、间接融资,包括租赁和销售融资、信用卡发行商、典当行和发薪日贷款提供商 | 为商业和个人目的向个人提供无担保贷款。他们经营次级贷款,向有不良信用记录的个人提供贷款 |
| 资本市场 | 开展活动,包括交易、经纪、战略咨询、投资组合管理、资产管理和投资建议 | 主要充当中介,提供或管理资本,从而满足机构和个人的财务目标 |
| 多元化金融服务 | 提供金融服务,如金融咨询公司、投资研究公司、证券交易所和信用评级公司 | 他们的大部分收入来自某一特定领域的专业知识和专门活动 |
表 13-1 中金融服务业的市场细分 2;CFA 资深行业分析师兼编辑约翰·w·莫尔卡三世(John w . Molka III)2008 年版的一份报告称,金融服务业、次贷和信贷危机的影响很大。我们首先来看消费者金融部门,这是一组提供个人贷款的公司、间接信用卡发行商、典当行和发薪日贷款提供商。这份名单不包括抵押贷款和贷款公司。这些公司处理的主要项目是个人无担保贷款。当然,报告中给出的所有统计数据都是基于美国的;然而,这些百分比适用于所有发达国家。例如,截至 2007 年,消费金融公司持有 23%的消费信贷,这也适用于其他发达经济体。虽然这一统计数据看起来是 10 多年前的,但它让我们了解了消费金融公司在一个国家经济中的消费信贷中所占的份额。
下一个细分市场是资本市场,由从事股票交易经纪业务、战略财务顾问投资组合管理、资产管理和专业投资建议的机构组成。这些公司是中介,他们为其他金融机构或个人的目标而工作。这些公司包括投资银行以及股票、债券、衍生品和大宗商品交易。它还包括为全球个人和机构管理大量基金的资产管理公司。该部门的增长趋势是投资银行和证券交易以及证券经纪业务的增长。最大的服务类别是投资银行和证券交易,占总业务的 41%。该领域的一个日益增长的趋势是共同基金和投资的兴起,这一趋势在发达市场和新兴市场都可以看到。
这些公司主要从事金融咨询、投资研究、股票交易、评级和信用评级。这是一个有十大玩家的市场,像花旗集团、伯克希尔哈撒韦、高盛、摩根士丹利、摩根大通和美林。接下来是多元化金融服务部门。
既然我们已经了解了金融行业的广泛细分[2],我们现在将了解一些关键细分市场及其提供的价值主张。
金融分部
在图 13-1 的向下钻取财务报表图中,我们可以看到金融行业分为银行和非银行部门。
图 13-1
金融分部
银行业务由消费者贷款组成,这是一种非常结构化的业务形式,通过创建消费者的信用档案来确定消费者的信誉。如果发现信用状况有风险,则确定救助级别,只有这样才有可能在该部分进行贷款。接下来是商业贷款,这也是一种非常结构化的贷款形式,用于商业机构的投资和发展。虽然这种类型的商业贷款也有很多变化,我现在不打算进入它们。银行细分的第三种类型是电子支付。消费者和企业都通过电子支付银行系统进行电子支付,这些系统在每个国家都是本地的。消费贷款可以进一步分为信用卡贷款和担保贷款贷款。只有当一个人的信誉被确定后,银行才能发行信用卡,这样他们就可以永远使用信用卡,然后在规定的期限内修复信用卡。只有在确定了个人所持资产的信誉以及他们对过去可能获得的各种贷款的负债后,才能发放担保贷款。
在非银行领域,我们将细分市场分为咨询服务和股票市场。在咨询服务方面,我们再次将我们的细分市场分为信用咨询服务和投资咨询服务。信用咨询服务与机构、银行、国家和公司的信用评级有关。世界各地有各种各样的信用评级机构,它们都属于这一类别。投资咨询涉及对各种个人和组织持有的基金的管理和建议。这包括各种机构提供的投资组合管理服务和其他此类金融建议。股票市场涉及投资组合管理服务和经纪业务的一部分,可以是受监管的股票交易所和不受监管的股票交易所,就像区块链科技(如比特币)所使用的那样。在这本书的金融部分,我们将引用我们对金融行业细分的深入版本。
财务价值主张
根据谷歌词典的定义,价值主张是旨在使公司或产品吸引客户的营销和创新、服务和功能。
图 13-2
金融客户价值主张
组织提供的基于金融的服务对于银行和金融服务的消费者和企业具有不同的价值主张。这如图 13-2 所示。
在典型的财务组织结构中,有一些常见的部门,如消费者服务部、商业和投资服务部。特别是在消费者服务部门,进一步分为普通消费者和优质客户或特权客户。银行、金融咨询公司或投资组合管理公司等金融机构以这种方式区分消费者,并相应地提供不同级别的服务。我们现在将看看机器学习是如何在这些部门中应用的。需要注意的一点是,客户一般只面对营销部门或者客户支持部门,其余部门在后端工作。然而,在金融服务行业,有一种日益增长的趋势是为特权或高级服务客户配备专门的关系经理。
在图 13-1 中,我们已经看到了非银行细分市场下的服务类型,主要包括咨询服务(信贷和投资)以及与股票市场资本相关的服务。重要的是要明白,信贷和投资咨询服务既可以面向个人,也可以面向其他公司、组织或机构。基于消费者的是为个人提供的咨询服务,这些服务是根据个人的需求定制的。这些类型的信用咨询服务是优质服务,旨在为社会的特权人士。重点是提供信用信息,如评级,破产状况,财务分析,欺诈警报,以及其他此类服务。投资咨询服务以投资组合管理、资产管理服务和个人基金管理服务的形式提供。个人可以向该特定提供商购买咨询和管理服务,也可以从一家提供商购买咨询服务,从另一家提供商购买投资管理服务。通常,拥有高净值的消费者或个人通常更喜欢从同一家金融服务提供商那里获得投资咨询和管理服务。
金融服务的另一个细分市场或类别的价值主张属于电子支付类别。这些服务是通过互联网在各种网站上提供的在线服务,也是通过 Android 或 iPhone 等手机以基于应用程序的服务形式提供的。本类别所提供的电子支付或在线支付金融服务提供商[3; https://en.wikipedia.org/wiki/List_of_online_payment_service_providers
】更倾向于基于国家的提供商,真正能称自己为全球的提供商少之又少。这一类别中突出的是 Paypal、Payoneer、Apple Pay、Amazon Pay 和 Google Pay 等提供商,它们来自美国,但在全球范围内都有重要的业务。PayU 是另一个在全球有良好表现的公司;不过我们有一些区域性的,比如欧盟的信任,中国的支付宝。这份清单并不详尽;然而,还有更多在区域和地方有很深的存在。
这一领域的全球参与者增长如此之少的原因是,金融服务是一个受到高度监管的行业。世界各地的主要中央银行监管并提出规范、指导方针和法律提案来监管这些类型的服务。任何希望成为全球运营商的大型运营商,不仅必须了解,而且必须有能力在它希望运营的全球主要国家执行法规。我列出的全球参与者能够满足这些规范,因此他们能够建立一个全球基础。
有一些服务提供商只有在线存在;然而,也有一些基于应用的移动业务,比如中国的支付宝,它同时拥有移动和在线支付平台。Payoneer 提供电子钱包服务或数字支付服务,允许客户向其银行账户发送和接收资金,或将资金充值到预付费借记卡中。这家公司更关注全球的 B2B 支付。它现在被称为全球企业对企业数字交易系统的骨干。与 Payoneer 类似的是 PayPal,它允许在线转账,以取代支票和汇票。然而,Paypal 不仅关注企业对企业,也关注企业对消费者的交易。
在结束价值主张部分之前,我想提一下电子支付领域最近的发展,即区块链技术的出现,它带来了比特币和以太坊等虚拟货币。这些货币尚未被主要国家及其中央银行接受为支付方式,在韩国和印度等一些国家已被禁止。我不想深入讨论这些电子支付服务的争议;然而,你应该知道,世界上有很多新兴公司也在提供这些区块链货币的数字支付服务。其中最突出的是 Payza,它允许通过比特币或 altcoin 进行比特币汇票和向信用卡或借记卡转账。在我看来,这种认为大量非法交易是通过区块链类型的货币进行的看法将在不久的将来得到缓和,并将受到世界主要国家的监管。点对点或消费者对消费者的区块链技术更受用户信任,因为没有中央服务器或中央机构控制整个系统。在我看来,一旦世界各地的监管机构对技术的理解加深,人们不顾各国政府的监管和警告而采用技术,分散化的金融框架就是一个等待发生的未来。
金融领域的技术采用流程
图 13-3 描绘了取自本书医疗保健部分的技术采用流程。
图 13-3
技术采用过程
- 描述性分析 : 调用该分析字段以了解过去已经发生的项目问题的答案,例如 X 财务交易在过去处于什么状态?
传统上,金融部门一直使用描述性分析来为任何给定的服务类别生成有关其客户的报告,这在高层管理人员做出各种决策时产生了很大的影响,例如任何新的金融产品的目标客户是谁,我们如何针对竞争对手做出战略改变决策,以及最终客户如何看待我们的服务?所有这些问题都通过描述性分析得到了很好的回答。这与向管理层提供五位数摘要的趋势背道而驰[4; https://en.wikipedia.org/wiki/Five-number_summary
。例如,为了比较千禧一代和婴儿潮一代的消费模式之间的财务数据集,五位数摘要可以告诉我们这几代人的最低消费模式和最高消费模式有何不同。然后,高层管理人员就可以很容易地专门为他们定制金融服务产品。除非使用描述性分析,否则不可能提取此类信息。
产品销售报告、产品折扣报告、商店和产品销售报告是传统上使用描述性分析的一些例子。这种趋势不会消失。我们将看到描述性分析在零售领域的应用。然而,我们还将看到其他分析方法的出现,我将在下一节中讨论这些方法。在清单 13-1 中的简短示例 Python 代码中,我给出了一个如何使用财务数据五点汇总的示例。由于这是一个例子,我将采取不超过 10 行的数据;然而,在现实世界中,这将包含数百万用户的数据。所有消费价值均以美元和年值表示。
import numpy as np
bboomers = np.array([14230, 345, 1912, 472, 63, 861, 270, 713])
fivepoints= [np.min(bboomers), np.percentile(bboomers, 25, interpolation="midpoint"), np.median(bboomers),np.percentile(bboomers, 75, interpolation="midpoint"),np.max(bboomers)]
for fivepointsummary in fivepoints:
print(fivepointsummary)
Output:
63
307.5
592.5
1386.5
14230
import numpy as np
millennials = np.array([12519, 845, 912, 72, 93, 615, 70, 538])
fivepoints= [np.min(millennials ), np.percentile(millennials , 25, interpolation="midpoint"), np.median(millennials ),np.percentile(millennials , 75, interpolation="midpoint"),np.max(millennials)]
for fivepointsummary in fivepoints:
print(fivepointsummary)
Output:
70
82.5
576.5
878.5
12519
Listing 13-1Python Code for Five-Points Summary
在运行清单 13-1 中的 Python 代码后,我们看到的输出是,在我们的数据集中,婴儿潮一代的最低平均年支出是 63,第 25 百分位是 307.5,中位数是 592.5,第 75 百分位是 1386.5,在我们的数据集中,婴儿潮一代的最高年支出是 14,230 美元。在清单 13-1 的第二段代码中,我们看到千禧一代的最低消费是 70 美元,第 25 百分位是 82.5 美元,中位数是 576.5 美元,第 75 百分位是 878 美元,最高消费是每年 12,519 美元。在这样一个简单的比较中,一个确定谁花费更多的很好的指南例如,在我们的数据集中,婴儿潮一代花费最高;然而,他们的支出也是最低的,因此婴儿潮一代的离差高于千禧一代。婴儿潮一代的支出出现在清单 13-1 的最大和最小函数中。你会在实际数据集中发现这种情况。关键是要懂得解读和分析。中值在很大程度上说明了我们的数据集中婴儿潮一代和千禧一代的支出结构,与婴儿潮一代的 307.5 相比,婴儿潮一代的中值非常低,为 82.5。这意味着婴儿潮一代确实是更高的消费者,在我们的数据集中,中点线要高得多。
-
诊断分析 : 我们知道,这种类型的分析用于了解现象的根本原因,例如项目成功或失败。X 诈骗为什么会发生?在我们的金融系统中发生这种欺诈的根本原因是什么?我们的金融系统没有抓住洗钱交易的根本原因是什么?所有这些问题都可以用诊断分析来回答。所有形式的金融风险评估都属于诊断分析。一个实际的实现是 Pricewaterhouse Cooper 的工具 Halo[5;
http://halo.pwc.com/
。该工具适用于会计日记账和分类账,能够标记高风险交易。当然,这不是一个在线实时解决方案,因为这只是为了诊断和指出金融风险。会计是关于旧的交易记录,这就是像 halo 这样的工具试图从客户的系统中提取信息并发现高风险交易及其模式和趋势的原因。它还提供了有关会计流程中流程效率低下的信息,如消除重复的会计日记帐分录等。这对于大型金融机构尤其有用,因为在特定时期内,各个部门会发生大量的交易。 -
预测分析 : 我们在本书的医疗保健和零售部分已经看到,这种类型的分析用于确定未来事件的结果,例如金融交易成功或失败、财务预算超支或银行或公司等组织的预算下滑。这种分析带来了避免未来情况的实际能力,例如,通过使用预测分析,我们可以预测特定类型的金融交易是成功还是失败。在得出这样的结论之前,机器学习模型代码可以考虑各种参数来进行分析。然而,整个目的是让高层管理人员了解企业财务方面的发展方向。即使这样也不能解决问题,而仅仅是告诉或充当一个失败的警告信号,或与财务相关的未来偏离计划。当我们应用预测分析时,我们会有更多的金融领域发挥作用,如成本会计、管理经济学和决策支持系统。给出基于过去成本会计数据的预测成本报告是我为我的一个客户实现的。这有助于大型金融企业跟踪其成本预算,并确保在机器学习模型预测实际成本增加时发出正确的信号。在管理会计或经济学中,正如学术界所知,重点是假设情景,如投资于 pqr 和 abc 项目的 x 百万美元以及哪个更好。为什么呢?如果我们投资 x 百万美元收购一家创业公司会怎么样?与投入上述两个项目相比,该项投资的投资回报率是多少?通过基于过去的数据建立机器学习模型,并基于管理会计的原则应用它们,所有这些复杂的决策问题都可以非常容易地得到回答。
-
规定分析 : 我们现在知道,在这个分析领域,分析的最大价值是在基于预测分析的预测基础上实现的,它规定了未来应该采取的行动。在规定分析中,它使用机器学习来建立未来的行动计划,该计划基于类似情况下金融交易的过去失败,例如失败的金融交易,并且它给出了为了使金融交易成功而需要执行的特定活动。在金融领域,规范分析现在真的能够在失败发生之前进行路线修正。世界各地的每个金融组织都在努力在这一分析领域取得突破;然而,在撰写本书的时候,很少有成功的例子。我这样说是因为,如果你以商业周期为例,尽管从宏观经济学领域来看,它们大约发生 8 到 10 年,但没有人能够预测它们何时会再次发生。当做出准确的预测时,说明性部分开始;然后,即使在这种情况发生之前,也需要采取行动。例如,一家全球金融集团银行创建了一个机器学习模型,以 92%的准确率预测下一次全球金融衰退的开始;然而,这还不够。最高管理层需要知道他们需要采取什么步骤,以便对组织的影响几乎最小。建立和创造这样一个系统将需要大量的数据和多年的模型建立-测试-反馈周期,以达到生产。有些组织试图建立模型来预测资本市场的崩溃和繁荣周期;然而,由于涉及如此大量的数据和环境变量,目前还没有突破。
尾注
-
约翰·w·莫尔卡三世,CFA 资深行业分析师兼编辑 212-984-2753,金融服务业次贷与信用危机重,
http://media.lockelord.com/files/upload/advisenIndustryReportDivFinConsFinCapMrkt.pdf
-
在线支付服务提供商列表,
https://en.wikipedia.org/wiki/List_of_online_payment_service_providers
-
光环软件由普华永道,
http://halo.pwc.com/
十四、金融领域的关键技术进步
场景 2027
在不久的 2027 年,27 岁的龙芯正在他家附近的社区办公室工作。这是专用办公空间的概念让位给社区办公室的时代。这些是十年前开始流行的合作空间的高级版本。人们不再需要去专门的办公室,而只需要去离他们最近的社区办公室工作。龙芯是企业家,有自己的投资公司。当他走进办公室时,他的无人驾驶私人助理机器人向他打招呼,告知他当天的优先事项。龙芯让无人机 PA 拿出他的股市月报。无人机 PA 与龙芯的 TradeBot 相连,trade bot 是负责所有金融交易的投资机器人。TradeBot 通过可信的链接技术将报告发送给中央无人机 PA。报告显示,由于市场崩盘,龙芯上个月在股市的投资暴跌了 5.2%。TradeBot 在报告中告诉龙芯,由于他对所有股票设置了止损限制,这一损失有所减少,如果他没有在系统中设置这些限制,他今天的损失将达到 12.8%。TradeBot 建议龙芯改变其股票市场投资组合,增加和减少一些股票,根据 TradeBot 的预测系统,这些股票将在未来 3 个月内上涨 25%。机器人通过分析来自各种渠道的新闻以及它们将对这一新建议的投资组合产生的影响来给出其原因。TradeBot 是完全自动化的,不需要任何人工干预就可以在股票市场上进行交易。然而,对于某些事情,如股票选择和分配投资限额和百分比,系统中有一个手动覆盖,允许它从龙芯获得人工输入。TradeBot 由龙芯的股票经纪人所有,他从龙芯股票交易中赚取的佣金中给 TradeBot 一笔薪水。
这是金融的未来,它将从算法交易转向基于 bot 的自动化交易。你觉得未来有可能吗?
今天,这听起来可能有些牵强,但在不久的将来,这将成为现实。看一看已经取得的创新进展的一部分,这将向你保证,未来将使我们能够利用类似于人造智能机器学习和机器人的创新来更有成效地做事。场景 2027 中给出的智能交易机器人不仅可以使用算法交易,还可以通过创建一个简单的基于机器学习的深度神经网络来建立股票交易模型,以识别投资组合中的股票是否接近预期的盈利能力或失去价值。它还可以拥有算法,根据任何给定的消息来确定股票可能的涨跌。机器人交易机器人将帮助持有股票,直到达到理想的盈利水平。
我们看到的另一个应用是机器人通过一些链接安全技术相互交谈。这将是未来的一个重大挑战,因为每一家创建机器人的公司都是在各自为政。一旦机器人技术成为主流,人们开始采用它们,就迫切需要让机器人彼此交谈。因此,需要一个有自己标准和基准的通用接口和语言。任何打算开发机器人的公司都必须遵守这些标准,就像我们有每个浏览器都遵循的 HTML 协议一样,以便提供相似的用户体验。这些机器人协议将为“机器人世界”做同样的事情交易机器人在没有人类干预的情况下进行交易的能力将在未来让人们感到惊讶。我们已经有了 algo 交易软件,在很大程度上实现了股票交易的自动化。然而,它不是完全自动的服务。在当前的系统中,人为控制非常普遍。基于新闻报道提前预测市场运动程度的机器学习模型将成为未来交易机器人的现实。
金融领域的狭义与广义机器学习
正如我们在医疗保健领域发现的那样,有一种模式是,相对于广泛的应用,有限的机器学习技术突然之间出现了巨大的发展,这种模式在金融领域也同样存在。
在 2017 年一项涵盖全球金融消费者的研究中[1; https://www.accenture.com/in-en/insight-financial-services-distribution-marketing-consumer-study
。
我们可以清楚地看到新金融消费者的轮廓。出现了三种不同的消费者形象或角色:1)游牧者;2)猎人;3)质量追求者。游牧者是在数字领域活跃的人,但他们为自己的数据定价,并将数据视为货币。我们所说的数据是他们自己的个人数据。这些流浪者意识到他们的数据的价值,他们希望金融机构为他们提供个性化服务,以换取他们的数据。猎人是那些金融消费者,他们总是在寻找金融服务的最佳价格。他们是一种混合型客户,既在传统的提供商环境中运营,如传统的银行、信用卡等。,它们在数字环境中也同样运行良好。追求质量的人是金融服务提供商的忠实传统客户,如果某个品牌有价值,他们会选择留下来,他们寻求卓越的服务。这个消费者对价格不敏感;然而,他们重视自己的数据,因此数据隐私对他们来说非常重要。该研究还表明,每个国家都有这三种金融消费者的不同概况;例如,在美国,游牧民占 46%,猎人占 14%,优秀人才占 40%,而在新加坡这样的小国,游牧民占 41%,猎人占 16%,优秀人才占 43%。在巴西,游牧民占 62 %,猎人占 9 %,追求高质量的人占 29%。就游牧民族的金融消费者而言,巴西是领先的。加拿大拥有最少的游牧民和最少的猎人,拥有最高价值的优质搜索者,游牧民占 20%,猎人占 23%,优质搜索者占 55%。这也指出了一个事实,即加拿大有一个老龄化的人口问题,这就是为什么很少有游牧民和更多的传统品牌忠诚的质量寻求者。这项研究不仅指出了金融消费者的细分,还指出了整个社会的变化趋势。游牧者代表着新一代,他们或多或少是流动人口,愿意从一个地方搬到另一个地方,寻找在线和离线的自由职业工作。猎人是中年人,他们正在见证传统金融服务向数字金融服务的转变。追求品质的是老一辈人,他们希望坚持使用他们了解并信任的品牌,因为他们的老关系和良好的客户服务水平。这是一个打算长期坚持一个品牌的客户。
全球金融机构的现状
在图 13-1 中,你可以看到我们有三种类型的财务部门。首先是消费金融,其重点是提供个人服务,如贷款、间接融资、租赁、自我融资、信用卡、典当行和发薪日贷款提供商。向有不良信用记录的个人提供贷款是不允许的,因此它们可能不会在全球范围内存在。消费金融服务于任何国家的大部分人口。
这里的重点是为客户及其资产(投资组合管理)提供与股票市场交易咨询相关的活动,并给出各种投资建议(资产管理服务)。股票经纪业务是一项非常本地化的活动,我们还没有看到任何全球性的股票经纪人在主要的资本市场开展业务。其次是多元化金融服务,主要为公司、股票交易所和信用评级机构提供公司金融咨询和投资研究。这种多元化的金融服务提供商是一个利基市场,他们专注于向优质企业和个人客户提供咨询服务和金融服务。
机器学习在金融中的重要性
金融部门不同于大多数其他部门,因为它依赖于人及其行为。金融部门向客户提供服务,因此它不同于提供零售等产品的其他部门。从批准贷款到监督资产和资源,机器学习在金融体系的许多时期都扮演了必要的角色。机器学习被广泛使用的一个主要领域是欺诈检测。整合更多可用的处理能力、web 使用变得更加普遍,以及不断扩大的将盈利组织信息放在 web 上的措施,产生了信息安全危害的“完美风暴”。虽然过去与金钱相关的虚假陈述定位框架强烈依赖于不可预测和衷心的原则安排,但当前的欺诈检测遵循风险因素议程-它有效地学习并适应新的潜在(或真正的)安全危险。机器学习在欺诈检测中被广泛使用,但类似的标准在其他信息安全问题上保持不变。机器学习框架可以识别独一无二的练习或实践(“异常”),并禁止它们进入安全组。对这些框架的测试是远离误报——在这种情况下,“危险”被欢呼,但在任何情况下都不是危险。
机器学习的另一个重要用途是在贷款和保险承保业务中。贷款和保险承销可以被描述为金融领域机器学习的理想职业,事实上,该行业有很多压力,机器将取代当今存在的大量担保职位。特别是在大型银行和传统开放市场保护公司等组织中,机器学习计算可以根据大量购物者信息(年龄、工作、婚姻状况等)进行准备。)和货币贷款或保护结果(这个个人有没有违约,有没有按时偿还预付款,有没有陷入堆积等等。?).所有这些问题都可以通过机器学习的应用来回答。
隐藏的模式可以通过计算进行评估,并持续分解以识别可能影响贷款和保证未来的模式(特定状态下越来越多的年轻人发生汽车碰撞吗?在最近的 15 年中,特定统计人群中的违约率是否在不断上升?)是从贷款和保险数据中提取结果的热门话题。这些成果对组织来说有巨大的收益;然而,对于拥有雇佣信息研究人员的资产和在很长一段时间内准备计算的巨大信息量的大型组织来说,从一开始就从根本上节省了成本。
随着资源回到 20 世纪 70 年代,算法交换(这里和那里称为“计算机化的交易系统”,这显然是一个更精确的描述)包括利用复杂的人工智能框架来解决,在很大程度上,快速交换选择。
算法框架每天定期进行大量的交换,这导致了“高递归交换”的表达,这被认为是算法交换的一个子集。大多数共同基金和与货币相关的组织不会直接公布他们处理交易的人工智能方法(根据当前的情况)。然而,人们相信,机器学习和深度学习在调整在线和在线交易决策方面正发挥着不可否认的重要作用。
现在,我将带您浏览一份由金融行业专家在线完成的调查,通过德尔菲法,该调查旨在找出该行业的哪些领域属于技术采用水平。这项调查与本书零售和医疗保健部分的调查非常相似。金融专家在初步调查中确定的主要领域是股票市场投资、银行业务、金融咨询和管理服务、会计和电子支付服务。开展这项调查的目的是让读者清楚地了解金融各个领域的技术采用成熟度。专家分散在实体融资者、在线融资者和混合组织中。
金融应用机器学习的一些关键领域包括:
调查的金融细分:
-
股市投资
-
银行业
-
财务咨询和管理服务
-
会计
-
电子支付服务
股票市场投资本质上越来越自动化。这些证券交易所公司通常在异常无力的关系上进行交易,这种关系是因为量化调查者(偶尔被称为“量化者”)的研究而被揭露的,量化调查者相信这种关系的合法性。虽然这些关系是无能为力的,但这些量化交易公司的工作规模可以让这些单个系统中的每一个都价值数千、数百万甚至更多。尽管如此,速度最快的公司仍有空间利用这种关系进行交易。通过这种方式,量化公司强烈升级他们的程序以提高速度。由于闲置率低,他们可以在正确的交易中击败任何其他人,因为只有速度最快的玩家才会受益。由于他们的系统在速度和可靠性方面得到了改进,他们使用的机器学习方法通常非常基础。此外,鉴于这种对有利可图的交易所的无情竞争,量化公司对其在算法交易领域受保护的创新守口如瓶。
银行业是一个将机器学习程序应用于丰富的信息数据库的领域,可以帮助打击金融欺诈,为客户节省时间和现金,并使后台能力计算机化。在银行业,机器学习在管理客户账户方面的主要用途之一是打击欺诈和黑客企图,并增强一致性。在一个完美的世界里,这种创新适合这个问题,因为机器学习计算可以搜索巨大的数据库和信息集合,以检测不寻常的金融交易。
在金融咨询和管理服务领域 **,**资源和财富管理公司正在研究潜在的人工智能答案,以增强他们的投机选择,并利用他们的历史信息宝库。计算机化资源(如风险投资组合)或专用现代资源(如生产线设备或运输卡车车队)的资源管理是这样的应用,其中关于优势的大量信息(如特定储备的可验证执行或卡车车队的真实维护信息)现在被记录,使它们为通过 AI 实现机器人化做好准备。与货币信息、新闻、现代传感器信息,甚至基于网络的社交网络信息相关的无监督学习方法,保证了以新的、充满活力的方式建议风险选择,可以想象,这给投机公司带来了市场优势。
会计和簿记编程变得越来越智能,它现在可以执行以前需要人工干预的任务。多余的、手工的和枯燥的任务被处理掉,目的是会计师和企业家现在可以投入更少的精力来跟上最新的发展,并有更多的时间来完成其他重要的任务。簿记应用程序学习收据编码实践,并建议交换应该分布在哪里。例如,如果业务助理通常将一个项目分配给一个特定的交易帐户,那么下次业务代表将该项目添加到收据时,簿记应用程序会将它分配到正确的记录。此外,它还需要注意职员和簿记员解决的错误。例如,如果企业家将一些东西分配到离库记录,簿记员解决了错误,簿记应用程序将接受簿记员的确定为正确的。
银行妥协是自动化的。再一次,创新从过去的指定和记录决策中获益,并在此之后为新的银行交易所提出正确的建议。
银行利用人工智能聊天机器人使客户能够确定正常的查询。簿记程序中的聊天机器人,比如 Xero[2; https://www.xero.com/us/why-xero/benefits/online-accounting/
】,让你质疑最近的货币信息,像银行里有多少现金,什么时候会有具体的账单,谁欠你现金,它甚至可以将客户与 Xero[2; https://www.xero.com/us/why-xero/benefits/online-accounting/
【谋士出身】他们的登记处。越来越多的会计和簿记应用程序正在开发中,它们不是离线的,而是在线实时审计的。此外,这一创新同样会影响检查员,宜早不宜迟。目前,审查者只是审查交易的精选样本。他们利用庞大的簿记员团队,加班加点在截止日期前完成审计。通过组织处理的大量交易限制了审计人员可以实际评估的交易数量。
机器学习计算将处理和调查信息,感知特性,并汇编例外情况的概要,供评估者检查。审计人员可以运用他们的能力来检查和总结日记账或分类账中记录的异常交易的解释,而不是投入他们大部分的精力检查信息。
最后一个领域是电子支付行业****,它正在颠覆过去与银行传统交易方式的所有概念。全球电子支付公司现在对机器学习感到满意,基本上符合签帐卡交换检查,其中学习计算在密切持续的交换批准中承担必要的部分。鉴于目前信息捕捉和适度精英计算的快速发展,麦肯锡认为有许多近距离和长期的机会来分期增加机器学习的利用。这些包括从利用网络来源的信息到更准确地预见借款人的不法行为,利用虚拟合作伙伴,或提高客户利益的执行。在发卡领域,机器学习正发挥着重要作用。这一点在信用卡收藏中尤为明显,麦肯锡发现信用卡恢复率提高了 10%至 15 %,信用卡累积熟练度提高了 30%至 40%。为了限制不当行为,支持者可以利用单一记录设计确认创新,并为目前被拒绝的帐户创建联系规则和方法。在出现有记录的不当行为后,担保人允许在贴现应收账款并转向外部供应商之前有一个简明的时间窗口(大多数情况下为 90 天)。这段短暂的时间对于担保人来说是一个完美的时间,可以应用大量利用机器学习能力的累积程序。AI 的一个关键优势是,它可以帮助分期付款机构显著提高运营能力;案例包括减少处理时间和人为错误,为客户提供知识和扩大机器人化。从这个意义上说,人工智能正在推动组织重新思考和重建工作模式和程序。例如,它可以支持组织处理大量的信息,以生成财务报告并满足管理和一致性需求,例如经常需要大量个人执行冗余信息准备的表单。说实话,人工智能的变革力量正在对金融管理行业产生如此重大的影响,预计在 15 年内,它将取代与金钱相关的外包管理工作的四分之三(毕马威)。这可能会对希望降低运营成本的组织产生巨大的影响,使他们能够创建和支持不同的业务领域。
**到目前为止,我们已经了解了机器学习应用在每个选定领域的重要性。现在让我们来看看调查及其研究方法。
-
**研究目标:**本研究的主要目标是利用专家意见找出并绘制人工智能和机器学习的两个参数:(1)人工智能和机器学习在金融行业关键领域的当前技术成熟度,以及(2)金融行业内部的技术采用流程。
-
在第一次迭代中,专家组最初确定了 25 个关键领域。然后,专家组重申了这些领域,以找出其中最重要的未来发展领域。专家组将这一范围缩小到对金融业进一步发展至关重要的五个金融领域。调查研究不提供关键领域的迭代选择结果,但它从专家选择这个关键领域的点开始。我已经在本章讨论了这五个领域,从股票市场投资到电子支付服务。
-
**研究样本:**从总共 160 名专家中选出一组专家。专家由在该行业工作了 20 多年的金融专业人士组成,他们的职位涉及证券交易所、金融机构的银行专家、金融机构的主管、金融机构的首席执行官,或者从事金融行业研究并发表过论文的学术教授。我已经介绍了来自金融各个领域的所有专家,例如供应链管理、客户服务、销售、首席执行官和人工智能专家——仅举几例。共有 45 名这样的专业人士被列入本次研究的候选名单。在这项研究中没有缺席或流失。
-
**所需信息:**为了做出决策并支持决策,需要提供各种二级数据,如关于金融领域机器学习和人工智能状态的已发表论文。一些例子是普华永道或其他金融机构。在前面提到的两个参数之间建立联系所需的信息是基于专家们对从股票市场投资到电子支付服务等五个领域技术实现现状的理解。为协助专家决策,向他们提供了关于技术成熟度和分阶段识别技术的解释;除此之外,没有提供其他信息,所以要小心不要在专家的头脑中产生偏见。这项研究需要的信息是背景知识、理论知识和专家知识。还要求专家利用他们的隐性或固有知识,因为他们与金融行业有着长期的联系。
研究设计概述
这项研究涉及的主要步骤如下:
-
定义研究的目标。
-
寻找愿意帮助这项研究的专家。
-
设计收集信息的问卷,减少专家的写作工作量。
-
向专家发放调查问卷。
-
收集对问卷的答复,并对其进行分析,以了解是否达成了共识。
-
重复并管理更多的问卷,直到专家们就某个特定的关键领域达成共识。
-
一旦达成共识,就进入下一个关键领域,重复调查问卷,直到达成共识。在达成共识之前,将根据专家先前提供的答复提供更多信息。
-
分析并创建技术成熟度水平和采用人工智能和机器学习阶段的地图。
数据收集方法
关于金融的文献不是这项研究需要收集的数据。我之前已经提到过的测试研究,是在专家的帮助下,将对金融业未来至关重要的 16 个关键领域缩小到 5 个。这是一件重要的事情,因为在我们的研究中,我们根据专家过去的经验,对金融业的关注点做出了判断。我们使用了 Chittu Okoli 和 Suzanne De Poweski 的论文中的德尔菲研究方法(“德尔菲方法”)作为关于设计考虑和应用的研究工具示例[3; www。学术界。edu/399894/The _ Delphi _ Method _ As _ a _ Research _ Tool _ An _ Example _ Design _ consideration _ and _ Applications
。
问卷调查法用于通过电子邮件在线管理调查向专家收集数据。
数据分析
在收集数据的特定迭代过程中,使用 Microsoft Excel 软件以表格形式记录专家的回答。对于任何给定的关键领域,都会绘制一个图表来检查是否达成了共识,如果图表显示的足够好,说明达成了共识,那么迭代就停止了。所以数据分析是在计算机软件的帮助下手工完成的。使用 Excel 软件绘制技术成熟度和技术采用阶段的地图,以创建技术地图。这也是在计算机软件程序 Microsoft Excel 的帮助下完成的。
道德考量
如果我们没有确保结果和专家的回答是匿名的,并且不影响这项研究的结果,那么研究中可能会出现偏见。因此采取了适当的措施,以确保专家之间互不相识。正如我已经提到的,在金融行业有两种人:喜欢技术的人和不喜欢技术的人。我们没有根据这些特定的标准进行专家选择,所以这项研究很可能在这些基础上有所偏差,我们还没有对此进行测试。
研究的局限性
定性研究的最大局限是不能准确量化未来的结果,这一点非常适用于我们的研究。然而,通过在我们的问卷中使用分类变量,我们也试图对我们的结果进行定量分析。绘制技术采用图和了解技术成熟度不是一个普通人能做的事情,除非他们已经与行业相关联,这就是为什么我们选择专家来进行这项研究;然而,有可能一些专家可能没有足够的知识或接触人工智能和机器学习的进展。我们承认这可能是研究的一个局限。
检查研究
从本书的图 1-1 中,我们已经知道技术采用有四个阶段。在图 14-1 中,我们看到了这个映射。
图 14-1
金融行业技术采用阶段
从图 14-1 来看,有两个轴:x 轴代表图 1-1 中概述的技术采用阶段,y 轴代表技术成熟度水平。**成熟度应用级别分为低、中、高。低表示该技术处于研究阶段,尚未投入生产。中等意味着该技术已经在生产中实现,有些成功和失败,需要更多的研究才能进入主流生产。高表示该技术经过充分研究,已准备好投入生产或正在生产环境中使用,**如金融商店等。
表 14-1 和图 14-2 到 14-8 呈现了德尔菲法研究分析中的数据。
表 14-1
研究中使用的德尔菲法研究数据
|主题
|
金融专家人数
|
迭代次数
|
| — | — | — |
| 德尔菲法 | 邀请 | 入围的 | |
| 人工智能和人工智能在金融中的应用现状 | One hundred and sixty | Forty-five | three |
| 人工智能和人工智能在金融领域的未来应用 | One hundred and sixty | Forty-five | five |
我们已经在本章的方法一节中讨论了这些数据。现在,我们来看看人工智能和机器学习在金融领域的技术成熟度参数的数据及其图形表示。
图 14-2
股票市场投资中人工智能和人工智能的现状
在股市投资中,金融行业的人工智能和机器学习的参数技术成熟度水平处于高端。这一点得到了我们金融行业专家的认可。这意味着我们的专家说,股票市场投资已经实现了技术,并且它正在被用于主流生产,以至于它可以取代人类专家。这里是股票市场,市场之间的人类,交易者就是经纪人,经纪人的功能已经完全自动化,现在已经在生产了。股票市场的另一个方面是使用买卖信号向股票市场上的交易者和投资者提供建议,甚至这已经通过使用机器学习和人工智能相当自动化了。一个很好的例子是 stocksrank.com 网站。 https://www.stocksrank.com/?gclid=EAIaIQobChMI683Yht-o3QIVipOPCh0M-AfsEAMYAyAAEgKF8fD_BwE
】,由机器人分析师发出交易信号,监控市场,并将趋势呈现给客户。机器学习和人工智能的使用非常重要,因为股票市场在交易时间的每一秒钟都会产生大量的数据。从如此大量的复杂数据中分析和找出趋势,并找出趋势和模式,这不是人力所能做到的。这就是为什么机器学习和人工智能已经成功地为股票提供了建议,而这在以前是任何人都不可能找到的。
图 14-3
银行业人工智能和人工智能的现状
现在让我们看看另一个领域,那就是银行业。我们的专家告诉我们,这里的人工智能和机器学习处于技术成熟的中等阶段,71%的专家同意这一观点。我们可以在图 14-3 中看到,其余的专家说它高(18 %)或低(11%)。中等水平的技术成熟度意味着专家们说这项技术还没有进入主流生产,在这里和那里有一些成功和失败。
麦肯锡报告[5; https://www.mckinsey.com/industries/high-tech/our-insights/an-executives-guide-to-machine-learning
】指出,在欧洲,超过 12 家银行已经用机器学习建模取代了传统的统计建模,这使得新产品销售额增加了 10%,资本支出节省了 20%,现金收款增加了 20%,费用下降了 20%。各银行已经实现了推荐引擎,他们还建立了微观目标模型,预测消费者是否会取消服务或拖欠贷款。他们还在此基础上设计了如何干预的机制。从这份重要报告中,我们可以看到机器学习是如何对欧洲的银行产生商业意义的。有了这样的进步,从长远来看,机器学习确实将在转变银行收入和运营方面发挥核心作用。从银行已经存在的大数据(如客户交易)中学习,不难挖掘和发现客户对他们的好恶和金融行为的隐藏模式和趋势。利用这些数据,任何银行都可以建立消费者的财务档案,并预测他们未来的行为。然而,机器学习和人工智能在银行业的下一个操作层面是,它不仅可以预测,还可以采取具体行动,就像人类专家在从机器学习系统获得报告后所做的那样。这是独立操作的阶段,将使人工智能中的机器学习真正发挥其全部潜力。
图 14-4
财务咨询与管理中人工智能与人工智能的现状
现在我们来看看人工智能和机器学习在金融咨询和管理领域的现状。经过五次迭代,我们的金融专家透露,人工智能和机器学习在这一领域的应用非常低,58%的专家这么说,29%的专家说这是中等水平。我们的大多数专家表示,这一领域的技术还处于研究阶段,尚未投入生产。这个领域有各种各样的公司正在尝试开发用于资产管理和投资咨询服务的机器学习应用程序;然而,有一家名为瑞士金融技术协会的公司利用机器学习和人工智能 [6 等数字技术对财富管理进行了一些研究; https://swissfinte.ch/machine-learning-digital-wealth-management-part-1/
。
包括使用机器学习和人工智能来增强客户的客户体验,以及专门适合特定客户档案的金融产品的产品加入或匹配。这项技术仍然处于研究阶段,没有投入生产,因此我们的专家正确地将这一领域确定为低技术成熟度水平。
图 14-5
人工智能和人工智能在会计中的地位
现在我们来看看另一个关键领域——会计。在图 14-5 中,我们可以清楚地看到我们的专家处于中低技术成熟度水平之间,47%的专家认为技术成熟度水平处于这两个水平。正如我们已经知道的,技术的低成熟度意味着它处于研究阶段,还没有投入生产。中等水平意味着该技术已经在生产中实现,有些成功和失败,需要更多的研究才能进入主流生产。这项研究的领先者是普华永道[7; https://www.pwc.com/us/en/services/audit-assurance/financial-statement-audit-innovation.html
】或普华永道(Pricewaterhouse Coopers),这是一家基于机器学习开发了名为 hello 的软件的会计公司,该软件可用于技术支持的审计。然而,这不是完全自动化的软件,需要人工干预才能工作。审计不是实时进行的,而是根据客户的决定按月或按年提供数据。
图 14-6
人工智能和人工智能在电子支付服务中的现状
我们研究的最后一个应用是人工智能和机器学习在电子支付服务领域的应用。关于人工智能和机器学习在电子支付服务中的应用,专家的意见是,它已经达到了很高的成熟水平。这意味着该领域的技术已经过充分研究,并准备投入生产,或者已经在生产环境中使用。我们的专家在仅仅 3 次迭代后就很快做出了这个决定,其中 56%的人说它处于高成熟度水平;42%的人认为处于中等水平。在本章中,我已经向您展示了机器学习正被用于打击各种类型的欺诈,在电子支付行业,在线支付交易在打击欺诈和做出实时决策以评估大量在线交易方面有着非常高的机器学习使用率。这里的机器学习应用程序能够提高它们的准确性,能够检测人类的非直觉模式,识别欺诈,并避免误报。这是在签证公司 [8 中告知的; https://usa.visa.com/dam/VCOM/global/support-legal/documents/webinar-machine-learning.pdf
】支付行业机器学习网络研讨会于 2018 年 5 月 24 日召开。我们知道 Visa 是支付行业的主要参与者,它已经开始通过在流程中实现机器学习算法来使用机器学习进行准确的商业决策。
总的来说,这是金融行业所有细分市场在条形图上的叠加情况。
图 14-7
金融领域人工智能和并购的现状
2018 年金融业采用技术的阶段
现在我们继续我们研究的第二个参数,金融领域技术采用的阶段。我已经在第一章中讨论过,从快速应用阶段到独立运营阶段有四个阶段。经过分析,我们可以从图 14-8 中看出这一点。
图 14-8
2018 年金融行业的技术采用阶段
我们可以清楚地看到,股票市场投资被归类为第 3 阶段实现。在这一阶段,我们通过使用辅助应用程序获得洞察力,在这种情况下,低级智能用于评估高技能专业人员,自动化用于增强人的能力和根据数据预测业务需求。像算法交易或机器人辅助交易这样的股票市场应用程序是一个很好的例子,其中熟练的交易者通过在他们的操作中使用机器学习而得到增强。
在下一个银行业领域,我们的专家将阶段实现定为第二阶段,53%的专家这样认为。这是一个早期应用阶段,Lena 操作和低效率产品用于降低运营成本和诊断业务问题,并用于构建问题检测系统。我们知道,全球各大银行都实现了欺诈检测系统,他们通过使用聊天机器人,甚至在银行运营中使用机器人,广泛使用机器学习来降低运营成本。这主要体现在银行面对客户的角色上。
在财务咨询管理的下一个领域,我们的专家表示,该技术处于第三阶段水平,38%的专家这样说,36%的专家还将人工智能和机器学习应用程序放在第二阶段水平。但是,这不是平局,因此我们将进行阶段 3,该阶段我们的专家比例更高。在阶段 3 辅助应用中,咨询和投资管理服务使用机器学习来帮助熟练的专业人员,如关系经理和投资管理专家,确定客户的最佳资产与概况的匹配。他们还使用机器学习来预测个人的投资需求,方法是创建他们的金融档案,然后为他们提供最佳的金融服务。
接下来,我们转向会计,我们的专家非常清楚,62%的人说技术的应用水平处于第二阶段。第二阶段是早期应用,技术用于线性操作,完成低效率的任务,并降低操作成本,如由机器对财务报表进行审计操作。技术还用于找出业务问题及其原因,例如找出财务分类账中与洗钱或高风险项目有关的过去交易,并创建问题检测系统;例如,在公司的日记账或分类账中发现洗钱交易就是使用早期应用程序的一个例子。
最后一个领域是电子支付服务,我们 47%的专家认为它处于运营的第 3 阶段,即辅助应用,在这一阶段,低级智能用于帮助该领域的高技能专业人员,自动化用于增强人类的能力,因为人类不可能扫描支付系统中全球发生的数百万和数十亿笔交易。
就此,我结束了对这项研究的介绍,这项研究花了我 3 个多月的时间与金融行业的专家一起实现,我希望它能为读者提供一个关于金融行业在人工智能和机器学习的应用和适应方面的简明观点。
尾注
-
2017 年全球分销与营销消费者研究,埃森哲 LLP 美国,
www . Accenture . com/in-en/insight-financial-services-DISTRIBUTION-MARKETING CONSUMER-STUDY
-
为什么是 Xero,
www . Xero . com/us/why-Xero/benefits/online-accounting/
-
德尔菲法作为一种研究工具:一个例子,设计考虑和应用,奇图奥科利*,苏珊娜鲍洛夫斯基约翰莫尔森商学院,肯考迪亚大学,GM 209-23,1455 Boulevard de Maisonneuve Ouest,Montre’al,Que。美国路易斯安那州立大学信息系统与决策科学系。2003 年 11 月 8 日接受。2004 年 3 月 27 日在线提供,
www . academia . edu/399894/The _ Delphi _ Method _ As _ a _ Research _ Tool _ An _ Example _ Design _ Considerations _ and _ Applications
-
Stocksrank.com 网站,
www . stocksrank . com/?gclid = eaiaiqbschmi 683y ht-O3 qivipopch 0m-afseayaaegf8fd _ bwe
-
多里安·派尔(Dorian Pyle)和克里斯蒂娜·圣何塞(Cristina San José)撰写的《机器学习高管指南》,麦肯锡季刊,2015 年 6 月,
www . McKinsey . com/industries/high-tech/our-insights/an-executives-guide-to-machine-learning
-
数字财富管理中的机器学习(第一部分)作者 johnhucker,2017 年 12 月 13 日
swissfinte . ch/machine-Learning-Digital-Wealth-Management-Part-1/
-
财务报表审计技术----实现审计以提高质量和获得更多见解,普华永道美国,
www . PwC . com/us/en/services/audit-assurance/financial-statement-audit-innovation . html
-
支付行业的机器学习 2018 年 5 月 24 日 John Steensen,
USA . visa . com/dam/VCOM/global/support-legal/documents/webinar-machine-Learning . pdf
**
十五、如何在金融领域实现机器学习
金融业最有前途的三个领域是:
-
算法炒股
-
自动化机器人顾问
-
欺诈检测和防范
在金融行业,潜力巨大的最重要的项目是将机器学习应用于算法股票交易。虽然算法股票交易是人工股票交易的自动化版本,但我会说它缺乏机器学习可以在预测和预测方面提供的人工智能,而不是以今天的形式进行分析和行动。为了举例说明我的意思,让我们看看一个散户如何在全球股市交易。为了使讨论简单,我说的是现金交易,而不是衍生品期权交易。在任何一个典型的日子里,散户投资者都会研究关于一家公司的新闻,检查其基本面和技术分析头寸,然后做出卖出或买入股票的决定。例如,如果交易者跟踪商品通道指数(CCI)技术指标,那么他们会看 CCI 显示超卖信号开始买入,超买信号开始卖出。
虽然这是一个简单的例子,但有经验的交易者会使用比 CCI 更多的技术指标,比如随机振荡指标和布林线指标。当前形式的算法交易已经成功地自动化了技术指标的使用,并将其整合到自动化交易系统中。然而,这不是人工智能,也不是机器学习。如果我们仔细观察,这里几乎没有任何预测。这只是当市场上涨或下跌时,人类会做的自动化操作,然后根据价格运动采取行动。这里几乎没有任何预测。例如,在该系统中没有构建模型来预测股票在接下来的 1 小时、1 天、1 周、1 个月的价格,或者预测任何其他这样的时间段的股票价格运动。如果围绕这一点建立一个模型,那么将它与算法交易结合起来将会产生奇妙的结果。因此,在股票市场中应用机器学习来预测股票价格或指数增加了一些智能,然后使用前景分析,一个完整的系统给出关于 algo 交易系统要执行的动作的建议,这将使它有足够的智能来利用价格运动。
另一个很有潜力的金融领域是金融和投资顾问。这里有很大的实现空间。让我们举个例子:一个人有一百万美元可以投资。然而,尽管信息普及程度有所提高,但任何投资者都面临的问题是,选择最佳投资选项,让资本随着时间的推移而增值。在这里,投资者利用他们的直觉和朋友网络或人类顾问给他们建议在哪里投资,在哪里不投资。然而,这是一个非常幼稚的大笔投资过程。谁也不知道这些投资中有多少是失败的,有多少是成功的。然而,如果我们使用来自资本市场的关于价格和其他影响它们的因素的现有数据,那么我们可以建立一个预测模型,并确保投资不会随着时间的推移而失败。我指的不是目前的机器人操作,比如亚马逊的 Alexa,它只能告诉你当前的市场情况;我的意思是创造一个机器人顾问,它不仅能创造一个概念上的投资组合,还能根据过去的数据,如股票价格、可收藏的艺术品价格、商品价格、石油价格等,给投资者提供预测。这种机器人财务顾问不仅有能力创建机器学习模型,还能利用它们并对其所有者的投资组合提出建议。根据市场价格的变化,它会提前足够长的时间提醒其所有者对其投资组合的建议变化。
欺诈检测和防范是另一个需要升级的领域。虽然在这一领域有机器学习和人工智能的应用,但它们不足以防止欺诈在全球范围内发生。欺诈检测系统需要通过发现洗钱者和其他黑客滥用系统的模式来使用机器学习。黑客企图存在于网络安全领域;然而,与洗钱和欺诈相关的交易很难被发现。这样做的主要原因是系统将用户识别为合法用户,因此不标记他们。但是,通过使用异常值检测等技术并将其与其他欺诈检测算法相结合,可以构建一个不允许实时进行此类交易的健壮系统。对已经发生的交易发出危险信号,除了对系统用户提出刑事指控(这些用户在欺诈被发现时可能已经逃离)之外,没有任何帮助。然而,通过创建机器学习模型,例如我们在本书第十四章中看到的模型,我们可以很容易地实时检测和阻止这种交易的发生。
在金融领域实现机器学习生命周期
现在,我们将看看机器学习在金融行业的实现。在这里,我将使用监督机器学习技术向您展示如何在会计数据集上实现。本例中使用的数据集是虚构的,但基于任何组织通常使用的电子支付分类账,适合您了解如何在会计领域实现机器学习。
现在让我们看看本章将要用到的数据集,看看数据字典,并在开始处理它之前理解它。这里描述了数据集中的列。
-
**记录号:**这是数字支付登记簿中分类账交易的记录号。
-
**交易号:**这是支付网关在成功完成支付交易时提供的唯一交易号。
-
**财政年度:**这是交易发生的财政年度。
-
**月:**该条目给出交易发生的月份。
-
**部门:**部门栏目包括公司的财务、人力资源、学习与发展、法律、营销、采购、研究、战略规划和运输部门。
-
**账户:**账户列表示公司订单在其分类账中的账号。这是公司内部的事情。
-
**费用类别:**费用类别代表公司在向供应商付款时的费用类型。
-
供应商 ID: 由支付或采购系统签署给接受付款的供应商。
-
**付款方式:**这一栏讲述了所使用的付款方式的类型,例如自动票据交换所支票或电汇。
-
**付款状态:**付款状态是对已经对账的付款交易的确认,不仅与银行对账,还与内部采购委员会对账。内部支付意味着付款已经得到银行的批准和确认,并且付款已经得到组织内部采购委员会的批准。
-
**付款日期:**这是交易发生的实际付款日期。
-
发票 ID: 这是已经生成的发票的发票 ID,付款交易是根据该发票生成的。
-
**发票日期:**表示发票生成的日期。
-
**金额:**已发生的支付交易的实际金额。
-
**红色标志:**列值 1 表示交易金额低于金额列的第 25 个分位数,支付状态为未对账支付。危险信号交易需要进一步调查。代表交易的值高于第 75 个分位数,并且具有“信任”和“协调”状态。这说明还需要进一步调查。值为 0 表示交易在 1.5 倍的第 25 个分位数内,因此被视为合法。
在这个数据集中,我将使用特定分类器的监督学习技术来对合法的交易进行分类。
该数据集采用平面文件 PaymentsLedger.csv 的形式,可从以下 URL 获得: http://www.PuneetMathur.me/Book009/
。
启动代码
现在让我们开始在这个数据集上实现无监督学习。
- 信息:本练习中使用的所有代码都在 Anaconda 环境中测试了与 Python 2.7 的兼容性。它应该也能在 3.x 上工作;但是,还没有经过测试。
在清单 15-1 中,导出 Python 库,如 String IO 和 numpy,以便开始工作。
#Importing python libraries
import pandas as pd
from io import StringIO
import os
import numpy as np
os.getcwd()
Listing 15-1Importing Basic Python Libraries
在清单 15-2 中,我从平面文件中加载数据集,然后查看加载到数据帧中的数据集。
#Reading data set from flat files
fname="C:/PaymentsLedger.csv"
openledger= pd.read_csv(fname, low_memory=False, index_col=False)
#Check the data Loaded into memory
print(openledger.head(1))
Record No TransactionNo Fiscal Year Month Department Account \
0 0 1095300 2018 1 FINANCE 54050
Expense Category Vendor ID Payment Method Payment Status \
0 Food And Beverages 59169 Automated Clearing House Paid-Unreconciled
Payment Date Invoice ID Invoice Date Amount RedFlag
0 07/21/2017 DDSM100367442 07/19/2017 10.08 1
Listing 15-2Loading and Checking Data Set in Memory
接下来,在清单 15-3 中,我将数据传输到一个标准的 Pandas 数据帧中,然后检查数据集是否正确加载。然后我观察数据集的形状,它告诉我们 7500 行和 13 列。我们还查看列名,这与我们在本节开始时讨论的数据字典相同。我使用 dataframe 的 dtypes 属性来查看已经装载的列的数据类型。
dfworking= pd.DataFrame(openledger)
#Look at the first record
print(dfworking.head(1))
#Check the shape size and columns in the dataset
print(dfworking.shape)
print(dfworking.columns)
dfworking.dtypes
Record No TransactionNo Fiscal Year Month Department Account \
0 0 1095300 2018 1 FINANCE 54050
Expense Category Vendor ID Payment Method Payment Status \
0 Food And Beverages 59169 Automated Clearing House Paid-Unreconciled
Payment Date Invoice ID Invoice Date Amount RedFlag
0 07/21/2017 DDSM100367442 07/19/2017 10.08 1
(7293, 15)
Index([u'Record No', u'TransactionNo', u'Fiscal Year', u'Month', u'Department',
u'Account', u'Expense Category', u'Vendor ID', u'Payment Method',
u'Payment Status', u'Payment Date', u'Invoice ID', u'Invoice Date',
u'Amount', u'RedFlag'],
dtype='object')
Out[20]:
Record No int64
TransactionNo int64
Fiscal Year int64
Month int64
Department object
Account int64
Expense Category object
Vendor ID object
Payment Method object
Payment Status object
Payment Date object
Invoice ID object
Invoice Date object
Amount float64
RedFlag int64
dtype: object
Listing 15-3Loading Pandas Dataframe and the Column Datatypes
接下来,在清单 15-4 中,我查看我们是否有任何丢失的数据,以了解我们是否需要在开始预处理数据之前处理它。
dfworking.isnull().any()
#Counting the Number of Null rows in each Column of the dataframe
dfworking.isnull().sum()
Out[21]:
Record No False
TransactionNo False
Fiscal Year False
Month False
Department False
Account False
Expense Category False
Vendor ID False
Payment Method False
Payment Status False
Payment Date False
Invoice ID False
Invoice Date False
Amount False
RedFlag False
dtype: bool
Out[22]:
Record No 0
TransactionNo 0
Fiscal Year 0
Month 0
Department 0
Account 0
Expense Category 0
Vendor ID 0
Payment Method 0
Payment Status 0
Payment Date 0
Invoice ID 0
Invoice Date 0
Amount 0
RedFlag 0
dtype: int64
Listing 15-4Finding Empty Rows in the Dataframe
在检查了数据帧中的空值之后,我们发现没有空列或空列。然而,在现实世界中,情况并非如此,因此您可能需要处理和处理各个列中缺失的值。在我们继续之前,让我向您介绍一下我将在这个机器学习模型构建中使用的一些功能。Python 的第一个功能是分发。我将使用这个函数来创建分布图,以查看和比较它们,并查看算法之间的结果。我还将使用它来建立基准预测算法。让我们看看清单 15-5 中的代码。
Visualization Functions which will be used throughout this model
import matplotlib.pyplot as pl
import matplotlib.patches as mpatches
from time import time
from sklearn.metrics import f1_score, accuracy_score
def distribution(data, transformed = False):
"""
Visualization code for displaying skewed distributions of features
"""
# Create figure
fig = pl.figure(figsize = (11,5));
# Skewed feature plotting
for i, feature in enumerate(['Amount','Month', 'Fiscal Year']):
ax = fig.add_subplot(1, 3, i+1)
ax.hist(data[feature], bins = 25, color = '#00A0A0')
ax.set_title("'%s' Feature Distribution"%(feature), fontsize = 14)
ax.set_xlabel("Value")
ax.set_ylabel("Number of Records")
ax.set_ylim((0, 2000))
ax.set_yticks([0, 500, 1000, 1500, 2000])
ax.set_yticklabels([0, 500, 1000, 1500, ">2000"])
# Plot aesthetics
if transformed:
fig.suptitle("Log-transformed Distributions of Continuous Census Data Features", \
fontsize = 16, y = 1.03)
else:
fig.suptitle("Skewed Distributions of Continuous Census Data Features", \
fontsize = 16, y = 1.03)
fig.tight_layout()
fig.show()
#End of Distribution Visualization function
Listing 15-5Distribution Function
分布函数输入参数相同,通知第二个参数说明是否需要转换所需的数据帧。这是为了以后应用日志转换。在函数的第一行,我使用 Matlab figure 函数创建了一个图形,图形大小为 11 和 5。之后,我在 for 循环中创建了一个特性图,它枚举了 amount month 和 fiscal year 列。请注意,这些列实际上是数字。之后,我将这些列中的每一列作为子图添加到图中,然后创建一个包含 25 部电影的数据特征的直方图,并为特征分布提供一个标题,将 x 标签和 y 标签值设置为白色 x 值和标签中的 x 刻度。在 for 循环完成创建图形之后,下一步检查第二个输入参数。如果需要进行对数转换,则需要进行确认,然后用对数转换后的分布附加一个单独的图形超级标题;否则就是连续普查数据特征的偏态分布。所以我用这个函数来创建一个对数转换分布和一个偏斜分布。完成后,图形与字体布局一起使用,并显示在屏幕上。一个简单的函数确实可以很好地显示转换分布和偏斜分布的专业成绩。
特征重要性
接下来,我们看看清单 15-6 中称为 feature_plot()的特征重要性函数。
图 15-1
前五个最具预测性特征的归一化权重
# Plotting Feature Importances through this function
def feature_plot(importances, X_train, y_train):
# Display the five most important features
indices = np.argsort(importances)[::-1]
columns = X_train.columns.values[indices[:5]]
values = importances[indices][:5]
# Creat the plot
fig = pl.figure(figsize = (9,5))
pl.title("Normalized Weights for First Five Most Predictive Features", fontsize = 16)
pl.bar(np.arange(4), values, width = 0.6, align="center", color = '#00A000', \
label = "Feature Weight")
pl.bar(np.arange(4) - 0.3, np.cumsum(values), width = 0.2, align = "center", color = '#00A0A0', \
label = "Cumulative Feature Weight")
pl.xticks(np.arange(5), columns)
pl.xlim((-0.5, 4.5))
pl.ylabel("Weight", fontsize = 12)
pl.xlabel("Feature", fontsize = 12)
pl.legend(loc = 'upper center')
pl.tight_layout()
pl.show()
#End of Feature Importances function
Listing 15-6Feature Importances Function
feature_plot
函数接受第一个参数作为特征重要性,第二个参数作为X_train
和第三个参数y_train
。首先,我从 importances 变量的末尾创建了一个所有重要特性的排序,然后我将来自x_train
的列名和来自 importance 变量的值放入 values 变量。之后,我创建了一个条形图,其中包含从 importances 变量中提取的值;这只是五个,因为我们想看看这里的前五个重要特性。
观察异常值
我们现在来看看数据集中的异常值。我想提醒来自医疗保健和零售这两个行业的读者,我们已经将异常值定义为小于金额列下分位数的 1.5 倍且大于金额列上分位数的 1.5 倍的值。下四分位数是 0.25,上四分位数是 0.75。
fname="C:/DATASETS/data.ct.gov/PaymentsDataset.csv"
openledger= pd.read_csv(fname, low_memory=False, index_col=False)
#Verify the data Loaded into memory
print(openledger.head(1))
Unnamed: 0 TransactionNo Fiscal Year Month Department Account \
0 0 1095300 2018 1 FINANCE 54050
Expense Category Vendor ID Payment Method Payment Status \
0 Food And Beverages 59169 Automated Clearing House Paid-Unreconciled
Payment Date Invoice ID Invoice Date Amount RedFlag
0 07/21/2017 DDSM100367442 07/19/2017 10.08 1
data= pd.DataFrame(openledger)
Listing 15-7Load the Data Set
为了将支付数据集解码成一个数据框架,然后开始研究离群值并探索它,我们不打算研究数据类型并在面积图中研究它们。我们知道我们的数据集是为了增强无空值。在清单 15-8 中,我提供了异常值的计算。
#Total number of records
n_records = len(data.index)
#Number of records where payments are below 1.5 times of upper Quantile- upper Outlier Limit
l=data[data['RedFlag'] == 2].index
n_greater_quantile = len(l)
#Number of records where payments are above 1.5 times of lower Quantile- lower Outlier limit
l=data[data['RedFlag'] == 1].index
n_lower_quantile = len(l)
#Percentage of Payments above Upper Outlier limit
p=float(n_greater_quantile)/n_records*100.0
greater_percent =p
#Percentage of Payments above Lower Outlier limit
p=float(n_lower_quantile)/n_records*100.0
lower_percent =p
# Print the results
print "Total number of records: {}".format(n_records)
print "High value Payments above 1.5 times of 75th Percentile: {}".format(n_greater_quantile)
print "Low value Payments below 1.5 times of 25th Percentile: {}".format(n_lower_quantile)
print "Percentage of high value Payments: {:.2f}%".format(greater_percent)
print "Percentage of low value Payments: {:.2f}%".format(lower_percent)
Total number of records: 7293
High value Payments above 1.5 times of 75th Percentile: 366
Low value Payments below 1.5 times of 25th Percentile: 748
Percentage of high value Payments: 5.02%
Percentage of low value Payments: 10.26%
Listing 15-8Finding the Outliers in the Payments Data Set
在我解释异常值之前,我想告诉您,用于确定欺诈或洗钱交易的异常值只是用于欺诈检测的众多技术之一。我使用非常简单的设置和数据集以及最简单的技术来确定交易是否是欺诈,以便您可以理解我们如何使用和建立机器学习模型来确定此类交易。在 n_ records 变量中,我取数据帧中记录数量的长度。接下来,我设置了离群值的上限和下限。整个想法是列出落在异常值上限或下限内的记录或事务的数量。我们从数据字典描述中知道,红色标记列值为 2 意味着一条记录落在异常值上限内。类似地,红色标志 1 意味着交易量低于穷人最喜欢的变量 n_lower_quantile,该变量用于找出满足下限的行数。类似地,变量 n_lower_quantile 用于确定付款分类帐中有多少付款交易或记录落在异常值下限内。之后,它会计算超出较大异常值限制和较低异常值限制的支付百分比。结果旨在解释使用该变量的语句。您可以看到,有 366 笔高值支付在异常上限附近,740 笔交易在异常下限附近。高于异常值上限的事务约占总事务的 5%,低于异常值下限的事务占事务的 10.26%。
# PREPARING DATA
# Split the data into features and target label
payment_raw = pd.DataFrame(data['RedFlag'])
type(payment_raw)
features_raw = data.drop('RedFlag', axis = 1)
#Removing redundant columns from features_raw dataset
features_raw.dtypes
features_raw=features_raw.drop('TransactionNo', axis=1)
features_raw=features_raw.drop('Department', axis=1)
features_raw=features_raw.drop('Account', axis=1)
features_raw=features_raw.drop('Expense Category', axis=1)
features_raw=features_raw.drop('Vendor ID', axis=1)
features_raw=features_raw.drop('Payment Method', axis=1)
features_raw=features_raw.drop('Payment Date', axis=1)
features_raw=features_raw.drop('Invoice ID', axis=1)
features_raw=features_raw.drop('Invoice Date', axis=1)
features_raw=features_raw.drop('Unnamed: 0', axis=1)
features_raw.dtypes
type(features_raw)
Fiscal Year int64
Month int64
Payment Status object
Amount float64
dtype: object
Listing 15-9Preparing Data
准备数据集
既然我们已经确定我们的数据集中有很大比例的交易属于欺诈类别或危险信号,我们现在可以通过划分为特征和目标标签来准备我们的数据集。这在图 15-2 中完成。您会注意到,为了只保留那些对我们的模型构建很重要的特性,我去掉了相当多无用的特性,比如部门、账户、类别 ID、付款方式、付款日期、发票日期和发票 ID。这些列在我们的模型构建过程中非常重要。大多数时候,模型构建是一个迭代的过程,因此,如果我后来发现一些特性是必需的,可能被错误地选择了,或者没有给出足够的准确性,那么我可以考虑添加一些列,如 department、expense category 等。
在图 15-2 中,我展示了三列的分布:金额、月份和财政年度。请注意,所有这些列都是数字。分布函数不适用于非数字列。
图 15-2
可视化数字列
# Visualize skewed continuous features of original data
distribution(data)
在图 15-2 中,我使用了分布数据来显示金额、月份和财政年度的分布,我们可以清楚地看到,它们都不在正态分布曲线附近。所以这些是需要被转换的高度偏斜的分布。我将对这些功能应用的第一个转换是对数转换。请记住,与平均值的距离只能发生在数字特征上,因此我们选择了我们在图 15-2 的可视化中看到的三列或特征。应用对数变换后,下一步将是对这些要素应用比例,以便必须移除这些要素中每一个要素的巨大变化-例如,如果金额的变化范围从 0 到大于 2000,但是月最多只有 8000 条记录,财政年度也是如此。此外,金额以美元计量,月份从 0 到 12 计量,财政年度从一年到另一年计量。因此,如果我们不应用缩放器,那么我们将比较或使用不一致的特征,这就像比较苹果和桔子一样。在图 15-3 中,我们将看到我们的数据转换为对数转换,以及在数值数据集上应用最小最大缩放器,因为数据集中的特征具有非常不同的比例,并且包含一些非常大的异常值。这两个特征导致数据可视化困难,更重要的是,它们会降低许多机器学习算法的预测性能。未缩放的数据也会减缓甚至阻止许多基于梯度的估计器的收敛 [1 ]。
图 15-3
在支付数据集上应用对数变换和定标器
# Log-transform the skewed features
#Replacing Null values with zero due to software data entry problem
#Known issue in software user screen takes null values there is no check.
import warnings
warnings.filterwarnings("ignore")
features_raw.isnull().sum()
skewed = ['Amount','Month', 'Fiscal Year']
features_raw[skewed] = data[skewed].apply(lambda x: np.log(x + 1))
features_raw.isnull().sum()
features_raw.fillna(0, inplace=True)
features_raw.dtypes
# Visualize the new log distributions
distribution(features_raw, transformed = True)
#Normalizing Numerical Features
# Import sklearn.preprocessing.StandardScaler
from sklearn.preprocessing import MinMaxScaler
# Initialize a scaler, then apply it to the features
scaler = MinMaxScaler()
numerical = [ 'Amount','Month', 'Fiscal Year']
features_raw[numerical] = scaler.fit_transform(data[numerical])
如果你比较图 15-2 和图 15-3 ,那么这两个图清楚地显示了对数变换和缩放的效果,其中在图 15-3 中,在应用变换之后,金额特征几乎被标准化,月份特征也有一点改变,但是在财政年度特征中可以看到非常小的改变。
编码列
接下来,我将对一个支付状态列进行编码,这样做的原因是 Python scikit 学习库也需要分类变量的数值。在付款状态列中,我们只有两个值:一个是“已付-已对账”,另一个是“已付-未对账”。在清单 15-10 中,我将“已支付-已协调”热编码为值 0,将“已支付-未协调”热编码为值 1。然后我看看编码完成后我们有多少功能。
# Encoding the 'Non-Numeric' data to numerical values
#Payment Status column
d={"Paid-Reconciled": 0, "Paid-Unreconciled": 1}
features_raw['Payment Status'] = features_raw['Payment Status'].map(d)
# Printing the number of features after one-hot encoding
encoded = list(features_raw.columns)
print "{} total features after one-hot encoding.".format(len(encoded))
4 total features after one-hot encoding.
Listing 15-10Applying Hot Encoding
将数据分割成要素
在代码的下一部分(在清单 15-11 中给出),我将使用 SKlearn 包中的 train test split 函数将数据分割成特性和红旗。
# Importing train_test_split
from sklearn.cross_validation import train_test_split
payment_raw.columns
# Splitting the 'features' and 'RedFlags' data into training and testing sets
X_train, X_test, y_train, y_test = train_test_split(features_raw, payment_raw, test_size = 0.2, random_state = 0)
X_train.columns
X_test.columns
y_train.columns
y_test.columns
# Showing the results of the split
print "Training set has {} samples.".format(X_train.shape[0])
print "Testing set has {} samples.".format(X_test.shape[0])
Training set has 5834 samples
.
The testing set has 1459 samples.
Listing 15-11Dividing the Data into a Training Set and Test Set
评估模型性能
在此分割之后,我现在将执行模型性能评估,首先使用一个基准分类器 nave-Bayes,然后计算其准确度分数并导入五个其他分类器,比较它们之间的结果。您可以在清单 15-12 和 15-13 中看到结果。
#Evaluating Model Performance
#Establishing Benchmark performance indicator Naive Bayes
#Naive Predictor Performace
from sklearn.naive_bayes import GaussianNB
#from sklearn.metrics import accuracy_score, fbeta_score
from sklearn.metrics import accuracy_score, f1_score, precision_score, recall_score, classification_report, confusion_matrix
NB = GaussianNB()
NB.fit(X_train,y_train)
pred = NB.predict(X_test)
#Calculating Accuracy Score
#Calculating Beta Score
accuracy_score(y_test,pred)
print(f1_score(y_test,pred, average="macro"))
print(precision_score(y_test, pred, average="macro"))
print(recall_score(y_test, pred, average="macro"))
0.8064675486756182
0.7243305924520346
0.9656357388316151
Listing 15-12Scoring the Benchmark Predictor
我们看到基准预测器的 F1 分数、精度分数和召回分数都很好,分别为 0.80、0.72 和 0.96。现在我们有了基准预测器或分类器 nave Bayes 的分数,让我们将它应用于其他分类器,如清单 15-13 中给出的代码中的决策树、逻辑回归、SGD(梯度下降)、Extratrees 分类器和随机森林分类器。
图 15-4
比较来自分类器的结果
# I AM GOING TO DO INITIAL MODEL EVALUATION NOW
# Importing the three supervised learning models from sklearn
from sklearn.naive_bayes import GaussianNB
from sklearn.tree import DecisionTreeClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.linear_model import SGDClassifier
from sklearn.ensemble import ExtraTreesClassifier
from sklearn.ensemble import RandomForestClassifier
# Initialize the three models
clf_A = GaussianNB()
clf_B = DecisionTreeClassifier(max_features=0.2, max_depth=2, min_samples_split=2,random_state=0)
clf_C = LogisticRegression(random_state=0)
clf_D = SGDClassifier(loss="hinge", penalty="l2")
clf_E = ExtraTreesClassifier(n_estimators=2, max_depth=2,min_samples_split=2, random_state=0)
clf_F = RandomForestClassifier(max_depth=2)
# Calculate the number of samples for 1%, 10%, and 100% of the training data
#Defining function since percent is required 3 times
# Collect results on the learners
learners=["Naive Bayes","Decision Tree","Logistic Regression","SGD Classifier","ExtaTrees Classifier","RandomFores Classifier"]
cnt=0
columns=['learner','train_time','pred_time','acc_train','acc_test','f1_score']
learningresults= pd.DataFrame(columns=columns)
results = {}
for learner in [clf_A, clf_B, clf_C,clf_D,clf_E,clf_F]:
#print(learners[cnt])
results['learner']=learners[cnt]
#Fitting the learner to the training data using slicing with 'sample_size'
start = time() # Get start time
learner.fit(X_train, y_train)
#Calculating the total prediction time
end = time() # Get end time
results['train_time'] = end - start
start = time() # Get start time
predictions_test = learner.predict(X_test)
predictions_train = learner.predict(X_train)
end = time() # Get end time
results['pred_time'] = end - start
results['acc_train'] = accuracy_score(y_train, predictions_train)
results['acc_test'] = accuracy_score(y_test, predictions_test)
beta=0.5
results['f1_score'] = f1_score(y_test,pred, average="macro")
print(results)
learningresults.loc[cnt]=results
cnt=cnt+1
#Looking at the plots to determine the best Classifier for our Dataset
print(learningresults)
learningresults.columns
learningresults.plot(kind='bar', x="learner", legend="reverse", title='Classifier Algorithms Compared- Accounts Payment Dataset',figsize=(10,10), fontsize=20)
Listing 15-13Initial Model Evaluation
在我们进一步进行模型实现之前,我想讨论学习者数据集的结果,该数据集存储了用于训练时间的 train_time 和用于预测时间的 pred_time、用于训练期间准确性的 acc_train、用于测试期间准确性的 acc_test 以及用于 f1 分数的 f1_score。这些在表 15-1 中给出。
有多种方法可以为您的模型选择最佳的学习器或分类器。不同的数据集和应用模型的不同商业情境可以决定哪个学习者最适合你。例如,仅使用一揽子参数进行模型选择(如最低训练时间)不一定是好的,因为它可能是在测试或 f1 分数期间准确度较低的学习者。此外,如果您为将应用于批量离线流程(如月度报告或其他此类夜间流程)的模型选择学习者,那么您的目标可能不是最低的训练和预测时间。如果业务人员希望在最短的预测时间内获得更高的准确性,那么在我们的例子中,您可以选择 SGD 分类器。应用模型的环境更为重要,它决定了模型的选择标准。
表 15-1
比较学习者或分类器
|学习者
|
火车时间
|
pred_time
|
acc_train
|
acc _ 测试
|
f1 _ 分数
|
| — | — | — | — | — | — |
| 决策图表 | Zero point zero zero one | Zero point zero zero one | 0.857045 | 0.880055 | 0.806468 |
| 纳伊夫拜厄斯 | Zero point zero zero two | Zero point zero zero two | 0.910525 | 0.910898 | 0.806468 |
| SGD 分类器 | Zero point zero zero nine | Zero | 0.947377 | 0.946539 | 0.806468 |
| 树外分类器 | Zero point zero one | Zero point zero zero two | 0.858759 | 0.867032 | 0.806468 |
| 逻辑回归 | Zero point zero two eight | Zero point zero zero one | 0.96349 | 0.971213 | 0.806468 |
| 随机森林分类器 | Zero point one four six | Zero point zero one one | 0.948234 | 0.956134 | 0.806468 |
在表 15-1 中,所有分类器的 f1 分数都是 0.8064,因此不能考虑进行选择。我使用了逻辑回归,就测试数据集的最少训练时间和最高准确度而言,它是最好的分类器。在清单 15-14 中,让我们使用这个模型通过 GridSearch 交叉验证进行超参数调优。
# Import 'GridSearchCV', 'make_scorer', and any other necessary libraries
from sklearn.metrics import make_scorer
from sklearn.model_selection import GridSearchCV
from IPython.display import display
import pickle, os.path
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import fbeta_score
def getscore(y_true, y_predict):
return fbeta_score(y_true, y_predict, beta)
best_clf = None
beta=0.5
#Initialize the classifier
clf_C = LogisticRegression(random_state=0)
# Create the parameters list you wish to tune
#parameters = {'n_estimators':range(10,20),'criterion':['gini','entropy'],'max_depth':range(1,5)}
parameters = {'solver':['newton-cg', 'lbfgs', 'liblinear', 'sag', 'saga'],'C':range(1,10),'max_iter':range(50,100)}
# Make an fbeta_score scoring object
scorer = make_scorer(getscore)
# Perform grid search on the classifier using 'scorer' as the scoring method
#grid_obj = GridSearchCV(clf_C, parameters, scoring=scorer)
#do something
grid_obj = GridSearchCV(clf_C, parameters)
#grid_obj = GridSearchCV(clf_C, parameters)
# Fit the grid search object to the training data and find the optimal parameters
from datetime import datetime
startTime = datetime.now()
grid_fit = grid_obj.fit(X_train, y_train)
CV_lr = GridSearchCV(estimator=clf_C, param_grid=parameters, cv= 5)
CV_lr.fit(X_train, y_train)
print(datetime.now() - startTime)
# Get the estimator
best_clf = grid_fit.best_estimator_
# Make predictions using the unoptimized and model
predictions = (clf_C.fit(X_train, y_train)).predict(X_test)
best_predictions = best_clf.predict(X_test)
# Report the before-and-afterscores
print "Unoptimized model\n------"
print "Accuracy score on testing data: {:.4f}".format(accuracy_score(y_test, predictions))
print "F-score on testing data: {:.4f}".format(fbeta_score(y_test, predictions, beta = 0.5,average='micro'))
print "\nOptimized Model\n------"
print "Final accuracy score on the testing data: {:.4f}".format(accuracy_score(y_test, best_predictions))
print "Final F-score on the testing data: {:.4f}".format(fbeta_score(y_test, best_predictions, beta = 0.5,average='micro'))
0:39:21.351000
Unoptimized model
------
Accuracy score on testing data: 0.9712
F-score on testing data: 0.9712
Optimized Model
------
Final accuracy score on the testing data: 0.9925
Final F-score on the testing data: 0.9925
Listing 15-14Tuning the Model Using GridSearch Cross-Validation Method
如你所见,我对最佳选择的分类器——逻辑回归——实现了 GridSearch 交叉验证,它花了大约 39 分 21 秒得出结果。优化模型的结果非常好,精确度分数和 F 分数为 0.9925,与未优化模型的精确度分数 0.9712 和 F 分数 0.9712 相比有了显著提高。在清单 15-15 中,我现在打印最终调整的参数,这些参数将是我们用于预测模型的参数。
# Print the final parameters
df = pd.DataFrame(grid_fit.grid_scores_).sort_values('mean_validation_score').tail()
display(df)
print "Parameters for the optimal model: {}".format(clf.get_params())
parameters \
2098 {u'C': 9, u'max_iter': 69, u'solver': u'sag'}
2099 {u'C': 9, u'max_iter': 69, u'solver': u'saga'}
2100 {u'C': 9, u'max_iter': 70, u'solver': u'newton...
2086 {u'C': 9, u'max_iter': 67, u'solver': u'lbfgs'}
2249 {u'C': 9, u'max_iter': 99, u'solver': u'saga'}
mean_validation_score cv_validation_scores
2098 0.985087 [0.9881808838643371, 0.9845758354755784, 0.982...
2099 0.985087 [0.9881808838643371, 0.9845758354755784, 0.982...
2100 0.985087 [0.9881808838643371, 0.9845758354755784, 0.982...
2086 0.985087 [0.9881808838643371, 0.9845758354755784, 0.982...
2249 0.985087 [0.9881808838643371, 0.9845758354755784, 0.982...
Parameters for the optimal model: {'warm_start': False, 'oob_score': False, 'n_jobs': 1, 'min_impurity_decrease': 0.0, 'verbose': 0, 'max_leaf_nodes': None, 'bootstrap': True, 'min_samples_leaf': 1, 'n_estimators': 10, 'min_samples_split': 2, 'min_weight_fraction_leaf': 0.0, 'criterion': 'gini', 'random_state': None, 'min_impurity_split': None, 'max_features': 'auto', 'max_depth': 2, 'class_weight': None}
Listing 15-15Tuned Parameter for Logistic Regression Prediction Model
我们可以看到,相关的最佳模型参数是 bootstrap:True,这意味着 GridSearch 交叉验证能够在模型上应用 bootstrap,以便获得最佳结果。有关自举如何帮助模型调优的更多信息,请阅读 IEEE 的研究论文( https://ieeexplore.ieee.org/document/6396613/
)。其他重要的参数是 n 估计值:10,最大深度:2。
确定特征
在找出逻辑回归预测模型的调整参数后,我现在将进入前五个功能的重要性,这将帮助我们确定我们的功能如何在预测模型中帮助我们。您可以使用 feature_plot()函数在清单 15-16 中看到这段代码,我们在前面的代码中已经看到过。
图 15-5
使用分类器的特征选择
# Now Extracting Feature Importances
# importing a supervised learning model that has 'feature_importances_'
from sklearn.ensemble import ExtraTreesClassifier
from sklearn.feature_selection import SelectFromModel
from sklearn.metrics import fbeta_score
# Training the supervised model on the training set
model = ExtraTreesClassifier()
model.fit(X_train, y_train)
# TODO: Extract the feature importances
importances = model.feature_importances_
# Plot
feature_plot(importances, X_train, y_train)
Listing 15-16Extracting Feature Importances
正如所料,金额是我们模型中最重要的特征,其次是支付状态。请记住,我们在这个数据集中的欺诈是基于红旗列中的这两列。大于第 75 百分位的 1.5 倍且支付状态为未对账的异常值被视为潜在欺诈或洗钱交易。同样,低于 1.5 倍第 25 百分位的下限和支付状态为未对账的交易被视为潜在欺诈或洗钱支付交易。从图中我们可以看到,财政年度和月份对我们的预测模型没有任何重大影响,并且具有较低的特征权重。现在我们已经看到了最好的两个特性,让我们选择这些特性,以便我们的模型可以最终完成。这是在清单 15-17 中完成的。
# Feature Selection
# Import functionality for cloning a model
from sklearn.base import clone
best_clf= clf_F
# Reduce the feature space
X_train_reduced = X_train[X_train.columns.values[(np.argsort(importances)[::-1])[:5]]]
X_test_reduced = X_test[X_test.columns.values[(np.argsort(importances)[::-1])[:5]]]
# Train on the "best" model found from grid search earlier
clf = (clone(best_clf)).fit(X_train_reduced, y_train)
best_predictions = best_clf.predict(X_test)
# Make new predictions
reduced_predictions = clf.predict(X_test_reduced)
# Report scores from the final model using both versions of data
print "Final Model trained on full data\n------"
print "Accuracy on testing data: {:.4f}".format(accuracy_score(y_test, best_predictions))
print "F-score on testing data: {:.4f}".format(fbeta_score(y_test, best_predictions, average="macro", beta = 0.5))
print "\nFinal Model trained on reduced data\n------"
print "Accuracy on testing data: {:.4f}".format(accuracy_score(y_test, reduced_predictions))
print "F-score on testing data: {:.4f}".format(fbeta_score(y_test, reduced_predictions, beta = 0.5, average="macro"))
Final Model trained on full data
------
Accuracy on testing data: 0.9561
F-score on testing data: 0.6537
Final Model trained on reduced data
------
Accuracy on testing data: 0.9548
F-score on testing data: 0.6523
Listing 15-17Feature Selection and Model Implementation
在最终模型和包括所有四个特征的完整数据之间,以及与简化数据相比,我们没有如此大的结果。因此,在我看来,我们可以保留完整的数据集,没有必要丢弃其他的特性,比如月份和财政年度。
最终参数
我们模型的最终参数在清单 15-18 中给出。
# Print the final parameters
print "Parameters for the optimal model: {}".format(clf.get_params())
Parameters for the optimal model: {'warm_start': False, 'oob_score': False, 'n_jobs': 1, 'min_impurity_decrease': 0.0, 'verbose': 0, 'max_leaf_nodes': None, 'bootstrap': True, 'min_samples_leaf': 1, 'n_estimators': 10, 'min_samples_split': 2, 'min_weight_fraction_leaf': 0.0, 'criterion': 'gini', 'random_state': None, 'min_impurity_split': None, 'max_features': 'auto', 'max_depth': 2, 'class_weight': None}
Listing 15-18Parameters for the Optimized Model
至此,我们完成了机器学习在支付数据集中的实现。该实现非常类似于您在本书的医疗保健和零售部分看到的方法;但是,我们在这里使用了支付交易数据集,这要求我们调整定义洗钱交易的一些方式。请记住,这是一种非常幼稚和简单的欺诈检测方法。在现实世界中,模型和数据变得更加复杂,例如增加国籍、ip 地址或位置等的复杂性。
尾注
十六、金融人工智能案例研究
**免责声明:**本书中的案例研究取自现实生活中的组织。已经注意确保组织的名称及其员工的姓名被更改,并且不与我的客户有任何相似之处。熟悉金融行业的读者肯定会发现这些情况非常实用且有见地。
案例研究 1:股票市场运动预测
RISEGOINVEST 是一家领先的投资咨询公司和基金管理公司,自 1997 年成立以来,其基金增长了许多倍,当时美国证券市场的表现超过了全球同行十多年,迄今为止表现最好的是道琼斯工业平均指数,增长了 20%。其创始人兼董事长 Jimiki Takasata 成立了这家公司,旨在建立一条通往亚洲、中东和非洲等新兴市场的重要投资渠道。他有远见,知道发达国家将看到增长受阻,新兴市场将看到下一阶段的指数增长,并提供发达经济体没有提供的机会。那时,他是羊群中的独狼,他要求他的投资者开始寻找发展中国家和新兴市场。然而,第一年他就筹集了超过 6 亿美元的资金。这表明人们相信他作为投资者的能力,他的远见在当时得到了很多人的认同。
自早期增长阶段以来,该公司已呈指数增长,2017 年全球投资基金超过 925 亿美元。Takasata 先生建立了一个伟大的投资顾问团队,他们不仅是各自领域的专家,而且是能够发现世界各地将要发生的投资趋势的专业人士。他们在 2000 年初发现了像印度和中国这样的新兴经济体的崛起,并开始为他们的主要客户推动大量投资,给他们带来丰厚的回报,即使是在全球经济衰退的年代。这为该公司赢得了良好的声誉,也是其投资客户群增长的主要原因。随着所有的增长和趋势,risegoeventure 的基金经理和投资顾问错过了一些投资机会。例如,它未能预见到非洲国家投资机会的增加。它还在香港和马来西亚的证券市场为许多客户投资失败,在那里它遭受了严重的损失。
来自更高效管理新兴市场基金的竞争对手的竞争也有所加剧。由于竞争,投资者对新兴市场基金经理和顾问的要求越来越高。鹦鹉先生就是这样一个主要投资者。他将个人资金投资于高田先生的公司,总额达 8.5 亿美元。他是该公司非常重要的客户,因为他从 2003 年开始就和他们一起投资。这是超过十年的关系。高萨塔的投资顾问吉姆·卡特扎特(Jim Catzat)负责管理长尾小鹦鹉的账户,他向高萨塔报告了他所说的与客户的“不同寻常的对话”。在与鹦鹉先生的季度会议上,他要求吉姆给他提供关于新兴国家股票市场的非常准确的报告——特别是印度,他在那里有大量投资。鹦鹉先生希望关于他在印度股票市场投资的每日和每周咨询报告能够准确预测他投资的股票市场和个别股票的价格。吉姆告诉鹦鹉先生,目前的报告对他的股票发出了警告,这是基于他的公司为他做的各种基本面和技术面的分析,并反映在每天和每周发给他的报告中。鹦鹉先生说,“我需要你把你的报告调整到这样一个程度,那就是你向我预测明天或下一个交易日的股票市场运动或股票价格运动。”Jim 说,这是不可能实现的,因为预测股票价格是不可能的,因为股票价格是基于各种因素的,从宏观到微观指标的这些因素本身都是不可预测的。对此,吉姆回答说:“我给你一个月的时间。如果你没有这样的系统,那就开发它,给我一份至少 80%准确的印度股票价格报告,否则我会把我的资金转移到其他公司。”
在被 Jim 告知后,Takasata 先生解释说,这是一个大客户,口碑是非常重要的,所以如果这个客户不满意,口碑也会传给其他客户,他们也可以将他们的资金转移给其他基金经理。他让吉姆向该公司的计算机科学家 Kazy Korone 咨询,看看是否有一种计算机模型可以预测股票市场价格。
吉姆安排了一次与 Kazy 的会面,从她那里了解这样的事情是否有可能在第一时间完成,以及是否可以在 4 周内完成,这是客户给他们的。Kazy 告诉他,利用机器学习,有可能建立这样一个可以预测股票价格的模型。然而,它需要印度股票市场过去 10 年的数据。她要求他给她一周的时间来建立一个原型,以演示根据股票在最后一个交易日的收盘价预测股票价格。
案例研究的问题
-
你认为有可能对任何给定的股票建立机器学习预测模型,并预测其第二天的价格吗?
-
建立这样一个预测模型需要哪些数据?定义常用的数据特征,如股票名称、收盘价、开盘价等。
-
对于像印度这样的新兴市场,什么来源能给你最准确的股市数据?这些数据是免费的还是需要付费的?
-
从数据源收集数据后,您会采用什么方法来定义机器学习预测模型?
-
使用问题 4 中定义的方法,列出一两个你将在模型中使用的算法。
-
你实际的基于 Python 的机器学习解决方案是什么?
案例研究的建议解决方案
这个案例研究的解决方案将尝试以业务人员和机器学习专业人员都可以接受的方式回答每个问题。请记住,对于给定的问题,没有解决方案是最终的解决方案,在这种案例研究方法中,您可能会找到自己独特的解决方案。给出此解决方案的目的是为了让您了解如何为给定的业务问题找到专业的解决方案;重要的是要求给出解决方案的时间框架。但是,为了让您充分理解业务问题,我将要求您使用我在本书的医疗保健和零售部分向您展示的一些流程和原则,为这个案例研究问题开发一个成熟的解决方案。
答案 1
我确实认为有可能开发一个链式模型来预测下一个交易日的股票价格。我确信这一点,因为价格只不过是数字数据,它是在股票市场进行盘点时每分每秒产生的。有各种各样的算法可以用来预测股票市场价格,其中大部分是回归方程。
让我们好好看看一个基本回归器,因为构建原型非常短。然后,当一个成熟的解决方案构建完成后,我们可以考虑对其进行改进。
答案 2
在我看来,除了目标预测值(即价格)之外,还需要以下特征:
-
日期:股票交易的日期。
-
开盘价:当日股票的开盘价。
-
高:当日股票的最高价格。
-
低:当日股票的最低价格。
-
最后:当日股票的最后交易价格。
-
收盘:当日股票的收盘价。
答案 3
截至撰写本书时,目前有以下免费数据源可用于获取国家证券交易所和孟买证券交易所的数据。
Yahoo 使用 Pandas datareader 库:在清单 16-1 中,我给出了一个示例代码,可以使用这个 Python 脚本下载任何股票价格历史值。
# -*- coding: utf-8 -*-
"""
Created on Sun Dec 3 23:32:32 2017
@author: PUNEETMATHUR
"""
import numpy as np
import pandas as pd
#import pandas.io.data as web
from pandas_datareader import data, wb
sp500= data.DataReader('^GSPC', data_source="yahoo", start='1/1/2000', end='1/12/2017')
#sp500= data.DataReader('^GSPC', data_source="yahoo")
sp500.ix['2010-01-04']
sp500.info()
print(sp500)
print(sp500.columns)
print(sp500.shape)
import matplotlib.pyplot as plt
plt.plot(sp500['Close'])
# now calculating the 42nd Days and 252 days trend for the index
sp500['42d']= np.round(pd.rolling_mean(sp500['Close'], window=42),2)
sp500['252d']= np.round(pd.rolling_mean(sp500['Close'], window=252),2)
#Look at the data
sp500[['Close','42d','252d']].tail()
plt.plot(sp500[['Close','42d','252d']])
Listing 16-1Simple Python Script to Get Stock Market Data
例如,这个脚本获取标准普尔 500 指数的数据,然后通过将数据存储在 Pandas dataframe 中来绘制图表。然而,这个数据不是很准确,因为它也包含了节假日和周六的值,而我们确实知道股市是关闭的。所以我们有来自雅虎的数据来源,但是不准确。然后我给你看另一个来源,有免费的准确数据:Quandl.com。这些数据可以免费挖掘,没有很多限制。你需要在他们的网站上注册并获得一个免费的 api 密匙才能在这里工作: https://www.quandl.com/data/NSE-National-Stock-Exchange-of-India
。
现在,一旦您注册并从 Quandl 获得免费的 api 密钥,您就可以使用他们的 Python api 直接下载数据。
在开始使用清单 16-2 中的脚本之前,您需要使用 pip 安装程序安装 Quandl 包。现在我给你看图 16-1 。使用 quandl 免费 Python 库下载样本股票的数据。
pip install Quandl
# -*- coding: utf-8 -*-
"""
Created on Sat Sep 22 23:43:13 2018
@author: PUNEETMATHUR
"""
import quandl
quandl.ApiConfig.api_key = 'INSERT YOU API KEY HERE'
# get the table for daily stock prices and,
# filter the table for selected tickers, columns within a time range
# set paginate to True because Quandl limits tables API to 10,000 rows per call
data = quandl.get_table('WIKI/PRICES', ticker = ['AAPL', 'MSFT', 'WMT'],
qopts = { 'columns': ['ticker', 'date', 'adj_close'] },
date = { 'gte': '2015-12-31', 'lte': '2016-12-31' },
paginate=True)
data.head()
# create a new dataframe with 'date' column as index
new = data.set_index('date')
# use pandas pivot function to sort adj_close by tickers
clean_data = new.pivot(columns='ticker')
# check the head of the output
clean_data.head()
#Below script gets you Data from National Stock Exchange for a stock known as Oil India Limited
import quandl
quandl.ApiConfig.api_key = 'z1bxBq27SVanESKoLJwa'
quandl.ApiConfig.api_version = '2015-04-09'
import quandl
data = quandl.get('NSE/OIL')
data.head()
data.columns
data.shape
#Storing data in a flat file
data.to_csv("NSE_OIL.csv")
#A basic plot of the stocks data across the years
data['Close'].plot()
Listing 16-2Loading Data from Quandl
图 16-1
使用 quandl 免费 Python 库下载样本股票的数据
你会注意到,在代码的第一部分,我给出了一个例子,说明如何使用 Quandl 库获取苹果、微软和沃尔玛等股票的市场价格。我还向您展示了如何清理数据,并在清理后以可展示的形式显示出来。在引言的第二部分,我将向您展示如何从 Quandl 获取国家证券交易所(NSE)的数据。在这里,我使用的是一家名为印度石油有限公司的股票,我正在搜索它的数据,并将其存储在一个文件中,然后显示它的曲线图。你也会注意到股票有 2009 年到 2018 年的数据。所以这是一个非常好的股票市场免费数据来源。这是我向我所有的读者推荐的资源,为这个案例研究提供一个解决方案。
答案 4
我解决这个问题的方法是,首先通过答案 3 中所示的方法从 Quandl 获取关于一家公司的数据。使用 Python 脚本后,将数据存储在一个平面 csv 文件中,然后清除包含空值的数据。用日期列对数据进行排序。通过查看年和月的可视化数据进行探索性的数据分析。计算股票的简单移动平均线,因为它是衡量股票表现的好指标。我将主要为这个预测模型使用三列:[‘Date ‘,’ Open ‘,’ Close’]。但是,我将从第二天的开盘价创建一个派生值列,并将其添加到前一天的价格中。所以我创建了一个新特性[‘NextDayOpen’]。让我用清单 16-3 中的例子来说明这一点。
Date Open Close
5909 1991-02-08 60.00 60.00
5908 1991-03-15 65.00 75.00
5907 1991-03-18 65.00 70.00
Date Open Close NextDayOpen
5909 1991-02-08 60.00 60.00 0
5908 1991-03-15 65.00 75.00 60
5907 1991-03-18 65.00 70.00 65
5906 1991-03-20 67.50 72.50 65
Listing 16-3Example of Adding Next Day Open Column Values
我们可以从清单 16-3 中看到,原来只有三列(日期、打开和关闭特性)的 dataframe 现在也增加了一个 NextDayOpen 特性。这只不过是前一天的开盘价结转到第二天开盘的功能。第一个是空的,因为它没有以前的开放值。实际上,现在 NextDayOpen 列成为我们的目标变量或预测值。这是我们第二天要预测的。这个概念是理解这个预测模型如何工作的基础和关键。
完成这些后,创建一个基于线性回归的模型来预测下一个交易日的股价。尽管这是一个简单的预测原型模型,但是当它投入生产时,我们需要尝试一些其他的回归模型,比如决策树等等。我让您自己尝试,选择最适合您的生产环境的型号。
答案 5
我会使用线性回归来建立一个原型模型。这样做的原因是因为在案例研究中,很少有时间来建立一个给定的模型,而线性回归技术提供了最快的实现和获得结果的方法。唯一可能做得不好的部分是预测模型的准确性水平;然而,如果你很着急,那么就要做出权衡。
答案 6
现在,我向您展示我在本案例研究的答案 5 中讨论过的解决方案。您将看到清单 16-4 中的代码。我假设你已经使用图 16-1 中给出的 Python 脚本加载了数据,并将其存储在一个 csv 文件中。
# -*- coding: utf-8 -*-
"""
Created on Sun Dec 17 20:30:01 2017
@author: PUNEETMATHUR
I am creating this script to predict next day Opening Price based on
Today's Closing Price for any given stock
"""
import numpy as np
import pandas as pd
import os
#Change your directory to wherever your dataset is stored
os.chdir("E:\\") # Change this to your directory or path where you have downloaded the dataset
.
#Loading the dataset of the company for which prediction is required
df=pd.read_csv("BalmerLawrieColtd.csv",parse_dates=['Date'])
print(df.head(1))
print(df.columns)
Out[*]:
Unnamed: 0 Date Open High Low Close WAP No. of Shares \
0 1 2017-12-29 278.85 279.15 272.6 274.55 276.1 19372
No. of Trades Total Turnover Deliverable Quantity \
0 504 5348670.0 10024.0
% Deli. Qty to Traded Qty Spread H-L Spread C-O
0 51.74 6.55 -4.3
Index([u'Unnamed: 0', u'Date', u'Open', u'High', u'Low', u'Close', u'WAP',
u'No. of Shares', u'No. of Trades', u'Total Turnover',
u'Deliverable Quantity', u'% Deli. Qty to Traded Qty', u'Spread H-L',
u'Spread C-O'],
dtype='object')
df.shape
Out[91]: (5911, 14)
Listing 16-4Loading Data
到目前为止,我已经加载了数据并查看了它的形状,它由 5911 行和 14 列组成。有很多额外的数据是我们在构建原型模型时不需要的,因此我将删除它们,只选择清单 16-5 中模型构建练习所需的那些特性。
#Selecting only relevant columns required for prediction
cols=['Date','Open','Close']
df=df[cols]
print(df.columns)
print(df.head(5))
Index([u'Date', u'Open', u'Close'], dtype="object")
Date Open Close
0 2017-12-29 278.85 274.55
1 2017-12-28 276.75 276.15
2 2017-12-27 276.40 275.45
3 2017-12-26 269.00 268.10
4 2017-12-22 269.60 270.10
Listing 16-5Selecting Only the Relevant Columns for Our Prototype Model
我们可以从清单 16-5 中的代码结果看到,它只有我们想要的相关数据。现在让我们进入下一步,检查清单 16-6 中数据集中的空行。
# Checking data if Cleaning up data is required
df.isnull().any()
#df=df.dropna()
#df=df.replace("NA",0)
df.dtypes
Out[96]:
Date datetime64[ns]
Open float64
Close float64
dtype: object
Listing 16-6Checking for Data Clean-Up
从清单 16-6 中可以看出,我们没有任何清理工作要做,因为没有空行。这就是为数据集选择好的数据源的好处。Quandl.com 是全球股市数据的良好来源。现在让我们通过将数据绘制在清单 16-7 中来快速可视化数据。我们将数据可视化在下图 16-2 中。
#Sorting up data to plot historically ascending values in graph
df = df.sort_values(by='Date',ascending=True)
#Plotting the price of stock over the years
#What story does it tell?
import matplotlib.pyplot as plt
plt.plot(df['Date'],df['Close'])
Listing 16-7Plotting the data
图 16-2
可视化数据
我们看到这只特殊的股票 Balmer Lawrie Co. Ltd .在 2016 年见顶,在跌至低点之前是其有史以来的最高价格。接下来,我们绘制图表来检查去年和上个月的数据,看看我们是否注意到清单 16-8 和图 16-3 中给出的价格变动的一些不寻常之处。
#Now plot only for last one year and last 1 month
df['Date'].dt.year==2017
mask=(df['Date'] > '2017-1-1') & (df['Date'] <= '2017-12-31')
print(df.loc[mask])
df2017=df.loc[mask]
print(df2017.head(5))
plt.plot(df2017['Date'],df2017['Close'])
Listing 16-8Plotting data for last year and a month
图 16-3
可视化一年的数据
我们可以看到,这只股票在 11 月和 12 月左右见顶,然后在 2018 年 1 月略有上涨。此外,我们会在 2017 年 3 月至 6 月以及 8 月至 9 月看到一些季度业绩峰值。
现在让我们来看看这 1 个月的数据,看看它是否显示了我们的任何特点(列表 16-9 和图 16-4 )。
图 16-4
可视化 1 个月的股票数据
#Plotting last 1 month data on stock
mask=(df['Date'] > '2017-11-17') & (df['Date'] <= '2017-12-26')
print(df.loc[mask])
dfnovdec2017=df.loc[mask]
print(dfnovdec2017.head(5))
plt.plot(dfnovdec2017['Date'],dfnovdec2017['Close'])
Listing 16-9Plotting 1 month stock data
我们可以在图表中看到,该股票在 2017 年 11 月 26 日之后达到顶峰,在 2017 年 12 月 10 日至 2017 年 12 月 17 日期间处于最低点。而我们可以通过搜索有关股票分红的新闻、季度业绩、股票回购新闻或股票分割新闻等来找出股票下跌的原因。这是你在向客户展示结果时可以做的事情,客户肯定会有兴趣知道这种高峰和低谷的原因。然而,在本解决方案中,我将跳过这一步,直接进入下一步,计算清单 16-10 和图 16-5 中股票 1 年的简单移动平均线。
图 16-5
用简单移动平均线绘制股票价格
#Now calculating the Simple Moving Average of the Stock
#Simple Moving Average One Year
df2017['SMA'] = df2017['Close'].rolling(window=20).mean()
df2017.head(25)
df2017[['SMA','Close']].plot().
Listing 16-10Calculating Simple Moving Average of the Stock
你会注意到简单移动平均线非常仔细地跟踪股票,有时与价格运动曲线不太吻合。例如,在 x 轴上的点 0 和 50 之间,SMA 的蓝线远低于实际价格线。在 x 轴点 100 和 150 之间,以及 x 轴点 150 和 200 之间,也可以看到这种情况。SMA 也被称为技术指标,我用过 20 天的滚动窗口,它是在代码 df2017[‘SMA’] = df2017[‘Close’]的部分定义的。滚动(窗口=20 )。mean()定义收盘价的平均值。现在我们来到这个模型建筑的中心部分,在这里我问开盘价和收盘价是否彼此跟随得很好。如图 16-6 所示。
图 16-6
股票的开盘价和收盘价是否相互一致?
#Does the Open and Closing price of the stock follow very well?
df2017[['Open','Close']].plot()
是的,目测所选股票 Balmer Lawries Co. Ltd .的开盘价和收盘价之间似乎有非常好的关系,但在 x 轴分笔成交点 50 附近以及 x 轴分笔成交点 100 和 150 之间的少数地方,我们发现开盘价和收盘价之间有差距,它们在 2017 年并没有非常紧密地跟随自己。让我们通过在表 16-1 中建立它们之间的关联来检查这一点。
表 16-1
检查列之间的相关性
| |打开
|
关闭
|
主题区(subject matter area 的缩写)
|
| — | — | — | — |
| 打开 | 1 | 0.962507 | 0.799758 |
| 关闭 | 0.962507 | 1 | 0.788695 |
| 高中 | 0.799758 | 0.788695 | 1 |
df2017.corr()
Out[104]:
In [105]:
我们可以看到开盘价和收盘价之间的相关性很强,为 0.96。所以是的,有一个很大的可能性,就是做一个预测股价的模型。SMA 的相关性在这里是不相关的,因为它是一个派生列,而不是我们可以用于预测目的的东西。这也体现在开盘价和 SMA 的相关性为 0.79,收盘价和 SMA 的相关性为 0.788。
现在,在我们继续创建新的列来进行图 16-7 中的预测之前,让我们也看一个月的 SMA。想象 SMA 一个月。
#Simple Moving Average One Month
dfnovdec2017['SMA'] = dfnovdec2017['Close'].rolling(window=2).mean()
dfnovdec2017.head(25)
dfnovdec2017[['SMA','Close']].plot()
Listing 16-11Calculating Moving Average for One Month
图 16-7
想象 SMA 一个月
滚动窗口为 2 的 1 个月的 SMA 给出了 1 个月的平均值。
dfnovdec 2017[’ SMA ‘]= dfnovdec 2017[’ Close ']。滚动(窗口=2)。平均值()。正是这种设置使我们能够获得 2017 年 11 月和 12 月的数据-大约 30 天的数据。现在,在清单 16-12 中,我将向您展示一种在 NextDayOpen 中创建列的方法,我们在前面的答案 5 中看到了这种方法。
#Now creating NextDayOpen column for prediction
ln=len(df)
lnop=len(df['Open'])
print(lnop)
ii=0
df['NextDayOpen']=df['Open']
df['NextDayOpen']=0
for i in range(0,ln-1):
print("Open Price: ",df['Open'][i])
if i!=0:
ii=i-1
df['NextDayOpen'][ii]=df['Open'][i]
print(df['NextDayOpen'][ii])
Listing 16-12Creating NextDayOpen column for Prediction
您会注意到,我使用了一个 for 循环来遍历数据帧中的每一行,然后它进入一个 for 循环,其中 NextDayOpen 列从以前的开盘价更新。这是模型的实际逻辑工作的地方。您可以通过 apply()函数或 lambda 函数实现同样的功能;然而,我的其他语言的根使我这样做。我认为使用 apply()和 lambda()函数更有效、更快。所以如果你想使用这些函数,你可以在这里创建你自己的代码。这需要一段时间来完成,所以在新列更新后,我们可以看到清单 16-13 中的数据。
('Open Price: ', 70.0)
70
('Open Price: ', 65.0)
65
('Open Price: ', 67.5)
67
('Open Price: ', 65.0)
65
('Open Price: ', 65.0)
65
('Open Price: ', 60.0)
60
rint(df['NextDayOpen'].head())
5910 0
5909 0
5908 60
5907 65
5906 65
Name: NextDayOpen, dtype: int64
Listing 16-13Looking at the New Column Data.
我们看到数据已经在 NextDayOpen 列中更新,并为我们构建回归模型做好了准备。
现在,我们检查收盘价和 NextDayOpen 之间的相关性,看看是否有任何关系来构建我们的模型。
#Now checking if there is any correlation
dfnew=df[['Close','NextDayOpen']]
print(dfnew.head(5))
dfnew.corr()
Out[110]:
Listing 16-14Checking Correlation between columns
In [111]:
表 16-2
NextDayOpen 和 Close 列之间的相关性
| |关闭
|
下一天开放
|
| — | — | — |
| 关闭 | one | 0.997021 |
| 下一天开放 | Nine hundred and ninety-seven thousand and twenty-one | 1.000000 |
正如我们所看到的,这支股票的第二天开盘价和收盘价之间肯定有很好的相关性。因此,让我们继续使用清单 16-15 中的线性回归方法构建一个预测模型。
#Now Creating the Prediction model as correlation is very high
#Importing the libraries
from sklearn import cross_validation
from sklearn.utils import shuffle
from sklearn import linear_model
from sklearn.metrics import mean_squared_error, r2_score
#Creating the features and target dataframes
price=dfnew['Close']
print(price)
print(dfnew.columns)
features=dfnew[['NextDayOpen']]
#Shuffling the data
price=shuffle(price, random_state=0)
features=shuffle(features,random_state=0)
#Dividing data into Train and Test
X_train, X_test, y_train, y_test= cross_validation.train_test_split(features,price,test_size=0.2, random_state=0)
#Linear Regression on Sensex data
reg= linear_model.LinearRegression()
X_train.shape
reg.fit(X_train, y_train)
regDT.fit(X_train, y_train)
y_pred= reg.predict(X_test)
y_pred= regDT.predict(X_test)
print("Coefficients: ", reg.coef_)
#Mean squared error
print("mean squared error: ",mean_squared_error(y_test,y_pred))
#Variance score
print("Variance score: ", r2_score(y_test, y_pred))
#STANDARD DEVIATION
standarddev=price.std()
#Predict based on Opening BSE Sensex Index and Opening Volume
#In the predict function below enter the first parameter Open for BSE and 2nd Volume in Crores
sensexClosePredict=reg.predict([[269.05]])
#175 is the standard deviation of the Diff between Open and Close of sensex so this range
print("Stock Likely to Open at: ",sensexClosePredict , "(+-11)")
print("Stock Open between: ",sensexClosePredict+standarddev , " & " , sensexClosePredict-standarddev)
5910 55.00
5909 60.00
5908 75.00
5907 70.00
5906 72.50
5905 75.00
5904 74.00
5903 75.00
5902 74.00
5901 72.50
5900 72.50
5899 72.50
5898 72.50
5897 72.50
5896 72.50
5895 72.50
5894 67.00
5893 72.50
5892 74.00
5891 75.00
5890 75.00
5889 75.00
5888 75.00
5887 75.00
5886 75.00
5885 75.00
5884 75.00
5883 72.50
5882 75.00
5881 75.00
...
29 262.95
28 264.95
27 264.95
26 262.45
25 280.85
24 279.30
23 280.65
22 283.15
21 283.70
20 279.35
19 271.75
18 277.35
17 263.05
16 260.50
15 264.70
14 264.60
13 258.65
12 257.00
11 252.40
10 247.65
9 247.55
8 252.95
7 269.90
6 267.95
5 270.85
4 270.10
3 268.10
2 275.45
1 276.15
0 274.55
Name: Close, Length: 5911, dtype: float64
Index([u'Close', u'NextDayOpen'], dtype="object")
('Coefficients: ', array([0.98986882]))
('mean squared error: ', 313.02619408516466)
('Variance score: ', 0.994126802384695)
('Stock Likely to Open at: ', array([269.34940985]), '(+-11)')
('Stock Open between: ', array([500.67339591]), ' & ', array([38.02542379]))
Listing 16-15Linear Regression Model Creation and Stock Price Prediction
在第一部分中,像往常一样,我引入了通用的比例和洗牌线性模型、均方误差和 R2 分数。之后,我创建特征和目标数据框架——目标数据框架是包含股票收盘价的价格。features dataframe 包含股票后第二天开盘的栏目。完成之后,我将数据放入价格和功能数据框中,在下一步中,我将数据分成训练和测试数据集。在此之后,我实例化线性回归模型,然后拟合 x 系列和 y 系列,然后使用 predict 方法基于 x 测试进行 Sensex 预测。现在我们有了基于线性回归技术的模型预测,接下来我们可以查看回归系数,我们得到的回归系数为 0.989 (‘Coefficients:’,array([0.98986882]))。在此之后,我查看均方差,然后查看方差得分,然后查看该数据集的标准差。之所以要看标准差,是因为在股票市场价格数据集中,标准差是用来衡量股票的波动性的。这是一个使用正负标准差范围的注释,标准差应用于我们的模型给出的预测。那么,一旦我们准备好了模型,你如何预测呢?很简单——使用 predict 方法,我输入股票前一天的最后收盘价,然后模型会给出第二天可能出现的开盘情况。请记住,使用这种方法我们不能太确定或准确,因此我们将使用标准差来预测股票可能的波动范围。所以在最后一行,预测股价会在正负标准之间开市就是我们基于这个模型做预测的方法。这就是本案例研究的解决方案。现在让我们进入下一个案例研究。
案例研究 2:发现财务报表欺诈
这本书的最后一个案例研究是基于讨论的案例研究,因此我将讨论这里讨论的问题的可能解决方案。然而,我将敦促您应用我在本书中讨论的技术和过程来开发一个完整的解决方案。这将有助于你为金融领域的实际应用做好准备。这个案例研究是根据几年前我在一个项目中从一个客户那里得到的一个实际问题模拟的。然而,该数据集是虚构的,并非来自任何组织或机构。
在拜访完一个客户后,我正从印多尔飞往孟买,坐在乘客休息室里,突然接到一位老客户 Goriz 先生打来的疯狂电话,他在电话里似乎很不安,他向我解释说,由于他的基金经理错误地选择了一家被称为中盘多袋股但却变成了海龟的公司,他在股市上损失了很多钱。他问我是否有可能通过查看一家公司的财务报表来预测和发现该公司是否是一家欺诈公司。我向他解释这是可能的;然而,这需要更多的详细讨论,不能通过电话进行。因此,我们安排在接下来的一个月里,在戈里兹位于孟买的办公室与他会面。
这次谈话后,我做了一些研究,发现了更多关于这家公司的信息,并注意到直到几个月前,市场上还没有这家公司走向破产的迹象。有一些关于该公司债务增加的坏消息,但除此之外,当该公司倒闭并申请破产时,市场受到了冲击。后来证明,创始人大量挪用资金,这是发生这种情况的主要原因。
戈里兹是一名国际投资者,他依靠自己的基金经理对印度等新兴经济体的公司进行投资。这就是他对这家失败公司的投资所做的。
当我第二次见到他时,戈里兹向我解释说,他在这只所谓的中型多袋股票上损失了近 5900 万美元的个人资金。他问我,是否有可能根据一家公司以前的财务数据来预测该公司是否在进行欺诈活动,这些数据是他们使用机器学习技术为像他这样的投资者提交给交易所的。我向他解释说,在这方面有各种各样的研究工作,有一些博士论文是为了开发这方面的公式而完成的;然而,还没有一个模型投入生产。此外,还有一家像 LexusNexus 这样的公司使用自己的专利技术来检测欺诈。然而,从我自己的消息来源来看,我确信这不是机器学习。戈里兹说,他在非洲和中东等其他经济体有大量投资,并希望我为他开发一个通用模型,帮助他在全球范围内发现此类欺诈公司。
这些要求确实非常明确,我被安排去做一些在使用机器学习之前没有做过的事情。
案例研究的问题
-
问题 1:
-
你认为这个案例研究的中心问题是什么?
-
问题 2:
-
你认为利用过去的财务报表建立一个机器学习系统来预测一个公司是否要破产是可行的吗?
-
问题 3:
-
如果你要建立这个模型,你会用什么方法利用过去的财务报表数据预测破产?
-
问题 4:
-
构建这个模型需要什么数据集?
-
问题 5:
-
对于构建这个模型,你推荐的基于 Python 的解决方案是什么?
讨论案例研究的解决方案:
现在让我们更详细地讨论这个案例研究的问题。本次讨论的目的是让您深入了解手头的问题以及解决该问题的各种可用选项。请再次记住,这是我认为最好的解决方案;但是,您可能会提出一个更好、更有效的方法来解决这个问题,这完全没问题,因为这就是提出这些案例研究的目的。
答案 1
在这种情况下,投资者根据第三方基金经理的建议投资于一家公司,而第三方基金经理并没有对该公司及其创始人的运作进行太多研究,因此投资者陷入了发起人将资金转移到其他海外业务或账户的行为中。
答案 2
是的,在我看来,根据公司过去的财务报表建立一个模型是非常可能的。有足够的研究可用,如 Johan Perols (2010)在财务报表欺诈检测:统计和机器学习算法的分析。审计实践杂志&理论。另一项有助于解释这一点的研究是由 R. Meenatkshi 和 K. Sivaranjani 在使用数据挖掘技术对财务报表中的欺诈检测进行的比较研究,摘自 https://www.ijcsmc.com/docs/papers/July2016/V5I7201659.pdf
。
这项研究足以开始建立一个机器学习系统来检测财务报表欺诈。
问题 3
我的方法,就像建立任何预测模型一样,将从查看数据源获取财务报表开始。网上有许多这样的资源;然而,如果在选择数据来源时没有处理好,像侵犯版权这样的问题可能会悄悄出现。Quandl.com 上有付费服务,是收费的高级服务,但它们承诺更好的准确性。因此,必须做出决定,是从 Quandl.com 这样的来源购买公司数据,还是通过网络搜集免费获取,这可能需要仔细评估是否存在侵犯版权的情况。
一旦使用适合项目的任何来源获得数据,我们就进入数据清理阶段,寻找数据的准确性和可能存在的任何缺失值。高级付费服务最有可能拥有干净的数据,不需要太多的操作,如丢失值处理等。
之后,我们需要为我们的预测模型选择特征和目标变量。在我们的例子中,我们需要一个字段来告诉机器一个财务报表行是否是欺诈——类似于 1 表示欺诈,0 表示没有欺诈。一旦我们有了这种监督学习数据,我们就可以将它分成训练和测试数据集,并使用分类器算法来建立预测模型。由于我们的目标变量分别是欺诈或无欺诈的 1 或 0,这种情况使得使用分类器算法更容易,如朴素贝叶斯、逻辑回归或决策树分类器等。
问题 4
我需要一个样本数据集,例如表 16-3 中给定的像 Balmer Lawrie 有限公司这样的公司的数据集。
表 16-3
公司资产负债表样本
|巴尔莫·劳里公司的资产负债表
|
-卢比。Cr。-
| | | | |
| — | — | — | — | — | — |
| | 3 月 18 日 | 3 月 17 日 | 3 月 16 日 | 3 月 15 日 | 3 月 14 日 |
| | 12 mths | 12 mths | 12 mths | 12 mths | 12 mths |
| 股票和负债 | | | | |
| 股东资金 | | | | |
| 权益股本 | One hundred and fourteen | One hundred and fourteen | Twenty-eight point five | Twenty-eight point five | Twenty-eight point five |
| 总股本 | One hundred and fourteen | One hundred and fourteen | Twenty-eight point five | Twenty-eight point five | Twenty-eight point five |
| 准备金和盈余 | One thousand one hundred and forty-one point eight six | One thousand and fifty-one point nine nine | One thousand and thirty-six point four four | Eight hundred and seventy-four point five six | Seven hundred and ninety-one point one four |
| 总准备金和盈余 | One thousand one hundred and forty-one point eight six | One thousand and fifty-one point nine nine | One thousand and thirty-six point four four | Eight hundred and seventy-four point five six | Seven hundred and ninety-one point one four |
| 股东资金合计 | One thousand two hundred and fifty-five point eight six | One thousand one hundred and sixty-five point nine nine | One thousand and sixty-four point nine four | Nine hundred and three point zero six | Eight hundred and nineteen point six four |
| 非流动负债 | | | | |
| 长期借款 | Eleven point one six | Zero | Zero | Zero | Zero |
| 递延税款负债[净额] | Eight point one nine | Zero | Zero | Zero | Zero |
| 其他长期负债 | Zero point five seven | Zero point two six | Zero point two seven | Forty-one point nine one | Thirty-four point one eight |
| 长期准备金 | Thirty-seven point seven seven | Fifty-five point seven nine | Sixty-five point four two | Zero point zero one | Zero point zero four |
| 非流动负债总额 | Fifty-seven point six nine | Fifty-six point zero five | Sixty-five point six nine | Forty-one point nine two | Thirty-four point two two |
| 流动负债 | | | | |
| 短期借款 | Three point seven four | Zero | Zero | Zero | Zero |
| 贸易应付款 | Three hundred and twenty-two point seven nine | Three hundred and seven point one two | Two hundred and twenty-four point two nine | Two hundred and seventeen point seven one | Two hundred and sixty-four point five seven |
| 其他流动负债 | Two hundred and six point seven two | Two hundred and forty-four point four six | Two hundred and thirty point zero six | One hundred and seventy-four point six | Two hundred and one point nine |
| 短期准备金 | Five point zero four | Nineteen point nine one | Seven point nine three | One hundred and twelve point two seven | One hundred and eighteen point zero five |
| 流动负债总额 | Five hundred and thirty-eight point three | Five hundred and seventy-one point four eight | Four hundred and sixty-two point two eight | Five hundred and four point five eight | Five hundred and eighty-four point five three |
| 资本和负债总额 | One thousand eight hundred and fifty-one point eight five | One thousand seven hundred and ninety-three point five two | One thousand five hundred and ninety-two point nine one | One thousand four hundred and forty-nine point five six | One thousand four hundred and thirty-eight point four |
| 资产 | | | | |
| 非流动资产 | | | | |
| 有形资产 | Three hundred and ninety-four point eight | Three hundred and eighty-two point six seven | Three hundred and seventy-nine point one six | Three hundred and ninety-three point one seven | Two hundred and seventy-three point two eight |
| 无形资产 | Five point two seven | Thirteen point one nine | Fourteen point one | Thirteen point six seven | Seventeen point zero one |
| 资本在建工程 | Thirteen point two five | Twenty-three point three one | Seven point two six | Four point three | Seventy-three point seven nine |
| 开发中的无形资产 | Zero | Zero | Zero | Zero point one seven | Zero |
| 其他资产 | One point one four | Zero point six two | Zero point nine five | Zero | Zero |
| 固定资产 | Four hundred and fourteen point four five | Four hundred and nineteen point seven nine | Four hundred and one point four seven | Four hundred and eleven point three two | Three hundred and sixty-four point zero nine |
| 非流动投资 | One hundred and thirty-eight point four one | Eighty-seven point three eight | Fifty-seven point five | Fifty-seven point four | Fifty-seven point three nine |
| 递延税款资产[净额] | Zero | Eight point zero two | Four point nine six | One point seven one | Four point three five |
| 长期贷款和预付款 | Four point two eight | Four point eight five | Five point zero seven | Fifteen point zero nine | Fourteen point two seven |
| 其他非流动资产 | Forty point three five | Forty-two point one six | Thirty-nine point five two | Zero | Zero |
| 非流动资产总额 | Five hundred and ninety-seven point four nine | Five hundred and sixty-two point two | Five hundred and eight point five two | Four hundred and eighty-five point five three | Four hundred and forty point one |
| 流动资产 | | | | |
| 存货 | One hundred and thirty-six point six three | One hundred and fifty-one point seven | One hundred and nineteen point seven six | One hundred and thirty point one | One hundred and forty-one point seven two |
| 交易应收帐 | Two hundred and seventy-one point two seven | Two hundred and eighty-one point six one | Two hundred and thirty point three three | Three hundred and sixty-five point one three | Four hundred and ten point six nine |
| 现金和现金等价物 | Four hundred and eighty point six seven | Five hundred and eight point six five | Four hundred and forty-three point seven | Three hundred and sixty-one point two nine | Three hundred and forty-six point eight six |
| 短期贷款和预付款 | Twenty-four point six seven | Four point three nine | Eight point five one | Eighty-four point three eight | Seventy-five point one |
| 其他流动资产 | Three hundred and forty-one point one one | Two hundred and eighty-four point nine seven | Two hundred and eighty-two point zero nine | Twenty-three point one three | Twenty-three point nine two |
| 流动资产总额 | One thousand two hundred and fifty-four point three six | One thousand two hundred and thirty-one point three two | One thousand and eighty-four point three nine | Nine hundred and sixty-four point zero three | Nine hundred and ninety-eight point two nine |
| 总资产 | One thousand eight hundred and fifty-one point eight five | One thousand seven hundred and ninety-three point five two | One thousand five hundred and ninety-two point nine one | One thousand four hundred and forty-nine point five six | One thousand four hundred and thirty-eight point four |
| 其他附加信息 | | | | |
| 或有负债、承付款 | | | | |
| 或有债务 | Two hundred and eleven point zero six | Two hundred and thirteen point one five | Fifty-four point four five | Two hundred and fourteen point three two | Three hundred and twenty-six point seven four |
| 进口到岸价格 | | | | |
| 原材料 | Sixteen point five one | Fourteen point two seven | Thirty-six point eight two | Eighty-four point six four | Forty-two point eight three |
| 库存、备件和松散工具 | One point three six | One point two three | One point five two | Zero point two five | Zero point one eight |
| 贸易/其他商品 | Zero point seven five | Zero | Zero | Zero | Zero |
| 资本货物 | One point two four | Zero point one nine | Zero point one two | Zero point one one | Forty-two point three three |
| 外汇支出 | | | | |
| 外币支出 | One hundred and seventy-two point two nine | One hundred and seventy-three point four five | One hundred and seventy-two point six four | One hundred and seventy-eight point two five | One hundred and six point six nine |
| 股息外汇汇款 | | | | |
| 外币股息汇款 | - | - | - | - | - |
| 外汇收入 | | | | |
| 货物的离岸价 | Nineteen point two seven | Eleven point two | One hundred and four point six four | Thirteen point five | Fifteen |
| 其他收入 | Eighty-one point five six | Eighty-four point nine two | - | One hundred and twelve point two four | Twenty-three point seven eight |
| 奖金详情 | | | | |
| 红利股本 | One hundred and four point four nine | One hundred and four point four nine | Eighteen point nine nine | Eighteen point nine nine | Eighteen point nine nine |
| 非流动投资 | | | | |
| 非流动投资报价市值 | - | - | - | Zero | Zero |
| 非流动投资未上市账面价值 | One hundred and thirty-eight point four one | Eighty-seven point three eight | Fifty-seven point four | Fifty-seven point four | Fifty-seven point three nine |
| 当前投资 | | | | |
| 当前投资报价市值 | - | - | - | - | - |
| 当前投资的未上市账面价值 | - | - | - | - | - |
来源:MoneyControl.comhttps://www.moneycontrol.com/financials/balmerlawriecompany/balance-sheetVI/BLC#BLC
问题 5
我将让读者来构建基于 Python 的模型。然而,鉴于我已经与你分享了将有助于你获得检测欺诈所需公式的研究论文,你应该不难创建一个。我还与你分享了一个财务报表的样本格式,你将需要建立这样一个数据集。
我以此结束本书的最后一个案例研究。我希望你喜欢它,就像我喜欢与你分享客户在金融领域的业务中面临的一些实际问题一样。
尾注
再见了,约翰。"财务报表欺诈检测:统计和机器学习算法分析."审计实务杂志&理论。2010;30:2.
Meenatkshi R .和 Sivaranjani K. 《利用数据挖掘技术进行财务报表舞弊检测的比较研究,摘自 https://www.ijcsmc.com/docs/papers/July2016/V5I7201659.pdf
。