使用蒙地卡羅模擬計算 VaR 的逐步方法
在嘗試找到 5 種具有長期價格(價值 2000 天的數據)的金融資產的 VaR 時,我將如何執行以下操作:
- 假設所有 5 種資產都是標準正態分佈,進行蒙特卡羅模擬以找到 VaR 值。
- 對所有 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)
將 Cholesky 矩陣乘以高斯隨機向量,為每個模擬“日期”創建相關隨機向量
對於每個底層證券,將新的“相關高斯”乘以對應於該底層證券/資產的標準差
使用您的投資組合權重和新模擬的資產收益,計算投資組合收益
計算您的統計數據(如 Excel 中的 PERCENTILE 函式)
上述一系列步驟可以轉換為除高斯之外的其他邊緣分佈,並且可以使用比高斯 copula 更真實的 copula。
在對分佈和 copula 進行建模時,您所做的假設會導致模型風險。這並不是說這是一種不好的方法,只是需要注意執行此類練習時出現的擬合錯誤。
您可能會考慮另一種模擬方法,它非常簡單,可以用作對 MC 方法的檢查——一種“引導歷史模擬”。
再次在虛擬碼中:
1)將價格系列轉換為對數回報系列
2)將數據“日期”編號為 1 到 2000(時間序列的大小)
k = 1
選擇一個隨機整數 i 等可能是從 1 到 2000(包括 1 到 2000)
將“日期 i”的收益應用於今天的價格(我們今天的基價)
使用投資組合權重計算投資組合價值的波動並記錄在索引為 k 的向量中
k = k + 1
如果 K < 10,001 轉到上面的步驟 3)
使用投資組合收益的向量計算 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 <- read.csv("namefile") for (i in ncol(data)) { stock_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) print(stock_var) }
我建議您分別查看各個函式以了解它們的格式