Black-Scholes-Merton模型
前言
Black-Scholes-Merton(三人幾乎在同一年同一時間提出該模型)模型又被稱為BS模型(事實上,這個叫法更為廣泛和流行),本章內容會對BS模型進行一個簡要的介紹,并且基于python進行量化,此外,本章還將介紹期權的時間價值、期權的內在價值等概念,
一、BS模型
1.模型簡介
期權定價理論最早的提出者是法國的經濟學家 Bachelier,其在
1900 年的一篇文章中首次提出關于期權定價的問題,隨后,Boness
將其理論進行補充,在 1973 年,美國的數學家、經濟學家 Black 和
Scholes提出了一個較為完整的期權定價模型,稱為 Balck-choles 模型,Balck-Scholes 模型是較為理想的歐式期權定價模型,該模型的提出為期權的發展奠定了基礎,在理論和實踐方面都有著重大的意義,
Black-Scholes 期權的價格模型是建立在嚴格的假設基礎上的,包
括以下幾點:
首先,期權標的物的價格服從布朗幾何運動,因此股票價格的收
益率必須服從對數正態分布,
第二,商業市場沒有摩擦,沒有稅收,沒有賣空限制,
第三,無風險利率不變,
第四,期權不能在到期日之前行使,必須是歐式期權,
2.模型數學公式


二、BS模型的python量化
1.BS模型代碼
# BSM模型
# Black-Scholes-Merton (1973) European Call & Put Valuation
import math
import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt
from scipy.integrate import quad
mpl.rcParams['font.family'] = 'serif'
from scipy.stats import norm
#歐式看漲期權函式
# 歐式看漲期權
def BSM_call_value(St, K, t, T, r, sigma):
d1=(np.log(St/K)+(r+0.5*sigma**2)*(T-t))/(sigma*np.sqrt((T-t)))
d2=d1-sigma*np.sqrt((T-t))
return St*norm.cdf(d1)-K*np.exp(-r*(T-t))*norm.cdf(d2)
#歐式看跌期權函式
def BSM_put_value(St, K, t, T, r, sigma):
d1=(np.log(St/K)+(r+0.5*sigma**2)*(T-t))/(sigma*np.sqrt((T-t)))
d2=d1-sigma*np.sqrt((T-t))
return K*np.exp(-r*(T-t))*norm.cdf(-d2)-St*norm.cdf(-d1)
舉例
# 例子
St=100
K=98
T=1
t=0
r=0.015
sigma=0.25
call=BSM_call_value(St, K, t, T, r, sigma)
put=BSM_put_value(St, K, t, T, r, sigma)
print('看漲期權價格',call,'看跌期權價格',put)
實際資料
將上證50ETF期權一分鐘高頻資料進行實證,
資料一覽

# 看漲期權
St= data['標的資產價格'] # initial index level
K =data['行權價'] # strike level
T=data['到期天/年']
r = data['無風險利率']/100 # constant short rate
sigma =0.02# constant volatility of diffusion
t=0
from matplotlib import pyplot as plt
#新增加的兩行
import matplotlib
matplotlib.rc("font",family='DengXian')
BS_Call_price=BSM_call_value(St, K, t, T, r, sigma)
#預測結果
plt.figure(figsize=(15,10))
plt.plot(np.array(BS_Call_price),label='BS模型')
plt.plot(np.array(data['期權價格']),label='實際期權價格')
plt.legend()
plt.ylabel('價格(元)')
plt.show()

從圖中可以看出,BS模型對期權實際價格的預測情況差強人意,預測初期和預測末期的精準度不錯,而預測中期則波動較大,
2.預測誤差分析
對預測結果進行誤差分析,誤差分析指標如下
均方誤差(Mean Square Error)
均方根誤差(Root Mean Square Error)
平均絕對誤差(Mean Absolute Error)
平均絕對百分比誤差(Mean Absolute Percentage Error)
以上指標越小表明誤差越小,

