

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 通过 Amazon Web Services 计算风险价值 (VaR)
<a name="calculate-value-at-risk-var-by-using-aws-services"></a>

*Sumon Samanta，Amazon Web Services*

## Summary
<a name="calculate-value-at-risk-var-by-using-aws-services-summary"></a>

此示例介绍了如何使用 Amazon Web Services 实现风险价值 (VaR) 计算系统。在本地环境中，大多数 VaR 系统使用大型专用基础设施以及内部或商用电网调度软件来运行批处理流程。这种模式提供了一种简单、可靠且可扩展的架构，用于处理 Amazon Web Services Cloud 中的 VaR 处理。它构建了一个无服务器架构，该架构使用亚马逊Kinesis Data Streams作为流媒体服务，使用亚马逊简单队列服务 (Amazon SQS) Simple Queue Service作为托管队列服务，使用 ElastiCache 亚马逊作为缓存服务，使用AWS Lambda来处理订单和计算风险。

VaR 是一种统计指标，交易者和风险经理使用它来估算其投资组合中超过一定信心水平的潜在损失。大多数 VaR 系统都需要运行大量数学和统计计算并存储结果。这些计算需要大量计算资源，因此 VaR 批处理过程必须分解为较小的计算任务集。可以将大批次拆分为较小的任务，因为这些任务大多是独立的（也就是说，一项任务的计算不依赖于其他任务）。 

VaR 架构的另一重要要求是计算可扩展性。这种模式采用无服务器架构，可根据计算负载自动向内或向外扩展。由于批处理或在线计算需求难以预测，因此需要动态扩展才能在服务水平协议（SLA）规定的时间计划内完成该过程。此外，成本优化架构应该能够在每个计算资源的任务完成后，立即缩减该资源的规模。 

Amazon Web Services 非常适合 VaR 计算，因为它们提供可扩展计算和存储容量、用于以成本优化的方式处理的分析服务，以及用于运行风险管理工作流的不同类型的调度程序。此外，您只需为在 AWS 上使用的计算与存储资源付费。

## 先决条件和限制
<a name="calculate-value-at-risk-var-by-using-aws-services-prereqs"></a>

**先决条件**
+ 一个活跃的 AWS 账户。
+ 输入文件，具体取决于业务需求。典型的用例涉及以下输入文件：
  + 市场数据文件（输入到 VaR 计算引擎）
  + 交易数据文件（除非交易数据通过数据流传输）。
  + 配置数据文件（模型和其他静态配置数据）
  + 计算引擎模型文件（定量库）
  + 时间序列数据文件（用于历史数据，例如过去五年的股价）
+ 如果市场数据或其他输入通过直播传入，则设置 Amazon Kinesis Data Streams，并将 Amazon Identity and Access Management (IAM) 权限配置为写入该流。 

这种模式构建了一个架构，在此架构中，交易数据从交易系统写入到 Kinesis 数据流。您可以不使用 Storage 服务，而是将您的交易数据存储在小批量文件中，将它们存储在 Amazon Simple Storage Service (Amazon S3) 存储桶中，然后调用事件开始处理数据。

