最近實習開始算期權隱含波動率。期權隱含波動率的演算法寫的人不多,分享幾種計算方法。
1. 根據bs公式用二分法計算
從wind裡面取數之後算會出現的實際問題是有些**的期權並沒有**(沒人買),所以顯示p=0。
def bsm(f0,k,t,r,sigma):
d1=(np.log(f0/k)+(r+0.5*sigma**2)*t)/sigma/np.sqrt(t)
d2=d1-sigma*np.sqrt(t)
c=f0*norm.cdf(d1)-k*np.exp(-r*t)*norm.cdf(d2)
p=k*np.exp(-r*t)*norm.cdf(-d2)-f0*norm.cdf(-d1)
return c,p
#二分法求隱含波動率
def bisection(p,f0,k,r,t,c): #c=0,call;c=1,put.
value0=0#迭代初始值
top=100
floor=0
sigma=(floor+top)/2
i=0while abs(p-value0)>1e-2:
value0=bsm(f0,k,t,r,sigma)[c]
if (p-value0)>0:
floor=sigma
sigma=(sigma+top)/2
else:
top=sigma
sigma=(sigma+floor)/2
#print(sigma)
i+=1
if i>100:
sigma=''
print('too many iterations')
break
return sigma
def bisection_sigma(p,f0,k,r,t,c):
if p==0:
return 0
else:
return bisection(p,f0,k,r,t,c)
2. 用vega算
在stackflow上看到有人是用vega算,缺點用vega算需要符合一些條件,優點是不需要迭代,可以直接計算。附上一段**。
n = norm.cdf
def bs_call(s, k, t, r, vol):
d1 = (np.log(s/k) + (r + 0.5*vol**2)*t) / (vol*np.sqrt(t))
d2 = d1 - vol * np.sqrt(t)
return s * norm.cdf(d1) - np.exp(-r * t) * k * norm.cdf(d2)
def bs_vega(s, k, t, r, sigma):
d1 = (np.log(s / k) + (r + 0.5 * sigma ** 2) * t) / (sigma * np.sqrt(t))
return s * norm.pdf(d1) * np.sqrt(t)
def find_vol(target_value, s, k, t, r, *args):
max_iterations = 200
precision = 1.0e-5
sigma = 0.5
for i in range(0, max_iterations):
price = bs_call(s, k, t, r, sigma)
vega = bs_vega(s, k, t, r, sigma)
diff = target_value - price # our root
if (abs(diff) < precision):
return sigma
sigma = sigma + diff/vega # f(x) / f'(x)
return sigma # value wasn't found, return best guess so far
3. 很多金融界人士其實是用excel(vba)算的,這裡推薦用hull大神的derivagem,人大經濟論壇上有各種版本的這個軟體。優點是簡單容易用,缺點的話,主要就是不適合需要算很多資料,拿來練練教材的課後習題還是好的。 求期權的隱含波動率
1 coding utf 8 2 3created on wed nov 24 20 12 47 2021 4求隱波 5 author administrator 6 78 from scipy import stats 9import numpy as np 10from scipy.optimi...
求素數的幾種方法
素數,也稱為質數,其只能被1或者自身整除的自然數 不包括1 換而言之,只有兩個正因數的自然數稱為素數。與之相對的比1大但不是素數的自然數稱為合數。1和0既不是素數也不是合數,合數由若干個質數相乘得到。顯然根據定義就能判斷乙個數n是否為素數,具體的,對其從2到sqrt n 進行除法,判斷是否存在餘數為...
求逆序數的幾種方法
求乙個數列的逆序數 逆序對 數列a 1 a 2 a 3 中的任意兩個數a i a j i,如果a i a j 那麼我們就說這兩個數構成了乙個逆序對 逆序數 乙個數列中逆序對的總數 如數列3 5 4 8 2 6 9 5,4 是乙個逆序對,同樣還有 3,2 5,2 4,2 等等 那麼如何求得乙個數列的逆...