商品期权如何计算隐含波动率?

论坛 期权论坛 期权     
pingself   2017-7-19 17:09   92585   8
各位期权论坛的大神,请问商品期权如何计算隐含波动率?
分享到 :
2 人收藏

8 个回复

倒序浏览
2#
期权论坛第一帅  7级小牛  2年期权实盘交易经验 | 2017-7-19 17:11:15 发帖IP地址来自 湖南常德
用牛顿迭代法吧
3#
期权论坛第一帅  7级小牛  2年期权实盘交易经验 | 2017-7-19 17:11:23 发帖IP地址来自 湖南常德
C语言代码编辑

double func(double x) //函数
{
    return x*x*x*x-3*x*x*x+1.5*x*x-4.0;
}
double func1(double x) //导函数
{
    return 4*x*x*x-9*x*x+3*x;
}
int Newton(double *x,double precision,int maxcyc) //迭代次数
{
    double x1,x0;
    int k;
    x0=*x;
    for(k=0;k<maxcyc;k++)
    {
        if(func1(x0)==0.0)//若通过初值,函数返回值为0
        {
            printf("迭代过程中导数为0!\n");
            return 0;
        }
        x1=x0-func(x0)/func1(x0);//进行牛顿迭代计算
        if(fabs(x1-x0)<precision || fabs(func(x1))<precision)//达到结束条件
        {
            *x=x1; //返回结果
            return 1;
        }
        else //未达到结束条件
        {
            x0=x1; //准备下一次迭代
        }
    }
    printf("迭代次数超过预期!\n"); //迭代次数达到,仍没有达到精度
    return 0;
}

int main()
{
    double x,precision;
    int maxcyc;
    printf("输入初始迭代值x0:");
    scanf("%lf",&x);
    printf("输入最大迭代次数:");
    scanf("%d",&maxcyc);
    printf("迭代要求的精度:");
    scanf("%lf",&precision);
    if(Newton(&x,precision,maxcyc)==1) //若函数返回值为1
    {
        printf("该值附近的根为:%lf\n",x);
    }
    else //若函数返回值为0
    {
        printf("迭代失败!\n");
    }
    return 0;
}
C++代码编辑

//此函数是用来求一元3次方程ax^3+bx^2+cx+d=0的解
//比如 x^3-27=0,我们就可以输入1 0 0 -27,这样我们就可以得到一个解
#include<iostream>
#include<cmath>
using namespace std;
int main()
{
double diedai(double a,double b,double c,double d,double x);
double a,b,c,d;
double x=10000.0;
cout<<"请依次输入方程四个系数:";
cin>>a>>b>>c>>d;
x=diedai(a,b,c,d,x);
cout<<x<<endl;
return 0;
}
double diedai(double a,double b,double c,double d,double x)
{
while(abs(a*x*x*x+b*x*x+c*x+d)>0.000001)
{
x=x-(a*x*x*x+b*x*x+c*x+d)/(3*a*x*x+2*b*x+c);
}
return x;
}
可以得到一元3次方程3个解的程序(原创,超优化):

#include<iostream>
#include<vector>
using namespace std;

vector<double >v;//stl vector链型数组
vector<double >::iterator it;//vector迭代器

int x0=5;

double a,b,c,d;

double abs(double y){    while(y<0) y=-y;    return y;}

double f(double x){    return a*x*x*x+b*x*x+c*x+d;}

double fd(double x){    return 3*a*x*x+2*b*x+c;}

bool u;//用来判断是否重复

void newton(int a1,int b1,int c1,int d1)
{   
     for(x0=-5000;x0<=5000;x0++)//在一个大区域中逐个点用牛顿法,可找出大多数3次方程所有根   
     {         
          double x1=x0;         
          while(abs(f(x1))>0.001)         
          {                  
            double x=x1;                 
             x1=x-f(x)/fd(x);         
           }         
             for( it=v.begin();it!=v.end();it++)         
             {         
                 if(abs((*it-x1))<0.01)  {u=1; break;}        
             }         
              if(u!=1&&x1<1000000000)         
              {         
                      cout<<x1<<" ";            
                      v.push_back(x1);//把已得到的解添加到vector,用于防止重复         
              }         
              u=0;   
        }
}

int main(){   
     cin>>a>>b>>c>>d;     
     newton(a,b,c,d);
}
matlab代码编辑
定义函数
function y=f(x)
y=f(x);%函数f(x)的表达式
end
function z=h(x)
z=h(x);%函数h(x)的表达式
end
主程序
x=X;%迭代初值
i=0;%迭代次数计算
while i<= 100%迭代次数
x0=X-f(X)/h(X);%牛顿迭代格式
if abs(x0-X)>0.01;%收敛判断
X=x0;
else break
end
i=i+1;
end
fprintf('\n%s%.4f\t%s%d','X=',X,'i=',i) %输出结果
Python代码编辑
Python代码以实例展示求解f(x) = (x-3)**3,f(x) = 0 的根。
def f(x):
return (x-3)**3 ’''定义f(x) = (x-3)**3'''
def fd(x):
return 3*((x-3)**2) ’''定义f'(x) = 3*((x-3)**2)
def newtonMethod(n,assum):
time = n
x = assum
Next = 0
A = f(x)
B = fd(x)
print('A = ' + str(A) + ',B = ' + str(B) + ',time = ' + str(time))
if f(x) == 0.0:
return time,x
else:
Next = x - A/B
print('Next x = '+ str(Next))
if A == f(Next): print('Meet f(x) = 0,x = ' + str(Next)) ’''设置迭代跳出条件,同时输出满足f(x) = 0的x值'''
else:
returnnewtonMethod(n+1,Next)
newtonMethod(0,4.0) ’''设置从0开始计数,x0 = 4.0'''
4#
期权论坛第一帅  7级小牛  2年期权实盘交易经验 | 2017-7-19 17:12:31 发帖IP地址来自 湖南常德
数学原理是这样的

截图201707191712243060.png (65.61 KB, 下载次数: 1293)

5#
princess  3级会员 | 2017-7-19 17:13:41 发帖IP地址来自 澳大利亚
论坛大神直接贴代码。。。。{:4_319:}
6#
pingself  3级会员 | 2017-7-19 17:46:08 发帖IP地址来自 澳大利亚
谢谢大神的回答
7#
才鱼  4级常客 | 2017-7-19 17:46:37 发帖IP地址来自 湖南常德
哈哈哈
8#
weidadpig  3级会员 | 2017-7-19 18:04:27 发帖IP地址来自 上海
用LM 梯度下降法, 基本上6次迭代就能算出来,精度很高
9#
小如mm  4级常客 | 2017-7-21 18:52:05 发帖IP地址来自 北京
学习下
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:61
帖子:23
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP