加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

期权有限差分方法定价(一)之显式差分,SAS/IML初步

(2009-10-07 16:51:47)
标签:

杂谈

分类: 金融工程计算

由BSM公式得到的期权定价公式为

                 期权有限差分方法定价(一)之显式差分,SAS/IML初步

这是偏微分方程里的抛物线方程,显式差分的方程为:期权有限差分方法定价(一)之显式差分,SAS/IML初步

移项可以进一步得到:

                期权有限差分方法定价(一)之显式差分,SAS/IML初步   j=N-1,…1,0;i=1,2…,M-1.(2)

利用期权有限差分方法定价(一)之显式差分,SAS/IML初步

可以得到

                      期权有限差分方法定价(一)之显式差分,SAS/IML初步

其中A是由(2)式中的a,b,c构成的矩阵。由上式可以看到显性差分定价与二叉树基本相同,都是可以从最后时刻往前推算到现在的零时刻,得到期权的值。

显性差分存在数值解的稳定性问题,只有当A矩阵的特征值的模都小于1时,数值解才是稳定的,所以对与网格点的步长选择有要求。

边界条件设定,这里不说了。

下面是SAS iml做的有限差分欧式看跌期权。看涨期权就是改变一下边界条件就可以了。

 

proc IML;
*--------S0资产现在的价格;Smax表示比较大价格的S,期间T内资产价格很难达到-------------,
 ---------VetorS表示资产S的离散值向量--------------------------;

start EuroPUTExpl(S0,K,r,T,SIGMA,Smax,M,N);
dS=Smax/M;
dt=T/N;
FDMvalue=j(M+1,N+1,0);                        *初始化期权价格在各个网格点的值;
VetorS=T(do(0,Smax,dS));
Sindex=0:M;
Timeindex=0:N;

*-------设置边界条件------;
FDMvalue[,N+1]=(K-VetorS)#((K-VetorS)>0);
FDMvalue[1,]=K#EXP(-r#dt#(N-Timeindex));
FDMvalue[M+1,]=0;

*-------设置系数---------;
a=0.5#dt#(sigma##2#Sindex-r)#Sindex;
b=1-dt#(sigma##2#Sindex##2+r);
c=0.5#dt#(sigma##2#Sindex+r)#Sindex;

*-------从到期日由后向前推算-------;
 do j=N to 1 by -1;
   do i=2 to M;
      FDMvalue[i,j]=a[i]#FDMvalue[i-1,j+1]+b[i]#FDMvalue[i,j+1]+c[i]#FDMvalue[i+1,j+1];
   end;
 end;

 

*-----以下创建一个数据集FDMGRAPH,它包含一个变量FDMvalue,值来自于矩阵FDMvalue,目的用于下面调用宏画图---;
 CREATE FDMGRAPH VAR{FDMvalue};
 APPEND ;
 CLOSE FDMGRAPH;

*-------因为S0不一定在VetcorS中,这里采取把SO近似到最接近它的--------
  -------属于VetorS中的S,也可以采取插值的形式求得S0对应的价格----------;

 priceindex=S0/dS;
 priceindex=round(priceindex);
 PRICE=FDMvalue[priceindex+1,1];
 return(PRICE);


finish;

 

PRICE=EUROPUTExpl(50,50,0.1,5/12,0.3,100,50,100);
print price;

            得到的值为:2.8288

可以看到用下面的语句,期权值出现了不收敛。股价步长定得过于小。

PRICE=EUROPUTExpl(50,50,0.1,5/12,0.3,100,100,100);   
print price;

           得到的值为:-2.827E+22

 

每运行一次EUROPUTExpl创建的数据集FDMgraph都做了改变,所以要运行下面的宏,要运行产生正确的期权价格而产生数据集FDMgraph。

 

为了画该有限差分方法得到的格点三维图,先定义一个宏DRAW.

%macro Draw(Smax,T,M,N);   

data test; 
  do i=0 TO &Smax BY %sysf(&Smax/&M);   
    do  J=0 TO &T BY %sysf(&T/&N);
        S=i;
     TIME=j;
     output;
    end;
 end;
 drop i j;
 run;
 data FDM;
   merge test fdmgraph;
  run;
goptions reset=global gunit=pct border cback=white
         colors=(black blue green red)
         ftext=swiss ftitle=swissb htitle=6 htext=4;

title " Explicit FDM  "; 
proc g3d data=FDM;
 plot S*TIME=FDMvalue /  yticknum=9 xytype=1;
                 
run;
%mend;

 

最后提交下面语句:

%draw (100,5/12,50,100);

 

下面是产生的图象,可以看到在股价为100时,该看跌期权价格为0,高于63以上的都几乎为0,期权的最高价去到股价为0时的50,即执行价格,这两个都是边界条件。

 

  期权有限差分方法定价(一)之显式差分,SAS/IML初步

 

 关于数值计算在金融中的运用的书可以参考《Numerical methods in finance and economics》这是一本用matlab解决衍生品定价的好书(蒙特卡罗方法,有限差分,以及二叉树),《Finite difference methods in financial engineering》是用c++写的,关于EXCELvba的可以看《基于Excel VBA 的高级金融建模》。关于本文以及接下来的几篇的提到定价公式推导可以看孙健写《金融衍生品定价模型-数理金融引论》,Steven E.Shreve的金融工程圣经《随机金融分析》。

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有