近期由于工作需要,接触到了期权定价模型以及隐含波动率等。作为非专业人士经过几星期恶补,终于搞定了难题。特此整理一些资料防止其他同仁踩坑。如有错误之处请各位指正。
1.什么是期权定价模型?
期权定价模型由布莱克与斯科尔斯在20世纪70年代提出,该模型认为,只有股价的当前值与未来的预测有关;变量过去的历史与演变方式与未来的预测不相关。模型表明,期权价格的决定非常复杂,合约期限、股票现价、无风险资产的利率水平以及交割价格等都会影响期权价格。
2.什么是Black-Scholes期权定价模型?
B-S是两位经济学家BLACK、SCHOLES名字的缩写,为了纪念他们发现该模型而用他们的名字命名。
期权定价模型基于对冲证券组合的思想。投资者可建立期权与其标的股票的组合来保证确定报酬。在均衡时,此确定报酬必须得到无风险利率。期权的这一定价思想与无套利定价的思想是一致的。所谓无套利定价就是说任何零投入的投资只能得到零回报,任何非零投入的投资,只能得到与该项投资的风险所对应的平均回报,而不能获得超额回报(超过与风险相当的报酬的利润)。从Black-Scholes期权定价模型的推导中,不难看出期权定价本质上就是无套利定价。
假设条件
1、标的资产价格服从对数正态分布;
2、在期权有效期内,无风险利率和金融资产收益变量是恒定的;
3、市场无摩擦,即不存在税收和交易成本;
4、金融资产在期权有效期内无红利及其它所得(该假设后被放弃);
5、该期权是欧式期权,即在期权到期前不可实施。
定价公式
C=S·N(D1)-L·(E^(-γT))*N(D2)
其中:
D1=(Ln(S/L)+(γ+(σ^2)/2)*T)/(σ*T^(1/2))
D2=D1-σ*T^(1/2)
C—期权初始合理价格
L—期权交割价格
S—所交易金融资产现价
T—期权有效期
γ—连续复利计无风险利率H
σ2—年度化方差
N()—正态分布变量的累积概率分布函数,在此应当说明两点:
第一,该模型中无风险利率必须是连续复利形式。一个简单的或不连续的无风险利率(设为γ0)一般是一年复利一次,而γ要求利率连续复利。γ0必须转化为r方能代入上式计算。两者换算关系为:γ=LN(1+γ0)或γ0=Eγ-1。例如γ0=0.06,则γ=LN(1+0.06)=0583,即100以583%的连续复利投资第二年将获106,该结果与直接用γ0=0.06计算的答案一致。
第二,期权有效期T的相对数表示,即期权有效天数与一年365天的比值。如果期权有效期为100天,则T=100/365=0.274。
3.什么是隐含波动率?
隐含波动率是将市场上的权证交易价格代入权证理论价格模型,反推出来的波动率数值。香港市场称为“引伸波幅”。隐含波动率是市场对相关资产(正股或指数)未来一段时间内的波动预期,与权证价格是同方向变化。是对未来市场价格波动的一个预测值.
4.如何计算隐含波动率?
从理论上讲,要获得隐含波动率的大小并不困难。由于期权定价模型(如BS模型)给出了期权价格与五个基本参数(标的股价、执行价格、利率、到期时间、波动率)之间的定量关系,只要将其中前4个基本参数及期权的实际市场价格作为已知量代入定价公式,就可以从中解出惟一的未知量,其大小就是隐含波动率。(即通过BS模型公式代入标的股价、执行价格、无风险利率、到期时间,当前市场期权价格 从而反推计算出隐含波动率。)
5.如何计算期权价格?
使用BS公式计算期权价格:
只需将标的股价、执行价格、无风险利率、到期时间,隐含波动率代入BS公式即可计算出期权价格.
公式如下:
6.关于隐含波动率与期权价格疑问
首先需要有期权价格,然后再通过计算得出隐含波动率。期权价格是由市场决定的。再期权市场上买方和卖方都是由用户组成。期权价格是由买方和卖方的心理预期价位决定的.交易所再通过取买卖双方成交价作为期权价格然后代入BS公式计算出隐含波动率
7.计算期权价格流程:
例子:
1.首先从火币网获取当前最近的行权日的期权信息。比如当前期权到期时间剩余2天的期权,行权价为400的看涨期权。我们获取他的最新期权成交价以及当前以太坊现货价格。
此时我们得到4个参数:
ETH现货价格(645)
行权价(400)
到期时间剩余2天(2/365)
当前期权最新成交价格(199.61).
我们把以上参数代入波动率计算函数IV(645,400,2/365,199.61)。
通过计算它返回一个对应的波动率(1.254)。
2.然后我们再计算我们需要的期权价格。比如我们现在需要知道7天后到期的行权价格为500的期权价格。我们同样从交易所获取最新的以太坊现货价格。把他输入公式bs(645,500,7/365,1.254)从而计算出一个比较接近市场预期的期货价格。
8.go代码实现看涨期权定价及波动率计算
package main
import (
"BAW/go-gaussian"
"encoding/json"
"fmt"
"io/ioutil"
"log"
"math"
"net/http"
"net/url"
"os"
"strconv"
"time"
)
/*
参数S(当前股票价格)、X(执行价格)、T(以年为单位的有效期)、r(连续复利的无风险利率)和 sigma(股票回报率的标准方差,也称为波动率)
返回值 为看涨期权价格,看跌期权价格。不需要的部分直接使用_丢弃。
*/
func bs_call(S,X,T,r,sigma float64)(float64,float64){
d1:=(math.Log(S/X)+(r+0.5*math.Pow(sigma,2))*T)/(sigma*math.Sqrt(T))
d2:=(math.Log(S/X)+(r-0.5*math.Pow(sigma,2))*T)/(sigma*math.Sqrt(T))
return S*gaussian.NormCdf(d1)-X*math.Exp(-r*T)*gaussian.NormCdf(d2),X*math.Exp(-r*T)*gaussian.NormCdf(-d2)-S*gaussian.NormCdf(-d1)
}
//计算隐含波动率(通过期权价格反推)
var sigma1 float64
/*
参数S(当前股票价格)、X(执行价格)、T(以年为单位的有效期)、r(连续复利的无风险利率)和 price(期权价格)
*/
func CallIV(S,X,T,r,price float64)(float64,float64,float64) {
for i:=0.0;i<1000000;i++ {
var diff float64
sigma1=0.00001*(i+1)
a,_:=bs_call(S,X,T,r,sigma1)
if price==a{
diff=price+0.1-a
}else if a>price{
diff=0
}else {
diff=price-a
}
if math.Abs(diff)<=0.001{
if sigma1<0.0001 {
return i,0,diff
}
return i,sigma1,diff
}
}
return 0 ,0 ,0
}
以上代码实现的go-gaussian库地址 https://github.com/mafredri/go-gaussian.git