在之前文章《中国恐慌指数(IVIX)咋没有了》发现中国恐慌指数又夭折了,但是基于波动率交易的趋势是无法阻挡的,vix指标还是很多人做仓位控制的主要参数之一,今天我们就来说说恐慌指数(VIX)之隐含波动率计算Matlab程序,如何自力更生计算隐含波动率。
1973年,芝加哥大学教授Black和MIT 教授Scholes在美国“政治经济学报”(Journal ofPolitical Economy)上发表了一篇题为“期权定价和公司负债”(The pricing of Options andCorporate Liabilities)的论文;同年,哈佛大学教授Merton在“贝尔经济管理科学学报”上发表了另一篇论文“期权的理性定价理论”(Theory of rational option pricing),奠定了期权定价的理论性基础,B-S期权定价公式诞生了,BS公式如下:
一般情况下,已知上述五个参数即可计算出相对应的期权价格。上市的期权在交易所进行交易的,但其交易价格不一定为根据历史波动率由BS公式计算出的理论价格。主要原因为投资者认为该期权标的证券的波动率与其历史波动率不一致所致。例如,期权标的证券代表的公司可能将发生合并重组、资产注入或者由于投资非理性投资造成。
隐含波动率是将市场上的期权交易价格代入权证理论价格Black-Scholes模型,反推出来的波动率数值。由于期权定价BS模型给出了期权价格与五个基本参数之间的定量关系,只要将其中前4个基本参数及期权的实际市场价格作为已知量代入定价公式,就可以从中解出惟一的未知量,其大小就是隐含波动率。
隐含波动率是一个重要的风险指标。历史波动率反映期权标的证券在过去一段时间的波动幅度,期权发行商与投资者在期权发行初期只能利用历史波动率作参考。一般来说,期权的隐含波动率越高,其隐含的风险也就越大。期权投资者除了可以利用期权的正股价格变化方向来买卖权证外,还可以从股价的波动幅度的变化中获利。一般来说,波动率并不是可以无限上涨或下跌,而是在一个区间内来回震荡,投资者可以采取在隐含波动率较低时买入而在较高时卖出期权的方法来获利。
如何判断一个期权的价格是否高估?主要应该看隐含波动率与其标的证券的历史波幅之间的关系。隐含波动率是市场对其标的证券未来一段时间内的波动预期,与期权价格是同方向变化。一般而言,隐含波动率不会与历史波幅相等,但在其标的证券的基本面保持稳健的条件下,应该相差不大。
[h2]
[/h2]
利用Matlab的fsolve函数计算隐含波动率,fsolve是matlab最主要内置的求解方程组的函数,具体fsolve的使用方法可以参看Appendix B:相关函数说明。
例:假设欧式股票期权,一年后,执行价格95元,现价为100元,无股利支付,股价年化波动率为50%,无风险利率为10%,则期权价格为:
>>[Call, Put] =blsprice(100, 95, 0.1, 0.25, 0.5)
>> Call = 13.6953 Put = 6.3497
假设目前其期权交易价格为Call = 15.00,Put = 7.00分别计算其相对应的隐含波动率。
步骤1:建立方程函数
看涨期权隐含波动率方程:M文件ImpliedVolatitityCallObj.M
f=ImpliedVolatitityCallObj(Volatility,Price, Strike, Rate, Time, Callprice)
输入参数:
Volatility:标的资产价格波动率
Price:标的资产市场价格
Strike:执行价格
Rate:无风险利率
Time:距离到期时间
Callprice:看涨期权价格
输出函数:
f: 隐含波动率
程序源码:functionf=ImpliedVolatitityCallObj(Volatility, Price, Strike, Rate, Time, Callprice)
%ImpliedVolatitityCallObj
%code by ariszheng@gmail.com2009-8-3
[Call,Put] = blsprice(Price,Strike, Rate, Time, Volatility);
%存在一个波动率使得下列等式成立
%fc(ImpliedVolatitity)=Call-Callprice=0
f=Call-Callprice;
看跌期权隐含波动率方程:M文件ImpliedVolatitityPutObj.M
f=ImpliedVolatitityPutObj(Volatility,Price, Strike, Rate, Time, Putprice)
输入参数:
Volatility:标的资产价格波动率
Price:标的资产市场价格
Strike:执行价格
Rate:无风险利率
Time:距离到期时间
Putprice:看跌期权价格
输出函数:
f: 隐含波动率
程序源码:function f=ImpliedVolatitityPutObj(Volatility, Price, Strike, Rate, Time, Putprice)
%ImpliedVolatitityCallObj
%code by ariszheng@gmail.com2009-8-3
%根据参数,使用blsprice计算期权价格
[Call,Put] = blsprice(Price,Strike, Rate, Time, Volatility);
%fp(ImpliedVolatitity)=Put-Putprice=0
%目标使得寻找X使得目标函数为0
f=Put-Putprice;
步骤2:求解方程函数:M文件ImpliedVolatility.m
[Vc,Vp,Cfval,Pfval]=ImpliedVolatility(Price,Strike,Rate,Time,CallPrice,PutPrice)
输入参数:
Price:标的资产市场价格
Strike:执行价格
Rate:无风险利率
Time:距离到期时间
Callprice:看涨期权价格
Putprice:看跌期权价格
输出函数:
Vc:看涨期权的隐含波动率
Vp:看跌期权的隐含波动率
Cfval:的函数值,若为0,则隐含波动率计算正确;
Pfval:的函数值,若为0,则隐含波动率计算正确;
程序源码:function [Vc,Vp,Cfval,Pfval]= ImpliedVolatility(Price, Strike, Rate,Time, CallPrice, PutPrice)
%ImpliedVolatility
%code by ariszheng@gmail.com2009-8-3
%优化算法初始迭代点;
Volatility0=1.0;
%CallPrice对应的隐含波动率
[Vc,Cfval] =fsolve(@(Volatility)ImpliedVolatitityCallObj(Volatility, Price, Strike,Rate, Time, CallPrice),Volatility0);
%CallPrice对应的隐含波动率
[Vp,Pfval] =fsolve(@(Volatility)ImpliedVolatitityPutObj(Volatility, Price, Strike, Rate, Time,PutPrice),Volatility0);
步骤3:函数求解:M文件TestImpliedVolatility.M
%TestImpliedVolatility
%市场价格
Price=100;
%执行价格
Strike=95;
%无风险利率
Rate=0.10;
%时间(年)
Time=1.0;
CallPrice=15.0;%看涨期权交易价格
PutPrice=7.0; %看跌期权交易价格
%调用ImpliedVolatility函数
[Vc,Vp,Cfval,Pfval]=ImpliedVolatility(Price,Strike,Rate,Time,CallPrice,PutPrice)
计算结果
>> Optimization terminated:first-order optimality is less than options.TolFun.
Optimization terminated:first-order optimality is less than options.TolFun.
Vc =
0.1417
Vp =
0.3479
Cfval =
3.7957e-011
Pfval =
7.1054e-015
结果说明Cfval与Pfval函数值为0说明计算出Vc与Vp为方程的解,即期权交易价格为Call = 15.00,Put = 7.00分别计算其相对应的隐含波动率为14.17%与34.79%。
波动率与价格关系图像:
在其他条件不变的情况下,图6为期权价格与波动率关系图,横轴为波动率,纵轴为交易价格。
画图程序M文件VolatilityPrice.mPrice=100;
Strike=95;
Rate=0.10;
Time=1.0;
%波动率从0到20%
Volatility=0:0.1:2.0;
n=length(Volatility);
Call=zeros(n,1);
Put=zeros(n,1);
%分别计算看涨期权价格与看跌期权价格
for i=1:n
[Call(i),Put(i)] = blsprice(Price, Strike, Rate, Time, Volatility(i));
End
%画子图
% subplot(2,1,1)其中“2,1”表示画一个2X1的矩阵图
%最后的参数“1”表示画第一个图,顺序是从上到下,从左到右。
subplot(2,1,1)
plot(Volatility,Call,'-*');
legend('CallPrice')
subplot(2,1,2)
plot(Volatility,Put,'-o');
legend('PutPrice')
程序中引用[Call,Put] = blsprice(Price, Strike, Rate, Time, Volatility)函数中Volatility参数不能为负数,在特殊情况下,某些期权价格不符合BS公式,即某些期权价格不能使用上述公式计算出隐含波动率。
在Matlab的finance工具箱中,自带了隐含波动率计算的函数blkimpv,上述的案例讲述了一个问题或者一个函数背后的逻辑,以便于读者开发自己的程序。
Volatility =blsimpv(Price, Strike, Rate, Time, Value, Limit, Tolerance, Class)
输入参数:
Price:标的资产市场价格
Strike:执行价格
Rate:无风险利率
Time:距离到期时间
Value: 期权的市场价格
Limit:(可选)可行解上届,默认为10
Tolerance:(可选)迭代算法的停止条件1e-6(默认),具体看参看非线性优化相关内容
Class:(可选)Class = 1看涨期权,Class=2看跌期权,默认为看涨期权
输出参数:
Volatility:波动率
使用示例:%标底资产价格
Price=100;
%执行价格
Strike=95;
%无风险收益率(年化)
Rate=0.1;%10%
%剩余时间
Time=1;%;
%看涨期权市价10元
Value=15;
%看涨期权Class=1 (默认)
Volatility = blsimpv(Price,Strike, Rate, Time, Value) 计算结果:0.1417与前面计算的结果一致。
摘自《金融数量分析基于Matlab编程》第三版
|
|