9271 13

[学科前沿] 关于用显示有限差分法对欧式看涨期权进行定价的问题 [推广有奖]

  • 0关注
  • 1粉丝

高中生

60%

还不是VIP/贵宾

-

威望
0
论坛币
446 个
通用积分
0.7940
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
100 点
帖子
12
精华
0
在线时间
51 小时
注册时间
2015-3-9
最后登录
2017-4-4

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
  我尝试对已有的显示有限差分法对欧式期权进行定价的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  不知道为什么错的那么离谱
  请各位大神帮忙看下,谢谢了!!
二维码

扫码加我 拉你入群

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

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

关键词:有限差分法 有限差分 差分法 matlab代码 MATLAB matlab

回帖推荐

Chemist_MZ 发表于4楼  查看完整内容

是instability, 你把dt改小一点就好了比如dt=5/2400. 可能的原因是put有自然边界,0到 S-K而call没有,理论上可以到无限大,必须找一个有限的Smax。

本帖被以下文库推荐

沙发
Chemist_MZ 在职认证  发表于 2015-7-14 08:31:21 |只看作者 |坛友微信交流群
显性方法会有instability,得到很奇怪的数不是很奇怪。你最好post一下完整的code。我们也不知道原有代码是什么。

使用道具

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)


谢谢!!

使用道具

板凳
Chemist_MZ 在职认证  发表于 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。
已有 2 人评分经验 论坛币 学术水平 热心指数 信用等级 收起 理由
见路不走 + 5 + 5 + 1 + 1 + 1 精彩帖子
accumulation + 100 + 5 + 5 + 5 精彩帖子

总评分: 经验 + 105  论坛币 + 5  学术水平 + 6  热心指数 + 6  信用等级 + 6   查看全部评分

使用道具

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)

谢谢!!!!

使用道具

地板
Chemist_MZ 在职认证  发表于 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。

使用道具

Chemist_MZ 发表于 2015-7-15 07:56
你的边界条件没选对,对于up in 的call你的边界条件应该是

股价是零的时候为0:v(0,t)=0, 0
谢谢您的答复,我想了很久,可是我还是有点不清楚的地方可以请您继续讲解下吗?
  
  1, 我按照您的意思做了如下修改:(其中B=Sb/ds,即障碍值所处位置)
         
   ①. 将网格范围改为(0,Smax);
   ②. 将边界条件改为:
        biprice(1:B,end)=  0;      %到期时刻的S<Sb的期权价值=0
        biprice(B+1:end,end)=  max( svec(B+1:end)-K ,0);    %到期时刻S≥Sb,即期权敲入后的期权到期时的价值
        biprice(1,:) = 0; %S=0时的期权价格
        biprice(end,:) = (svec(end)-K )*exp(-r*tvec(end:-1:1));   %期权价格为Smax的时候
  
  运算出来终于不是NAN了,可是离正确答案还差一点距离,请问这样哪里错了呢?
修改后的代码为:
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/dS);
ds=(Smax)/M;
B=Sb/ds;
N=round(T/dT);
dt=T/N;
svec=linspace(0,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(1:B,end)=  0; %到期时刻的S<Sb的期权价值=0
biprice(B+1:end,end)=  max( svec(B+1:end)-K ,0); %到期时刻S≥Sb,即期权敲入时的期权价值
biprice(1,:) = 0; %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)




  2.还有一个问题:因为我当时看书的时候说向下敲出的范围也是(sb, smax),这样的话svec也没有包括s0,但是为什么这个算出来就是对的呢? 是因为敲入和敲出有什么区别吗?
      
  因为我不是这个专业的学生,自己也是摸索着学习。可能问题比较繁琐哈~~ 麻烦了!! 谢谢!!!

使用道具

8
Chemist_MZ 在职认证  发表于 2015-7-18 07:44:50 |只看作者 |坛友微信交流群
想当一个白馒头 发表于 2015-7-17 18:07
谢谢您的答复,我想了很久,可是我还是有点不清楚的地方可以请您继续讲解下吗?
  
  1, 我按照您的意 ...
  1. clc;
  2. clear;
  3. S0 = 145;
  4. Sb=160;
  5. K = 145;
  6. r = 0.06;
  7. T = 0.5;
  8. sigma = 0.295;
  9. Smax = 160; %<-
  10. otype='CALL';
  11. dS=2;
  12. dT=5/10000;

  13. %建立网格
  14. M=round(Smax/dS);
  15. ds=(Smax)/M;
  16. B=Sb/ds;
  17. N=round(T/dT);
  18. dt=T/N;
  19. svec=linspace(0,Smax,M+1)';
  20. tvec=linspace(0,T,N+1);
  21. i=svec/ds;

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


  27. %初始化矩阵
  28. biprice=nan(M+1,N+1);

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

  32. a1=alpha(2);%<-
  33. cM_1=gamma(end-1); %<-


  34. %边界条件
  35. biprice(1:end-1,end)=  0; %t=T,except barrier
  36. biprice(1,:) = 0; %S=0时的期权价格
  37. biprice(end,:)=  blsprice(svec(end),K,r,tvec(end:-1:1),sigma);  %option price at barrier  <-

  38. %计算矩阵
  39. for q=N:-1:1
  40.    
  41.       b1=zeros(M-1,1);%<-
  42.       b2=zeros(M-1,1);%<-
  43.       
  44.       b1(1)=biprice(1,q+1)*a1;%<-
  45.       b1(end)=biprice(end,q+1)*cM_1;%<-
  46.       
  47.       b2(1)=biprice(1,q)*a1;%<-
  48.       b2(end)=biprice(end,q)*cM_1;%<-
  49.       
  50.       biprice(2:end-1,q) = M1\(M2*biprice(2:end-1,q+1)+b1+b2);%排除已知的边界条件的情况 %<-
  51. end

  52. oprice1=interp1(svec,biprice(:,1),S0)
复制代码
1. 我改得地方用<-标注了,两个问题
1) 你的CN方法的原始code就不对,在每一步rolling back的时候根本没有考虑boundary condition。你可能参考的书是Numerical methods in Finance a matlab based approch. 那本书里这里就是错的。
2) up and in 的call,S的范围应该选取在0-barrier, 你选了0-200。 并且在barrier地方的边界条件是Black Scholes price不是简单地payoff折现。(以为碰到之后就是一个普通的call option)
改了之后(其他参数不变)我得到的price是13.9640

2. price barrier option的时候肯定得假设你的option在之前没有被knock过。(sb, smax)向下know out的期权,当然初始股价在(sb, smax)范围里面,否则就已经被knock out了。你的初始股价一定在不被knock 的区间里。如果barrier一样,向下敲出和向下敲入是对应的,向上敲出和向上敲入也是对应的,但是上下之间没有对应关系,他们本来就是矛盾的,同一个barrier,同一个股价是不可能同时存在上下两种期权的,比如我是向上,那我一定在barrier下方,就无所谓向下之说。
扫头像关注公众号“二点三西格玛”衍生品定价与风险管理

使用道具

Chemist_MZ 发表于 2015-7-18 07:44
1. 我改得地方用
谢谢大神!!!!问题已解决!!!

使用道具

10
QIANQIANXUNMENG 发表于 2016-4-12 09:49:57 |只看作者 |坛友微信交流群
想当一个白馒头 发表于 2015-7-14 11:06
原有的代码为:
clear
S0 = 50;
大神,自由边界的期权问题代码怎么写啊?

使用道具

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注jr
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-4-24 07:41