期權定價
給定反函式的擬合參數。(奧羅西,2015)
在嘗試複製 Orosi (2015) 的 5 參數隱含波動率模型時,我無法理解 Orosi 提出的參數擬合程序。我的主要目標是將模型校準到我觀察到的一組看漲價格,以便我可以推導出風險中性密度函式。
考慮到我對呼叫價格有經驗觀察, $ c $ 對於一系列行使價, $ x $ , 對於給定的時間和成熟度。然後我必須最小化平方誤差:
$ \sum_{i=1}^{n}(c(x_i)-c_i)^2 $
在哪裡 $ c(x_i) $ 必須從以下等式數值確定:
$ x_i=1-c(x_i)+G\frac{(1-c(x_i))^\beta}{c(x_i)^\alpha}*(Ac(x_i)+1)^\gamma $
具有以下約束:
$ G>0,\alpha>0,\beta>2,\gamma>1,0>A>-1 $
現在我很喜歡使案例如 scipy 的 fmin 函式等來最小化 Python 中的目標函式。但是,正如作者所指出的那樣, $ c(x) $ 以倒置的方式提供“ $ c(x) $ 必須使用黃金分割搜尋或類似的東西進行數值推導”。我不知道如何去做並以“通常的”非線性最小二乘法最小化方法來實現它?
如果有人能指出我正確的方向或提供 Python 或虛擬碼以便我自己弄清楚,將不勝感激
您需要使用某種形式的優化技術兩次。一次解決 $ c(x_i) $ 另一種是最小化MSE。我在下面添加了一個快速破解問題,其中使用 minimize_scalar 解決 $ c(x_i) $ 並且使用蠻力算法求解最小化MSE的參數。肯定有更好的優化可以使用,但這應該提供您正在尋找的結構。
警告:正如評論中提到的,我懷疑這在實踐中是否可用。此外,5 變數全域最小化問題也很難解決,我懷疑這些解決方案在實踐中將不可靠且無法使用。
祝你好運!
from scipy import optimize PRECISION = 1e-3 def error_c(c, params, x): error = abs(1-c+params[0]*((1-c)**params[2]/(c**params[1]))*(params[4]*c+1)**params[3]-x) return error def get_c(x, params): c = optimize.minimize_scalar(error_c, bounds=(PRECISION, 1/PRECISION), method='bounded', args=(params, x), tol=PRECISION) return c.x def mse(params, x, c): mse = 0 for x_i, c_i in zip(x, c): mse += (get_c(x_i, params)-c_i)**2 return(mse) x = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0] c = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0] bounds = ((PRECISION, 1/PRECISION), (PRECISION, 1/PRECISION), (2+PRECISION, 1/PRECISION), (1+PRECISION, 1/PRECISION), (-1+PRECISION, -PRECISION)) result = optimize.brute(mse, ranges=bounds, args=(x, c), Ns=10) print(result)