云服务器价格_云数据库_云主机【优惠】最新活动-搜集站云资讯

域名解析_服务器硬件检测工具_价格

小七 141 0

风险管理现代化第2部分:汇总、规模回溯测试和引入替代数据

理解和降低风险是任何金融服务机构的首要任务。然而,正如之前在这个分为两部分的系列文章的第一篇博客中所讨论的,如今的银行仍在努力跟上业务所面临的新出现的风险和威胁。受内部基础设施和遗留技术限制的困扰,银行直到最近还没有有效构建现代风险管理实践的工具。幸运的是,今天有一个更好的替代方案,它基于由云本地基础设施支持的开源技术。这一现代风险管理框架实现了日内视图、按需汇总和未来验证/规模化风险管理的能力。在这个由两部分组成的系列博客中,我们将演示如何通过使用Delta Lake、Apache SparkTM和MLflow使传统的风险价值计算现代化,从而使风险管理更加灵活和前瞻性。第一个演示解决了与使用数据和高级分析实现风险管理实践现代化相关的技术挑战,包括使用MLflow和Apache SparkTM进行风险建模和蒙特卡罗模拟的概念。本文重点讨论风险分析师角色及其需求,以便在新的威胁出现时实时地更好地了解组合风险,从而有效地切分风险模拟(按需)。我们将讨论以下主题:使用Delta Lake和SQL按需聚合风险价值使用apachesparktm和MLflow对模型进行后验,并向监管机构报告违规行为探索使用替代数据更好地评估您的风险敞口三角洲湖的切片和切割值存在风险在这个由两部分组成的系列博客的第一部分中,我们展示了现代风险管理平台是什么样的,以及金融服务机构需要改变人们看待数据的视角:不是成本,而是资产。我们展示了数据的多功能性,以及如何以最细粒度的形式存储蒙特卡罗数据,从而实现多个用例,同时为分析师提供运行即席分析的灵活性,从而有助于对银行面临的风险有一个更为稳健和灵活的看法。在这个博客和演示中,我们揭示了拉丁美洲股票投资组合的各种风险,该投资组合由多个行业的40种工具组成。为此,我们利用了通过蒙特卡罗模拟(40个仪器x 50000个模拟x 52周=1亿个记录)生成的大量数据,按天划分,并使用我们的投资组合分类法进行了丰富,如下所示。风险价值风险价值是模拟随机游走的过程,包括可能的结果以及最坏情况(n)情况。在最差的5%试验中,95%的风险值在(t)天内是最好的情况。由于我们的试验是按天划分的,分析师可以通过一个试验Id(即用于生成金融市场状况的种子)轻松访问一天的模拟数据和分组个人收益,以便了解我们的投资回报及其各自的风险值的日分布情况。我们的第一种方法是使用Spark SQL汇总给定日期(50000条记录)的模拟回报,并使用内存中的python通过一个简单的numpy操作计算5%的分位数。返回=火花\.阅读\.table(蒙特卡洛表)\.filter(F.col('运行日期')=='2020-01-01')\.groupBy('种子')\.agg(F.sum('trial').alias('return'))\.select('return')\.toPandas()['return']风险价值=np.分位数(返回,5/100)如果在我们所有的拉丁美洲权益工具中进行初始投资10000美元,在特定时间点,95%的风险价值将是3000美元。这是我们的业务在所有可能发生的最坏的5%的情况下(至少)会损失多少。这种方法的缺点是,为了计算5%的分位数,我们首先需要在内存中收集所有的日常测试。虽然在使用1天的数据时可以轻松地执行此过程,但在较长时间内聚合风险价值时,它很快成为瓶颈。一种实用和可扩展的解决问题的方法对于任何分布式计算环境来说,从大型数据集中提取百分位是一个已知的挑战。一种常见的(尽管效率低下)做法是:1)对所有数据进行排序,2)使用takeOrdered对特定行进行筛选,或者通过approxQuantile方法找到近似值。我们面临的挑战稍有不同,因为我们的数据并不构成一个单一的数据集,而是跨越多天、多个行业和国家,每个存储桶可能太大,无法在内存中有效地收集和处理。实际上,我们利用风险价值的本质,只关注最坏的n个事件(n个小事件)。假设每台仪器有50000个模拟和99%的VaR,我们只想从最差的500个实验中找出最好的。为此,我们创建了一个用户定义的聚合函数(UDAF),它只返回最差n个事件中最好的一个。这种方法将大大减少在计算大规模VaR聚合时可能出现的内存占用和网络约束。类ValueAtRisk(n:Int)扩展了UserDefinedAggregateFunction{//这些是聚合函数的输入字段。重写def inputSchema:org.apache.spark网站.sql.types.StructType= {StructType(StructField("value",DoubleType)::Nil)}//这些是用于计算聚合的内部字段。重写def bufferSchema:StructType=StructType(阵列(StructField("最差",ArrayType(DoubleType))))//这是聚合函数的输出类型。重写def dataType:dataType=DoubleType//我们处理数据帧的顺序无关紧要//最坏的总是最坏的override def definitical:布尔值=true//这是缓冲区架构的初始值。重写def initialize(缓冲区:MutableAggregationBuffer):单位={缓冲区(0)=顺序空[双倍]}//这是如何在给定输入的情况下更新缓冲区模式。重写def update(缓冲区:MutableAggregationBuffer,输入:Row):Unit={缓冲区(0)=缓冲区.getAs[顺序[双精度]](0):+输入.getAs[双倍](0)}//这是如何用bufferSchema类型合并两个对象。//我们只保留最坏的N个事件重写def merge(缓冲区:MutableAggregationBuffer,行:row):Unit={缓冲区(0)=(缓冲区.getAs[顺序[双精度]](0)++行.getAs[顺序[双精度]](0)).分类。采取(n)}//这是输出最终值的地方//我们的风险价值总体上是最差的重写def evaluate(缓冲区:行):Any={返回缓冲区.getAs[顺序[双精度]](0)。已排序。最后一个}}//95%的风险价值是最坏的N个事件中最好的val n=(100-95)*数值模拟/100//注册UADFspark.udf.register("风险价值",新价值风险(n))通过注册我们的UADFspark.udf.register方法,我们将该功能公开给我们的所有用户,在没有scala/python/spark高级知识的情况下将风险分析民主化。我们只需按试用Id(即seed)分组,就可以应用上述方法,并使用普通的SQL功能在所有数据中提取相关的风险值。选择t、 把日期作为日期,风险价值(t.return)等于风险价值从(选择m、 跑步日期,m、 种子,作为回报的金额(m.trial)从蒙特卡罗m分组依据m、 跑步日期,m、 种子)t分组依据t、 跑步日期按t.run_date ASC订购我们可以很容易地发现COVID-19对我们的市场风险计算的影响。自2020年3月初以来,90天的经济波动导致风险值大大降低,因此总体风险敞口大大增加。全面了解我们的风险敞口在大多数情况下,仅仅了解整体风险价值是不够的。分析师需要了解不同账簿、资产类别、不同行业或不同运营国家的风险敞口。除了Delta Lake功能(如前面讨论的时间旅行和ACID事务)之外,Delta Lake和Apache SparkTM在Databricks运行时进行了高度优化,以在读取时提供快速聚合。使用本机分区逻辑(按日期)以及应用于国家和行业的z顺序索引,可以实现高性能。当在国家或行业级别选择数据的特定部分时,将充分利用这种额外的索引,从而大大减少在VaR聚合之前需要读取的数据量。按(国家、行业)优化monte_carlo ZORDER通过使用国家和行业作为我们的分组参数,我们可以很容易地调整上述SQL代码,以便对我们的风险敞口有一个更细致和描述性的看法。使用Databricks笔记本,可以"原样"直观地显示得到的数据集,并可以进一步细化,以了解这些国家对我们整体风险价值的确切贡献。在这个例子中,秘鲁似乎对我们的整体风险敞口贡献最大。在秘鲁的行业级别上查看相同的SQL代码,我们可以研究跨行业风险的贡献。秘鲁2020年3月的贡献率接近60%,其主要风险敞口似乎与采矿业有关。为应对COVID病毒,一场日益严重的封锁已经影响到秘鲁的采矿项目,秘鲁是铜、金和银的生产中心(来源)。扩展本文的范围,我们可能想知道我们是否可以更早地使用替代数据,特别是事件、位置和音调的全球数据库(GDELT)来识别这种趋势。我们在下面的图表中报告了秘鲁采矿业的媒体报道,通过简单的移动平均线对正趋势和负趋势进行了颜色编码。这明显显示出2月初的积极趋势,即15天的公关