為什麼用Newton-Raphson方法求隱含波動率得不到閉解?
使用市場50ETF期權的信息試圖計算隱含波動率,用牛頓法,為啥不用二分法是因為據說牛頓法比較快。但是由於vega比較小,在第一步迭代得到sigma為負值,之後就一直持續變大,最後結果變為infinite,檢查了函數的編輯,和原理都沒有錯誤。
*****問題補充的分割線******
已經修改了一下之前出錯的代碼。主要是導數的符號,和打錯了期權市場價。
還有一些其他問題如果解決了,我會持續更新。
代碼:
http://pan.baidu.com/s/1c25vApE
1. 檢查期權的價格是不是在無套利的範圍內。超出這個範圍,肯定沒解,不用去迭代了。你輸入的期權價格有問題。
2. Vega很小的期權,迭代時切線會導出很奇怪的點,你加上個sigma的範圍,比如0.0001 和 1.0,就會穩定很多。
3. 期權價格合理時,牛頓法會很快收斂,如果迭代次數過多還沒有收斂,那就跳出,用二分法更穩定。
首先期權價格0.038你打成0.0038了吧。。。。
if optiontype == 認購:
Vcall = option_call(close, TimetoMat, rfrate, strike, sigma_pre)
vega = option_vega(close, TimetoMat, rfrate, strike, sigma_pre)
print(value of call, Vcall)
print(value of vega, vega)
sigma = sigma_pre - (optionprice - option_call(
close, TimetoMat, rfrate, strike, sigma_pre
)) / (-option_vega(close, TimetoMat, rfrate, strike, sigma_pre))
print(sigma)
print(math.fabs(sigma - sigma_pre))
while math.fabs(sigma - sigma_pre) &> 0.0001:
sigma_pre = sigma
print(sigma_k, sigma_pre)
sigma = sigma_pre - (optionprice - option_call(
close, TimetoMat, rfrate, strike, sigma_pre
)) / (-option_vega(close, TimetoMat, rfrate, strike, sigma_pre))
print(sigma_kp1, sigma)
我只改了call的部分
牛頓法應該是
你寫的是
Newton法不保證「不依賴於起始點」的收斂性
結合Qusi-Newton and Nelder-Mead,快速與穩定結合。
你用50ETF價格帶入的話,深度價內的期權確實沒有閉解,考慮到HTB-rate的存在,現貨價格怎麼也得調整一下
推薦閱讀: