期权定价模型BS模型及反推隐含波动率 golang实现

近期由于工作需要,接触到了期权定价模型以及隐含波动率等。作为非专业人士经过几星期恶补,终于搞定了难题。特此整理一些资料防止其他同仁踩坑。如有错误之处请各位指正。

 

1.什么是期权定价模型?

 

期权定价模型由布莱克与斯科尔斯在20世纪70年代提出,该模型认为,只有股价的当前值与未来的预测有关;变量过去的历史与演变方式与未来的预测不相关。模型表明,期权价格的决定非常复杂,合约期限、股票现价、无风险资产的利率水平以及交割价格等都会影响期权价格


 

2.什么是Black-Scholes期权定价模型?

 

B-S是两位经济学家BLACKSCHOLES名字的缩写,为了纪念他们发现该模型而用他们的名字命名。

 

期权定价模型基于对冲证券组合的思想。投资者可建立期权与其标的股票的组合来保证确定报酬。在均衡时,此确定报酬必须得到无风险利率。期权的这一定价思想与无套利定价的思想是一致的。所谓无套利定价就是说任何零投入的投资只能得到零回报,任何非零投入的投资,只能得到与该项投资的风险所对应的平均回报,而不能获得超额回报(超过与风险相当的报酬的利润)。从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,即100583%的连续复利投资第二年将获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

 

  • 2
    点赞
  • 42
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值