**限制**
+ Kinesis 数据流排序在每个分片都有保证，因此不能保证写入多个分片的交易订单的交付顺序与写入操作的顺序相同。
+ AWS Lambda 的运行时间限制目前为 15 分钟。（有关更多信息，请参阅 [Lambda 常见问题](https://aws.amazon.com/lambda/faqs/)。）

## 架构
<a name="calculate-value-at-risk-var-by-using-aws-services-architecture"></a>

**目标架构**

以下架构图介绍了风险评测系统的 Amazon Web Services 和工作流。

![\[使用 Amazon Web Services 的 VaR 计算系统\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/images/pattern-img/eb615fc5-3cc3-445a-af2c-8446ee7b5276/images/c60aec03-ff6c-410c-8ee8-f1f6efa22cf7.png)


下图说明了以下内容：

1. 交易从订单管理系统流入。

1. *票据头寸净额结算* Lambda 函数处理订单，并将每个指示器的合并消息写入到 Amazon SQS 中的风险队列中。

1. *风险计算引擎* Lambda 函数处理来自亚马逊 SQS 的消息，执行风险计算，并更新亚马逊风险缓存中的 VaR 损益 (PnL) 信息。 ElastiCache

1. *读取 ElastiCache 数据* Lambda 函数从中检索风险结果并将其存储在数据库 ElastiCache 和 S3 存储桶中。

有关这些服务和步骤的更多信息，请参见*操作说明*部分。

**自动化和扩展**

您可以使用 AWS Cloud Development Kit (AWS CDK) 或 AWS CloudFormation 模板部署整个架构。该架构可以支持批处理和盘中（实时）处理。

架构内置了扩展功能。随着越来越多的交易被写入 Kinesis 数据流并等待处理，可以调用其他 Lambda 函数处理这些交易，然后可以在处理完成后缩小规模。也可以选择通过多个 Amazon SQS 风险计算队列处理。如果需要对队列进行严格的排序或者整合，则无法并行处理。但是，对于 end-of-the-day批次或小型盘中批次，Lambda 函数可以并行处理并将最终结果存储在中。 ElastiCache 

## 工具
<a name="calculate-value-at-risk-var-by-using-aws-services-tools"></a>

**Amazon Web Services**
+ [Amazon Aurora MySQL 兼容版](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/Aurora.AuroraMySQL.html)是一个完全托管的、与 MySQL 兼容的关系数据库引擎，可帮助您建立、运行和扩展 MySQL 部署。此示例以 MySQL 为例，但您可以使用任何 RDBMS 系统来存储数据。
+ [Amazon ElastiCache](https://docs.aws.amazon.com/elasticache/) 可帮助您在 AWS 云中设置、管理和扩展分布式内存缓存环境。
+ [Amazon Kinesis Data Streams](https://docs.aws.amazon.com/streams/latest/dev/introduction.html) 可帮助您实时收集和处理大型数据记录流。
+ [AWS Lambda](https://docs.aws.amazon.com/lambda/latest/dg/welcome.html) 是一项计算服务，可帮助您运行代码，而无需预置或管理服务器。它仅在需要时运行您的代码，并且能自动扩缩，因此您只需为使用的计算时间付费。
+ [Amazon Simple Queue Service (Amazon SQS)](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/welcome.html) 提供了一个安全、持久且可用的托管队列，它可帮助您集成和分离分布式软件系统与组件。
+ [Amazon Simple Storage Service（Amazon S3）](https://docs.aws.amazon.com/AmazonS3/latest/userguide/Welcome.html)是一项基于云的对象存储服务，可帮助您存储、保护和检索任意数量的数据。

**代码**

此模式为 Amazon Web Services Cloud 中的 VaR 系统提供了示例架构，并描述了如何使用 Lambda 函数进行 VaR 计算。要创建您的 Lambda 函数，请参阅 [Lambda 文档](https://docs.aws.amazon.com/lambda/latest/dg/service_code_examples.html)中的代码示例。如果需要帮助，请联系 [AWS Professional Services](https://pages.awscloud.com/AWS-Professional-Services.html)。

## 最佳实践
<a name="calculate-value-at-risk-var-by-using-aws-services-best-practices"></a>
+ 让每个 VaR 计算任务尽可能小巧。在每个计算任务中尝试不同数量交易，看看哪个任务在计算时间和成本方面最为优化。
+ 在 Amazon 中存储可重复使用的对象 ElastiCache。使用 Apache Arrow 等框架来减少序列化和反序列化。
+ 考虑 Lambda 的时间限制。如果您认为自己的计算任务可能会超过 15 分钟，请尝试将其分解为较小的任务，以避免 Lambda 超时。如果无法实现，您可以考虑使用 AWS Fargate、Amazon Elastic Container Service (Amazon ECS) 以及 Amazon Elastic Kubernetes Service (Amazon EKS) 等容器编排解决方案。

## 操作说明
<a name="calculate-value-at-risk-var-by-using-aws-services-epics"></a>

### 交易流向风险系统
<a name="trade-flow-to-risk-system"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 开始写入交易。 | 新建、已结算或部分结算的交易从订单管理系统写入风险流。这种模式使用 Amazon Kinesis 作为托管流媒体服务。交易订单代码哈希值用于在多个分片上放置交易订单。 | Amazon Kinesis | 

### 运行 Lambda 函数进行订单处理
<a name="run-lambda-functions-for-order-processing"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 使用 Lambda 开始执行风险处理。 | 为新订单运行 AWS Lambda 函数。根据待处理交易订单数量，Lambda 将自动扩缩。每个 Lambda 实例都有一个或多个订单，并从亚马逊检索每张股票的最新头寸。 ElastiCache（您可以使用CUSIP ID、Curve名称或其他金融衍生产品的指数名称作为存储和检索数据的密钥 ElasticCache。） 在中 ElastiCache，总持仓（数量）和键值对 < *股票代码*、*净头寸 >（其中净持**仓*是缩放因子）为每个股票更新一次。  | 亚马逊 Kinesis、AWS Lambda、亚马逊 ElastiCache | 

### 将每个指示器消息写入队列
<a name="write-messages-for-each-ticker-into-queue"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 将合并的消息写入至风险队列。 | 将消息写入至队列。此模式使用 Amazon SQS 提供托管队列服务。单个 Lambda 实例可能在任何给定时间收到一小批交易订单，但只会为每个指示器写一条消息至 Amazon SQS。计算比例系数：（*旧净头寸* \$1 *当前头寸*）/*旧净头寸*。 | Amazon SQS、AWS Lambda | 

### 调用风险引擎
<a name="invoke-risk-engine"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 开始风险计算。 | 调用风险引擎 lambda 的 Lambda 函数。每个位置都由单个 Lambda 函数处理。但是，出于优化目的，每个 Lambda 函数都可以处理来自 Amazon SQS 的多条消息。 | Amazon SQS、AWS Lambda | 

### 在缓存中检索风险结果
<a name="retrieve-risk-results-from-cache"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 检索与更新风险缓存。 | Lambda 从中检索每个股票的当前净头寸。 ElastiCache它还会从中检索每个股票的VaR损益 (PnL) 数组。 ElastiCache 如果 pNL 数组已经存在，则 Lambda 函数会使用扩展更新数组和 VaR，该扩展来自净额结算 Lambda 函数所编写的 Amazon SQS 消息。如果盈亏数组不存在 ElasticCache，则使用模拟股票价格序列数据计算出新的盈亏和VaR。 | 亚马逊 SQS、AWS Lambda、亚马逊 ElastiCache | 

### 更新 Elastic Cache 中的数据，并存储在数据库中
<a name="update-data-in-elastic-cache-and-store-in-database"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 存储风险结果。 | 更新 VaR 和 PnL 数字后 ElastiCache，每五分钟调用一次新的 Lambda 函数。此函数读取所有存储的数据，并将其存储在兼容 Aurora MySQL 的数据库和 S3 存储桶中。 ElastiCache  | AWS Lambda、亚马逊 ElastiCache | 

## 相关资源
<a name="calculate-value-at-risk-var-by-using-aws-services-resources"></a>
+ [Basel VaR Framework](https://www.bis.org/basel_framework/chapter/DIS/50.htm)