兩因素船體白色模型校準
我對校準兩因素船體白色模型參數的優化器方法有疑問。我有上限和市值價格的分析定價公式。有五個參數需要校準( $ \gamma_1 $ . $ \gamma_2 $ , $ \sigma_1 $ , $ \sigma_2 $ , $ \rho $ )。問題是我不能得到固定的參數,當我改變這五個參數的初始猜測時,我會得到不同的結果。任何建議表示讚賞。
優化程式碼如下:
minimize(error_func, initial_guess, args = (strikes, cap_tenor, zcb, cap_price_market), bounds=bound, method="Nelder-Mead")
您顯然正在使用本地優化器(此處為 Nelder-Mead 方法)。人們應該對不同的初始猜測有不同的結果,因為它會陷入局部最小值(或者只是 Nelder-Mead 的“解決方案”,因為它是一種啟發式優化器)。在實踐中,嘗試並收集不同的解決方案及其錯誤,錯誤越小越好。您還可以使用差分進化優化器,它是一個全域優化器,它速度較慢,但它可以很好地指示實際解決方案的位置。
校準儀器也是您應該關注的另一件事。如果您移除一台儀器,您可能會得到完全不同的結果。您可以犧牲準確性(即選擇產生最小誤差的參數集)以獲得穩定性
我已經使用 HW2 模型工作了三年(中型歐洲銀行)。我校準了 ATM 交換波動率的參數。正如@Canardini 在他的回答中所說,最好還包括對最佳參數的全域搜尋。
我使用以下程序:
Day1:首先使用全域搜尋算法(我使用受控隨機搜尋,在nlopt中實現)。然後使用局部優化器並使用全域搜尋的結果作為起點。
然後在第 2 天:僅使用本地優化器並使用第 1 天的最佳值作為起始值。如果這兩天的目標函式值相似,那麼我們就完成了。否則進行全域搜尋,然後進行局部優化。
作為我使用的目標函式 $$ \sum ( c_{i, \text{model}} - c_{i, \text{market}})^2 \cdot \text{vega}_i, $$
在哪裡 $ \text{vega}_i $ 是交換的(分析的)vega $ i $ .
這是一些 R 程式碼骨架:
global <- nloptr::nloptr( x = as.numeric(local_start)[1:5], eval_f = target_fun, lb = c(1e-7, 1e-7, 1e-7, 1e-7, -1 + 1e-7), ub = c(2, 2, 0.1, 0.1, 1 - 1e-7), opts = list(algorithm = "NLOPT_GN_CRS2_LM", ftol_abs = 5e-6, xtol_rel = 5e-6, ranseed = 1234, maxeval = 1e4) ) local <- nloptr::nloptr( x = global$solution, eval_f = target_fun, lb = c(1e-7, 1e-7, 1e-7, 1e-7, -1 + 1e-7), ub = c(2, 2, 0.1, 0.1, 1 - 1.e-7), opts = list(algorithm = "NLOPT_LN_NELDERMEAD", ftol_abs = 1e-8, xtol_rel = 1e-8, ranseed = 1234, maxeval = 1e4) )