bs_test_pred=BS_Call_price
test_label=data['期權價格']
# mape
bs_test_mape=np.mean(np.abs((bs_test_pred-test_label)/test_label))
# rmse
bs_test_rmse=np.sqrt(np.mean(np.square(bs_test_pred-test_label)))
# mae
bs_test_mae=np.mean(np.abs(bs_test_pred-test_label))
#MSE
bs_test_mse=np.sum((test_label-bs_test_pred)**2)/len(bs_test_pred)
結果如下:
BS模型測驗集的mape: 0.07028108461117291 rmse: 0.030983676079028164 mae: 0.024887289528898276 MSE: 0.0009599881833701404
可以看出,BS模型的預測結果還可以,基本符合了預期,
三、期權的內在價值
站在期權合約持有人的角度,可以用期權的內在價值(inner value)刻畫到期日時持有人的收益情況:
h=max(St-K,0)
例子
假設指數期權行權價為3650,指數在到期日時的收盤價在3500-3800之間,
# 例子
import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt
# 行權價
K=3650
# 標的資產價格
S=np.linspace(3500,3800,100)
# 內在價值
h=np.maximum(S-K,0)
plt.figure(figsize=(12,10))
plt.plot(S,h,lw=2.5)
# plt.legend()
plt.grid()
plt.xlabel('標的資產價格')
plt.ylabel('期權內在價值')

可以看出,期權的內在價值取決于到期日當天的標的資產價格水平,
實際資料
上證50ETF期權一分鐘高頻資料分析

通過圖可以看出,實際資料中,標的資產價格大于行權價,其內在價值大于0
# 期權的內在價值
import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt
# 行權價
K=data['行權價']
# 標的資產價格
S=data['標的資產價格']
# 內在價值
h=np.maximum(S-K,0)
plt.figure(figsize=(12,10))
plt.plot(S,h,lw=2.5)
# plt.legend()
plt.grid()
plt.xlabel('標的資產價格')
plt.ylabel('期權內在價值')

四、期權的時間價值

期權的時間價值等于期權價格減去期權的內在價值,
例子
# 例子
# 時間價值
# 期權引數
St=np.linspace(4000,12000,150) # initial index level
K =8000 # strike level
T=1
r = 0.025 # constant short rate
sigma =0.2# constant volatility of diffusion
t=0
# 內在價值
h=np.maximum(St-K,0)
# 期權價值
BS_Call_price=BSM_call_value(St, K, t, T, r, sigma)
plt.figure(figsize=(12,10))
plt.plot(St,h,'b-.',lw=2.5,label='期權內在價值')
plt.plot(St,BS_Call_price,'r',lw=2.5,label='期權現值')
plt.plot(St,BS_Call_price-h,'g',lw=2.5,label='期權時間價值')
plt.legend()
plt.grid()
plt.show()

從圖中可以看出,期權的時間價值在指數價格等于行權價時達到最高,此后開始逐漸衰減,
實際資料
# 時間價值
# 期權引數
St= data['標的資產價格'] # initial index level
K =data['行權價'] # strike level
T=data['到期天/年']
r = data['無風險利率']/100 # constant short rate
sigma =0.02# constant volatility of diffusion
t=0
# 內在價值
h=np.maximum(St-K,0)
# 期權價值
BS_Call_price=BSM_call_value(St, K, t, T, r, sigma)
plt.figure(figsize=(12,10))
plt.plot(h,'b-.',lw=2.5,label='期權內在價值')
plt.plot(BS_Call_price,'r',lw=2.5,label='期權現值')
plt.plot(BS_Call_price-h,'g--',lw=2.5,label='期權時間價值')
plt.legend()
plt.grid()
plt.show()

總結
本章對期權定價的經典模型BS模型進行了簡介,并且對模型的定價進行python量化,此外,本章還對期權的時間價值、內在價值進行了介紹,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/382781.html
標籤:AI
