本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
使用AWS服务计算风险价值 (VaR)
由 Sumon Samanta 创作 () AWS
环境:PoC 或试点 | 技术:分析;无服务器 | AWS服务:亚马逊 Kinesis Dat AWS a Streams;Lambda;亚马逊;SQS亚马逊 ElastiCache |
Summary
此模式描述了如何使用AWS服务实现风险价值 (VaR) 计算系统。在本地环境中,大多数 VaR 系统使用大型专用基础设施以及内部或商用电网调度软件来运行批处理流程。这种模式提供了一种简单、可靠且可扩展的架构,用于处理AWS云端的 VaR 处理。它构建了一个无服务器架构,该架构使用Amazon Kinesis Data Streams作为流媒体服务,使用亚马逊简单队列服务(SQS亚马逊)作为托管队列服务,使用 ElastiCache 亚马逊作为缓存服务,使用 AWS Lambda来处理订单和计算风险。
VaR 是一种统计指标,交易者和风险经理使用它来估算其投资组合中超过一定信心水平的潜在损失。大多数 VaR 系统都需要运行大量数学和统计计算并存储结果。这些计算需要大量计算资源,因此 VaR 批处理过程必须分解为较小的计算任务集。可以将大批次拆分为较小的任务,因为这些任务大多是独立的(也就是说,一项任务的计算不依赖于其他任务)。
VaR 架构的另一重要要求是计算可扩展性。这种模式采用无服务器架构,可根据计算负载自动向内或向外扩展。由于批处理或在线计算需求难以预测,因此需要动态扩展才能在服务级别协议规定的时间表内完成该过程(SLA)。此外,成本优化架构应该能够在每个计算资源的任务完成后,立即缩减该资源的规模。
AWS服务非常适合 VaR 计算,因为它们提供可扩展的计算和存储容量、用于以成本优化的方式处理的分析服务,以及用于运行风险管理工作流程的不同类型的调度程序。此外,您只需为使用的计算和存储资源付费AWS。
先决条件和限制
先决条件
一个活动的 AWS 账户。
输入文件,具体取决于业务需求。典型的用例涉及以下输入文件:
市场数据文件(输入到 VaR 计算引擎)
交易数据文件(除非交易数据通过数据流传输)。
配置数据文件(模型和其他静态配置数据)
计算引擎模型文件(定量库)
时间序列数据文件(用于历史数据,例如过去五年的股价)
如果市场数据或其他输入通过直播传入,则设置亚马逊Kinesis Data Streams,并将亚马逊身份和访问管理 IAM () 权限配置为写入该流。
这种模式构建了一个架构,在此架构中,交易数据从交易系统写入到 Kinesis 数据流。您可以不使用 Storage 服务,而是将您的交易数据存储在小批量文件中,将它们存储在 Amazon Simple Storage Service (Amazon S3) 存储桶中,然后调用事件开始处理数据。
限制
Kinesis 数据流排序在每个分片都有保证,因此不能保证写入多个分片的交易订单的交付顺序与写入操作的顺序相同。
L AWS ambda 运行时间限制目前为 15 分钟。(有关更多信息,请参阅 Lambda。)FAQ
架构
目标架构
以下架构图显示了风险评估系统的AWS服务和工作流程。
该图阐释了以下内容:
交易从订单管理系统流入。
票据头寸净额结算 Lambda 函数处理订单,并将每个股票的合并消息写入亚马逊的风险队列。SQS
风险计算引擎 Lambda 函数处理来自亚马逊的消息SQS,执行风险计算,并更新亚马逊风险缓存中的 VaR 损益 (PnL) 信息。 ElastiCache
读取 ElastiCache 数据 Lambda 函数从中检索风险结果并将其存储在数据库 ElastiCache 和 S3 存储桶中。
有关这些服务和步骤的更多信息,请参见操作说明部分。
自动化和扩缩
您可以使用 Cl AWS oud Development Kit (AWSCDK) 或AWS CloudFormation 模板来部署整个架构。该架构可以支持批处理和盘中(实时)处理。
架构内置了扩展功能。随着越来越多的交易被写入 Kinesis 数据流并等待处理,可以调用其他 Lambda 函数处理这些交易,然后可以在处理完成后缩小规模。也可以选择通过多个 Amazon SQS 风险计算队列进行处理。如果需要对队列进行严格的排序或者整合,则无法并行处理。但是,对于 end-of-the日批次或小型盘中批次,Lambda 函数可以并行处理并将最终结果存储在中。 ElastiCache
工具
AWS服务
Amazon Aurora 我的SQL兼容版是一个完全托管、与 SQL My 兼容的关系数据库引擎,可帮助您设置、操作和扩展 “我的SQL部署”。此模式以 My SQL 为例,但您可以使用任何RDBMS系统来存储数据。
Amazon ElastiCache 可帮助您在AWS云中设置、管理和扩展分布式内存缓存环境。
Amazon Kinesis Data Streams 可帮助您实时收集和处理大型数据记录流。
AWSLambda 是一项计算服务,可帮助您运行代码,而无需预置或管理服务器。它仅在需要时运行您的代码,并且能自动扩缩,因此您只需为使用的计算时间付费。
Amazon Simple Queue Service (AmazonSQS) 提供安全、耐用且可用的托管队列,可帮助您集成和分离分布式软件系统和组件。
Amazon Simple Storage Service (Amazon S3) 是一项基于云的对象存储服务,可帮助您存储、保护和检索任意数量的数据。
代码
此模式为AWS云中的 VaR 系统提供了示例架构,并描述了如何使用 Lambda 函数进行 VaR 计算。要创建您的 Lambda 函数,请参阅 Lambda 文档中的代码示例。如需帮助,请联系AWS专业服务部门
最佳实践
让每个 VaR 计算任务尽可能小巧。在每个计算任务中尝试不同数量交易,看看哪个任务在计算时间和成本方面最为优化。
在 Amazon 中存储可重复使用的对象 ElastiCache。使用 Apache Arrow 等框架来减少序列化和反序列化。
考虑 Lambda 的时间限制。如果您认为自己的计算任务可能会超过 15 分钟,请尝试将其分解为较小的任务,以避免 Lambda 超时。如果这不可能,你可以考虑使用 Far AWS gate、亚马逊弹性容器服务(亚马逊)和亚马逊 Elastic Kub EKS ernetes Service(ECS亚马逊)的容器编排解决方案。
操作说明
任务 | 描述 | 所需技能 |
---|---|---|
开始写入交易。 | 新建、已结算或部分结算的交易从订单管理系统写入风险流。这种模式使用 Amazon Kinesis 作为托管流媒体服务。交易订单代码哈希值用于在多个分片上放置交易订单。 | Amazon Kinesis |
任务 | 描述 | 所需技能 |
---|---|---|
使用 Lambda 开始执行风险处理。 | 为新订单运行 AWS Lambda 函数。根据待处理交易订单数量,Lambda 将自动扩缩。每个 Lambda 实例都有一个或多个订单,并从亚马逊检索每张股票的最新头寸。 ElastiCache(您可以使用其他金融衍生产品的 CUSIP ID、曲线名称或索引名称作为存储和检索数据的密钥 ElasticCache。) 在中 ElastiCache,总持仓(数量)和键值对 < 股票代码、净头寸 >(其中净持仓是缩放因子)为每个股票更新一次。 | 亚马逊 Kinesis、Lambda AWS、亚马逊 ElastiCache |
任务 | 描述 | 所需技能 |
---|---|---|
将合并的消息写入至风险队列。 | 将消息写入至队列。此模式使用 Amazon SQS 作为托管队列服务。单个 Lambda 实例可能在任何给定时间收到一小批交易订单,但只会为每个股票写一条消息给 Amazon。SQS计算比例系数:(旧净头寸 + 当前头寸)/旧净头寸。 | 亚马逊SQS、AWS Lambda |
任务 | 描述 | 所需技能 |
---|---|---|
开始风险计算。 | 调用风险引擎 lambda 的 Lambda 函数。每个位置都由单个 Lambda 函数处理。但是,出于优化目的,每个 Lambda 函数都可以处理来自亚马逊的多条消息。SQS | 亚马逊SQS、AWS Lambda |
任务 | 描述 | 所需技能 |
---|---|---|
检索与更新风险缓存。 | Lambda 从中检索每个股票的当前净头寸。 ElastiCache它还会从中检索每个股票的VaR损益 (PnL) 数组。 ElastiCache 如果 pNL 数组已经存在,则 Lambda 函数会使用比例更新数组和 VaR,该比例来自净额结算 Lambda 函数编写的SQS亚马逊消息。如果盈亏数组不存在 ElasticCache,则使用模拟股票价格序列数据计算出新的盈亏和VaR。 | 亚马逊SQS、AWS Lambda、亚马逊 ElastiCache |
任务 | 描述 | 所需技能 |
---|---|---|
存储风险结果。 | 更新 VaR 和 PnL 数字后 ElastiCache,每五分钟调用一次新的 Lambda 函数。此函数从 Aurora 我的SQL兼容数据库 ElastiCache 和 S3 存储桶中读取所有存储的数据,并将其存储在 Aurora My Compatible 数据库中。 | AWSLambda,亚马逊 ElastiCache |