人工智慧金融投資決策_ 利用Bi-section反推求解Volatility
二分逼近法(Bisection Method)
當處於連續函數情境,則適合去套用bisection方法。
以下是一個推導的動畫示意
求解 f(x) = x² - 2 = 0,即找到 √2 ≈ 1.4142...
根據上面的數學式子很明顯會知道要求解的根位於1~2之間
那我們一開始就取二分,也就是中間值1.5
1.5帶入式子計算 =>1.5² -2 > 0
代表我們猜的中間值取大了
這時候就要再去二分了,取的是[1,1.5]之間的中間值也就是1.25。
1.25帶入式子計算 =>1.25² -2 < 0
代表我們猜的中間值取小了
這時候就要再去二分了,取的是[1.25,1.5]之間的中間值
後續就持續往中間去逼近要求解的根,這就是Bi-Section
所以程式演算法每一次都會圍繞在[a,b]區間做三件事
- 先找中間值
- 接著判斷根在哪一半,再去調整左右哪側要取代為新的中間值
- 只要目前左右邊界 a 和 b 的距離還大於 0.000001,就繼續二分。
二分逼近法程式範例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | def f(x): return x**2 - 2 a, b = 1, 2 while b - a > 0.000001: c = (a + b) / 2 if f(a) * f(c) < 0: b = c else: a = c print((a + b) / 2) |
運行結果
利用Bi-section反推求解Volatility
選擇權定價主要是以
、 K 、 r 、 T、volatility來計算call 和 put的價格
其中以下這些都是能根據當時市場狀況和合約內容直接得知或推得,也是固定值:
:時間 0 時的股票價格
:履約價(合約到期價格)
:無風險利率
:選擇權的存續期間,以年為單位,通常以交易日計算,例如一年為 252 個交易日
:履約價(合約到期價格)
:無風險利率
:選擇權的存續期間,以年為單位,通常以交易日計算,例如一年為 252 個交易日
而唯獨Volatility(波動率)是需要估測的,能夠利用歷史波動率和統計作協助。
那也可改思考成輸入
、 K 、 r 、 T、當時call price的成交價格,來計算Volatility
換言之,就是找出一個volatility使其滿足Black-Scholes公式計算
blsprice(, K , r , T , Vol) 能近似於call price(現在成交價格)的問題
因為其他參數都為固定參數,我們可以用f(vol)去代替
blsprice(, K , r , T , Vol) - call ,找出最適vol使f(vol)近似於0
假設波動率是坐落於0~1中間的數字
計算f(0.5),若f(0) * f(0.5) < 0改去找0~0.5之間,反之則找0.5~1之間。
重複上述動作,持續對半縮減搜尋範圍。
在上一篇已經藉由Black-Scholes求解出call price
現在我們反過來看,比方有人交易成交價格為16.383741845158895
那要去反推當時的vol是多少,如果求解出來近似0.2就代表是正確的。
利用當時的call price套用二分逼近法反推波動率的程式範例
import math from scipy.stats import norm #傳入S、K、T、r、val,返回合理價格 def blsprice(S, K, T, r, vol): d1 = (math.log(S / K) + (r + vol * vol / 2) * T) / (vol * math.sqrt(T)) d2 = d1 - vol * math.sqrt(T) call = S * norm.cdf(d1) - K * math.exp(-r * T) * norm.cdf(d2) return call S = 50 K = 40 T = 2 r = 0.08 vol = 0.2 call = blsprice(S, K, T, r, vol) print(call) #傳入S、K、T、r、call,返回當時的波動率vol def BisectionBLS(S,K,T,r,call): left = 0.00000001 right = 1 while(right-left >= 0.00001): middle = (right+left)/2 if((blsprice(S,K,T,r,left)-call)*(blsprice(S,K,T,r,middle)-call) < 0): right = middle else: left = middle return (left+right)/2 print(BisectionBLS(S,K,T,r,call))
運行結果
The Greek Letters
留言
張貼留言