

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 使用 AWS 服務計算風險值 (VaR)
<a name="calculate-value-at-risk-var-by-using-aws-services"></a>

*Sumon Samanta，Amazon Web Services*

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

此模式說明如何使用 AWS 服務實作風險值 (VaR) 計算系統。在內部部署環境中，大多數 VaR 系統使用大型的專用基礎設施，以及內部或商業網格排程軟體來執行批次程序。此模式提供簡單、可靠且可擴展的架構，以處理 AWS 雲端中的 VaR 處理。其建置的無伺服器架構使用 Amazon Kinesis Data Streams 做為串流服務、Amazon Simple Queue Service (Amazon SQS) 做為受管佇列服務、Amazon ElastiCache 做為快取服務，以及 AWS Lambda 來處理訂單和計算風險。

VaR 是交易者和風險經理用來估計其產品組合中潛在損失超出特定可信度水準的統計指標。大多數 VaR 系統涉及執行大量數學和統計計算並儲存結果。這些計算需要大量的運算資源，因此 VaR 批次程序必須分成較小的運算任務集。您可以將大型批次分割為較小的任務，因為這些任務大部分是獨立的 （也就是說，一個任務的計算不會依賴其他任務）。 

VaR 架構的另一個重要需求是運算可擴展性。此模式使用無伺服器架構，可根據運算負載自動縮減或縮減規模。由於批次或線上運算需求難以預測，因此需要動態擴展才能在服務層級協議 (SLA) 規定的時間內完成程序。此外，成本最佳化架構應該能夠在該資源上的任務完成後，立即縮減每個運算資源。 

AWS 服務非常適合 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 資料串流。您可以不使用串流服務，將交易資料儲存在小型批次檔案中、將其存放在 Amazon Simple Storage Service (Amazon S3) 儲存貯體中，並叫用事件以開始處理資料。

**限制**
+ 每個碎片都保證 Kinesis 資料串流排序，因此寫入多個碎片的交易訂單不保證會以與寫入操作相同的順序交付。
+ AWS Lambda 執行時間限制目前為 15 分鐘。（如需詳細資訊，請參閱 [Lambda 常見問答集](https://aws.amazon.com/lambda/faqs/)。)

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

**目標架構**

下列架構圖顯示風險評估系統的 AWS 服務和工作流程。

![\[使用 AWS 服務的 VaR 計算系統\]](http://docs.aws.amazon.com/zh_tw/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 函數會處理來自 Amazon SQS 的訊息、執行風險計算，以及更新 Amazon ElastiCache 風險快取中的 VaR 損益 (PnL) 資訊。

1. *讀取 ElastiCache 資料* Lambda 函數會從 ElastiCache 擷取風險結果，並將其存放在資料庫和 S3 儲存貯體中。

如需這些服務和步驟的詳細資訊，請參閱 *Epics* 一節。

**自動化和擴展**

您可以使用 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>

** AWS 服務**
+ [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) 是一種雲端型物件儲存服務，可協助您儲存、保護和擷取任何數量的資料。

**Code**

此模式為 AWS 雲端中的 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>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 開始撰寫交易。 | 新的、已結清或部分結清的交易會從訂單管理系統寫入風險串流。此模式使用 Amazon Kinesis 作為受管串流服務。交易訂單代號的雜湊用於跨多個碎片下達交易訂單。 | Amazon Kinesis | 

### 執行 Lambda 函數以進行訂單處理
<a name="run-lambda-functions-for-order-processing"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 使用 Lambda 開始處理風險。 | 為新訂單執行 AWS Lambda 函數。根據待定交易訂單的數量，Lambda 會自動擴展。每個 Lambda 執行個體都有一或多個訂單，並從 Amazon ElastiCache 擷取每個代號的最新位置。（您可以使用其他金融衍生產品的 CUSIP ID、曲線名稱或索引名稱做為金鑰，以存放並從 ElasticCache.) 在 ElastiCache 中，每個刻度的總位置 （數量） 和鍵值對 <*ticker*， *net position*>，其中 *net position* 是擴展係數，都會更新一次。  | Amazon Kinesis、AWS Lambda、Amazon ElastiCache | 

### 將每個標記的訊息寫入佇列
<a name="write-messages-for-each-ticker-into-queue"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 將合併的訊息寫入風險佇列。 | 將訊息寫入佇列。此模式使用 Amazon SQS 做為受管佇列服務。單一 Lambda 執行個體可能在任何指定時間取得一批迷你交易訂單，但只會將每個代號的單一訊息寫入 Amazon SQS。系統會計算擴展係數： (*舊的淨位置* \$1 *目前位置*) / *舊的淨位置*。 | Amazon SQS、AWS Lambda | 

### 叫用風險引擎
<a name="invoke-risk-engine"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 開始風險計算。 | 叫用風險引擎 Lambda 的 Lambda 函數。每個位置都由單一 Lambda 函數處理。不過，為了最佳化目的，每個 Lambda 函數都可以處理來自 Amazon SQS 的多個訊息。 | Amazon SQS、AWS Lambda | 

### 從快取擷取風險結果
<a name="retrieve-risk-results-from-cache"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 擷取和更新風險快取。 | Lambda 會從 ElastiCache 擷取每個刻度的目前網路位置。它也會從 ElastiCache 擷取每個刻度的 VaR 損益 (PnL) 陣列。 如果 PnL 陣列已存在，Lambda 函數會使用 比例更新陣列和 VaR，該比例來自網路 Lambda 函數寫入的 Amazon SQS 訊息。如果 PnL 陣列不在 ElasticCache 中，則會使用模擬股票代號價格序列資料來計算新的 PnL 和 VaR。 | Amazon SQS、AWS Lambda、Amazon ElastiCache | 

### 更新 Elastic Cache 中的資料並存放在資料庫中
<a name="update-data-in-elastic-cache-and-store-in-database"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 存放風險結果。 | 在 ElastiCache 中更新 VaR 和 PnL 號碼後，每五分鐘會叫用新的 Lambda 函數。此函數會從 ElastiCache 讀取所有儲存的資料，並將其存放在 Aurora MySQL 相容資料庫和 S3 儲存貯體中。 | AWS Lambda、Amazon ElastiCache | 

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