全部版块 我的主页
论坛 金融投资论坛 六区 金融学(理论版) 金融工程(数量金融)与金融衍生品
10561 13
2015-07-13
  我尝试对已有的显示有限差分法对欧式期权进行定价的matlab代码进行修改,但是运行出来的结果不对,请问是什么原因呢?  原有的代码为看跌期权,我想改为看涨期权。所以我仅对边界条件进行了修改:


  已有的看跌期权边界条件:
matval(:,N+1)=max(K-vetS,0);     % 在时间到期时的期权价格
matval(1,:)=K*exp(-r*dt*(N-vetj));    %在S=0时的期权价格
matval(M+1,:)=0;            %在S=Smax时的期权价格

  我修改的看涨期权边界条件:
matval(:,N+1)=max(vetS-K,0);    % 在时间到期时的期权价格
matval(1,:)=0;          %在S=0时的期权价格
matval(M+1,:)=(dS*M-K)*exp(-r*dt*(N-vetj));  在S=Smax时的期权价格



  我修改后计算出来的看涨期权价格为:-3.4383e+08  不知道为什么错的那么离谱
  请各位大神帮忙看下,谢谢了!!
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

全部回复
2015-7-14 08:31:21
显性方法会有instability,得到很奇怪的数不是很奇怪。你最好post一下完整的code。我们也不知道原有代码是什么。
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2015-7-14 11:06:16
Chemist_MZ 发表于 2015-7-14 08:31
显性方法会有instability,得到很奇怪的数不是很奇怪。你最好post一下完整的code。我们也不知道原有代码是什 ...
原有的代码为:
clear
S0 = 50;
K = 50;
r = 0.1;
T = 5/12;
sigma = 0.4;
Smax = 100;

dS=2;
dt=5/1200;
%建立网格,并且在必要时调整增量
M=round(Smax/dS);
dS=Smax/M;
N=round(T/dt);
dt=T/N;
matval=zeros(M+1,N+1);
vetS=linspace(0,Smax,M+1);
veti=0:M;
vetj=0:N;
%建立边界条件 (这个就是我修改的地方)   
matval(:,N+1)=max(K-vetS,0);
matval(1,:)=K*exp(-r*dt*(N-vetj));
matval(M+1,:)=0;
%建立三对角矩阵  
a=0.5*dt*(sigma^2*veti-r).*veti;
b=1-dt*(sigma^2*veti.^2+r);
c=0.5*dt*(sigma^2*veti+r).*veti;
%求解方程
for j=N:-1:1
    for i=2:M
matval(i,j)=a(i)*matval(i-1,j+1)+b(i)*matval(i,j+1)+...
c(i)*matval(i+1,j+1);
    end
end  %返回价格,有可能在网格外线性插值生成
price=interp1(vetS,matval(:,1),S0)


谢谢!!
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2015-7-14 11:38:00
想当一个白馒头 发表于 2015-7-14 11:06
原有的代码为:
clear
S0 = 50;
是instability, 你把dt改小一点就好了比如dt=5/2400. 可能的原因是put有自然边界,0到 S-K而call没有,理论上可以到无限大,必须找一个有限的Smax。
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2015-7-14 13:59:28
Chemist_MZ 发表于 2015-7-14 11:38
是instability, 你把dt改小一点就好了比如dt=5/2400. 可能的原因是put有自然边界,0到 S-K而call没有,理 ...
按您的方法试过了,问题得到了解决! 谢谢!!!

还有一个关于用crank_Nicolson差分方法对单边敲入障碍期权进行定价的问题可以请您帮忙看看吗?我已经编好了单边敲出的代码,但是在编单边敲入期权的时候遇到了问题,运行出的结果为NAN。

我查到文献说在对单边障碍期权定价的时候只需要在期权有效的S范围内格子。
例如:对于看涨向下敲出和向上敲入期权考虑的范围是一样的:(Sb,Smax)。唯一不同的是在Sb处的边界条件,即:向下敲出:f(Sb, t)=0; 向上敲入:f(Sb, t)=(Sb-K)*exp(-r*(T-t)) ,其中K为执行价。

请问我对向上敲入期权在Sb处的边界条件理解对了吗?整个代码如下:

%利用crank_N%利用crank_Nicolson差分方法对上升敲入期权进行定价

%初始化信息

clear
S0 = 145;
Sb=160;
K = 145;
r = 0.06;
T = 0.5;
sigma = 0.295;
Smax = 200;
otype=CALL;%期权类型
dS=2;
dT=5/10000;

%建立网格
M=round((Smax-Sb)/dS);
ds=(Smax-Sb)/M;
N=round(T/dT);
dt=T/N;
svec=linspace(Sb,Smax,M+1)';
tvec=linspace(0,T,N+1);
i=svec/ds;

%建立三角矩阵(系数矩阵)
sig2 = sigma*sigma;
alpha = 0.25*dt*( sig2*(i.^2) - r*i );
beta = -dt*0.5*( sig2*(i.^2) + r );
gamma = 0.25*dt*( sig2*(i.^2) + r*i );


%初始化矩阵
biprice=zeros(M+1,N+1);

%将三角矩阵赋值
M1=diag(-alpha(3:M),-1) + diag(1-beta(2:M)) + diag(-gamma(2:M-1),1);
M2=diag(alpha(3:M),-1) + diag(1+beta(2:M)) + diag(gamma(2:M-1),1);



%边界条件

biprice(:,end)=  max(svec-K,0); %到期时刻的期权价值
biprice(1,:) = (svec(1)-K)*exp(-r*tvec(end:-1:1)); %S=Sb时的期权价格
biprice(end,:) = (svec(end)-K )*exp(-r*tvec(end:-1:1)); %期权价格为Smax的时候
        

        

%计算矩阵
for q=N:-1:1
      biprice(2:end-1,q) = M1\(M2*biprice(2:end-1,q+1));%排除已知的边界条件的情况
   
end
oprice1=interp1(svec,biprice(:,1),S0)

谢谢!!!!
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2015-7-15 07:56:56
想当一个白馒头 发表于 2015-7-14 13:59
按您的方法试过了,问题得到了解决! 谢谢!!!

还有一个关于用crank_Nicolson差分方法对单边敲入障碍 ...
你的边界条件没选对,对于up in 的call你的边界条件应该是

股价是零的时候为0:v(0,t)=0, 0<=t<=T
到期日的时候股价不为边界的时候是0:v(x,T)=0, 0<=x<U
任意时间边界处的值应该是对应到期日的BS vanilla call的值: v(U,t)=BSprice(U,K,T-t,r,volatility) 0<=t<=T, 因为一旦触及边界你相当于就得到了一个普通的call。

你之前的问题是你的网格的构建范围根本没有包括S0,这样你是不可能找到S0对应的option price的。所以当你用interp1来interpolate的时候, S0不在svec里面,而是在外面所以自然return NaN。

如果你觉得直接price up&in的call不够直观,你可你先price up&out call 然后用in and out parity来算up&in的call。
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

点击查看更多内容…
相关推荐
栏目导航
热门文章
推荐文章

说点什么

分享

扫码加好友,拉您进群
各岗位、行业、专业交流群