金融

使用蒙地卡羅模擬計算 VaR 的逐步方法

  • October 19, 2017

在嘗試找到 5 種具有長期價格(價值 2000 天的數據)的金融資產的 VaR 時,我將如何執行以下操作:

  1. 假設所有 5 種資產都是標準正態分佈,進行蒙特卡羅模擬以找到 VaR 值。
  2. 對所有 5 種資產進行蒙特卡羅模擬以找到 VaR 值,假設它們遵循具有 10 個自由度的學生-t 分佈?

我試圖在 95% 和 90% 的置信水平下執行此操作,並使用 10,000 次複製來模擬數據。任何幫助將不勝感激。我已經創建了一個 Cholesky 分解矩陣,但不確定如何使用其中的數據來獲取 VaR 數字。

有許多不同的方法可以實現您的目標。一種方法是對每個金融時間序列進行建模,然後使用 copula 連接這些邊際分佈。然後,蒙地卡羅就是模擬邊緣和係詞的問題。

在使用 Cholesky 矩陣時,您隱含地使用了橢圓分佈(想想高斯和學生 t)。例如,如果您想創建一個高斯 MC 模擬,其中邊際分佈是高斯分佈,而 copula 是高斯分佈,那麼您只需要邊際分佈和標準 MC 模擬方法的每個時間序列的標準偏差。

在“虛擬碼”中,步驟是(為簡單起見,我假設零漂移)

1)在區間上生成統一的隨機數

$$ 0,1 $$(如 Excel 中的 Rand()) 2)將每個均勻隨機數轉換為標準高斯(0,1)隨機數(如NORMSINV)

  1. 將 Cholesky 矩陣乘以高斯隨機向量,為每個模擬“日期”創建相關隨機向量

  2. 對於每個底層證券,將新的“相關高斯”乘以對應於該底層證券/資產的標準差

  3. 使用您的投資組合權重和新模擬的資產收益,計算投資組合收益

  4. 計算您的統計數據(如 Excel 中的 PERCENTILE 函式)

上述一系列步驟可以轉換為除高斯之外的其他邊緣分佈,並且可以使用比高斯 copula 更真實的 copula。

在對分佈和 copula 進行建模時,您所做的假設會導致模型風險。這並不是說這是一種不好的方法,只是需要注意執行此類練習時出現的擬合錯誤。

您可能會考慮另一種模擬方法,它非常簡單,可以用作對 MC 方法的檢查——一種“引導歷史模擬”。

再次在虛擬碼中:

1)將價格系列轉換為對數回報系列

2)將數據“日期”編號為 1 到 2000(時間序列的大小)

  1. k = 1

  2. 選擇一個隨機整數 i 等可能是從 1 到 2000(包括 1 到 2000)

  3. 將“日期 i”的收益應用於今天的價格(我們今天的基價)

  4. 使用投資組合權重計算投資組合價值的波動並記錄在索引為 k 的向量中

  5. k = k + 1

  6. 如果 K < 10,001 轉到上面的步驟 3)

  7. 使用投資組合收益的向量計算 VaR(如 Excel 中的 PERCENTILE)

如果這個“歷史引導 VaR”與您的高斯 MC VaR 非常不同,那麼您可能需要使用一組更現實的邊際分佈假設和 copula 假設。一個好的第一步是嘗試 Student t 分佈和 copula。

你看過 PerformanceAnalytics R 包函式嗎?它應該允許您很容易地計算 delta normal Var。我建議您查看說明手冊,但這裡是它的程式碼:

VaR(R = NULL, p = 0.95, ..., method = c("modified", "gaussian",
"historical", "kernel"), clean = c("none", "boudt", "geltner"),
portfolio_method = c("single", "component", "marginal"), weights = NULL,
mu = NULL, sigma = NULL, m3 = NULL, m4 = NULL, invert = TRUE)

您需要查看的是method, 高斯是 n 分佈。

要遍歷您的資產(列),您可以使用for循環或apply函式

   setwd( enter file name)
   data &lt;- read.csv("namefile")

   for (i in ncol(data)) {


     stock_var &lt;-  VaR(R = NULL, p = 0.95, ..., method = c("modified", "gaussian",
       "historical", "kernel"), clean = c("none", "boudt", "geltner"),
       portfolio_method = c("single", "component", "marginal"), weights = NULL,
       mu = NULL, sigma = NULL, m3 = NULL, m4 = NULL, invert = TRUE)

print(stock_var)
   }

我建議您分別查看各個函式以了解它們的格式

引用自:https://quant.stackexchange.com/questions/22955