7752 21

# [学科前沿] 【求助】matlab程序-欧式期权定价之显式/隐式有限差分法 [分享]

• 0关注
• 0粉丝

58%

-

0

10 个

0

0 点

0 点

0 点

440 点

52

0

32 小时

2011-3-11

2012-8-2

WenshanQi07 发表于 2012-7-17 04:38:00 |显示全部楼层
 论文研究的是用显式和隐式有限差分法研究欧式期权定价 需要用到matlab 可是本人matlab无能 于是在网上找到了已经编写好的代码 但问题是 我把代码复制到matlab的m.file里 然后点击运行 可是出来的结果 总是显示有error啊 怎样改才能顺利运行呢？同时 也想问一下 代码的第43行 price(1:M+1,1:N+1)=nan 是什么意思呀？ 哪位好心的牛人能帮帮我呀 跪谢！！！ 显式代码如下 function oPrice = finDiffExplicit(X,S0,r,sig,Svec,tvec,oType) % Function to calculate the price of a vanilla European % Put or Call option using the explicit finite difference method % % oPrice = finDiffExplicit(X,r,sig,Svec,tvec,oType) % % Inputs: X - strike %       : S0 - stock price %       : r - risk free interest rate %       : sig - volatility %       : Svec - Vector of stock prices (i.e. grid points) %       : tvec - Vector of times (i.e. grid points) %       : oType - must be 'PUT' or 'CALL'. % % Output: oPrice - the option price % % Notes: This code focuses on details of the implementation of the %        explicit finite difference scheme. %        It does not contain any programatic essentials such as error %        checking. %        It does not allow for optional/default input arguments. %        It is not optimized for memory efficiency, speed or %        use of sparse matrces. % Author: Phil Goddard (phil@goddardconsulting.ca) % Date  : Q4, 2007 % Get the number of grid points M = length(Svec)-1; N = length(tvec)-1; % Get the grid sizes (assuming equi-spaced points) dt = tvec(2)-tvec(1); % Calculate the coefficients % To do this we need a vector of j points j = 1:M-1; sig2 = sig*sig; j2 = j.*j; aj = 0.5*dt*(sig2*j2-r*j); bj = 1-dt*(sig2*j2+r); cj = 0.5*dt*(sig2*j2+r*j); % Pre-allocate the output price(1:M+1,1:N+1) = nan; % Specify the boundary conditions switch oType     case 'CALL'         % Specify the expiry time boundary condition         price(:,end) = max(Svec-X,0);         % Put in the minimum and maximum price boundary conditions         % assuming that the largest value in the Svec is         % chosen so that the following is true for all time         price(1,:) = 0;         price(end,:) = (Svec(end)-X)*exp(-r*tvec(end:-1:1));     case 'PUT'         % Specify the expiry time boundary condition         price(:,end) = max(X-Svec,0);         % Put in the minimum and maximum price boundary conditions         % assuming that the largest value in the Svec is         % chosen so that the following is true for all time         price(1,:) = (X-Svec(end))*exp(-r*tvec(end:-1:1));         price(end,:) = 0; end % Form the tridiagonal matrix A = diag(bj);  % Diagonal terms A(2:M:end) = aj(2:end); % terms below the diagonal A(M:M:end) = cj(1:end-1); % terms above the diagonal % Calculate the price at all interior nodes offsetConstants = [aj(1); cj(end)]; for i = N:-1:1     price(2:end-1,i) = A*price(2:end-1,i+1);     % Offset the first and last terms     price([2 end-1],i) = price([2 end-1],i) + ...         offsetConstants.*price([1 end],i+1); end % Calculate the option price oPrice = interp1(Svec,price(:,1),S0); 运行结果如下： ??? Input argument "Svec" is undefined. Error in ==> finDiffExplicit at 29 M = length(Svec)-1; 隐式代码如下： function oPrice = finDiffImplicit(X,S0,r,sig,Svec,tvec,oType) % Function to calculate the price of a vanilla European % Put or Call option using the implicit finite difference method % % oPrice = finDiffImplicit(X,r,sig,Svec,tvec,oType) % % Inputs: X - strike %       : S0 - stock price %       : r - risk free interest rate %       : sig - volatility %       : Svec - Vector of stock prices (i.e. grid points) %       : tvec - Vector of times (i.e. grid points) %       : oType - must be 'PUT' or 'CALL'. % % Output: oPrice - the option price % % Notes: This code focuses on details of the implementation of the %        implicit finite difference scheme. %        It does not contain any programatic essentials such as error %        checking. %        It does not allow for optional/default input arguments. %        It is not optimized for memory efficiency, speed or %        use of sparse matrces. % Author: Phil Goddard (phil@goddardconsulting.ca) % Date  : Q4, 2007 % Get the number of grid points M = length(Svec)-1; N = length(tvec)-1; % Get the grid sizes (assuming equi-spaced points) dt = tvec(2)-tvec(1); % Calculate the coefficients % To do this we need a vector of j points j = 0:M; sig2 = sig*sig; aj = (dt*j/2).*(r - sig2*j); bj = 1 + dt*(sig2*(j.^2) + r); cj = -(dt*j/2).*(r + sig2*j); % Pre-allocate the output price(1:M+1,1:N+1) = nan; % Specify the boundary conditions switch oType     case 'CALL'         % Specify the expiry time boundary condition         price(:,end) = max(Svec-X,0);         % Put in the minimum and maximum price boundary conditions         % assuming that the largest value in the Svec is         % chosen so that the following is true for all time         price(1,:) = 0;         price(end,:) = (Svec(end)-X)*exp(-r*tvec(end:-1:1));     case 'PUT'         % Specify the expiry time boundary condition         price(:,end) = max(X-Svec,0);         % Put in the minimum and maximum price boundary conditions         % assuming that the largest value in the Svec is         % chosen so that the following is true for all time         price(1,:) = (X-Svec(end))*exp(-r*tvec(end:-1:1));         price(end,:) = 0; end % Form the tridiagonal matrix B = diag(aj(3:M),-1) + diag(bj(2:M)) + diag(cj(2:M-1),1); [L,U] = lu(B); % Solve at each node offset = zeros(size(B,2),1); for idx = N:-1:1     offset(1) = aj(2)*price(1,idx);     % offset(end) = c(end)*price(end,idx); % This will always be zero     price(2:M,idx) = U\(L\(price(2:M,idx+1) - offset)); end % Calculate the option price oPrice = interp1(Svec,price(:,1),S0); 隐式运行结果如下： ??? Input argument "Svec" is undefined. Error in ==> finDiffImplicit at 29 M = length(Svec)-1; .custom_tag{background:none; padding-left:0;} .custom_tag a{text-decoration:none; margin-right:7px; display:inline-block;} .custom_tag a:hover{text-decoration:underline;} .custom_tag i{display: none;width: 60px;}

### 回帖推荐

xuruilong100 发表于6楼

FDM建立在一个股票价格和时间构成的矩形网格上， Svec和tvec就是要求使用者输入该网格的“节点”， 例如Svec=0:0.01:50,意思是股票价格从0到50，间隔0.01 1.楼主要将隐式方法和显式方法的代码，分别拷贝到一个“新建的M文件”中， 2.保存，将此文件名设定为“函数名”如“finDiffImplicit”， 3.此就产生了一个“函数文件”。 4.于外部调用即可函数 例子： finDiffImplicit(29.0,30.0,0.05,0.25,0:0.05:150,0:0.01:0.33,'C ...

### 本帖被以下文库推荐

bobojin 发表于 2012-7-17 04:39:41 |显示全部楼层
 nan一般用于初始化数据，没什么特别的含义

bobojin 发表于 2012-7-17 04:42:58 |显示全部楼层
 另外 错误是因为你的输入参数不完整。

WenshanQi07 发表于 2012-7-17 05:06:23 |显示全部楼层
 bobojin 发表于 2012-7-17 04:42 另外 错误是因为你的输入参数不完整。请问 输入参数指的是？哪里不完整呢？怎样改才可以呢？谢谢！

Chemist_MZ   发表于 2012-7-17 07:59:35 |显示全部楼层
 楼主的代码好混乱，这个代码有点累赘了，不够精简，那个NaN只是初始化数据的一个方法，初始化可以是NaN，0，或者你要的任何数。 同意楼上，楼主应该是没有输入那个stock向量。

xuruilong100 发表于 2012-7-17 11:16:00 |显示全部楼层
 FDM建立在一个股票价格和时间构成的矩形网格上， Svec和tvec就是要求使用者输入该网格的“节点”， 例如Svec=0:0.01:50,意思是股票价格从0到50，间隔0.01 1.楼主要将隐式方法和显式方法的代码，分别拷贝到一个“新建的M文件”中， 2.保存，将此文件名设定为“函数名”如“finDiffImplicit”， 3.此就产生了一个“函数文件”。 4.于外部调用即可函数 例子： finDiffImplicit(29.0,30.0,0.05,0.25,0:0.05:150,0:0.01:0.33,'CALL') ans =     2.5082

xuruilong100 发表于 2012-7-17 11:17:47 |显示全部楼层
 让使用者自己设定“网格”，这个函数不够智能

WenshanQi07 发表于 2012-7-17 21:04:54 |显示全部楼层
 xuruilong100 发表于 2012-7-17 11:16 FDM建立在一个股票价格和时间构成的矩形网格上， Svec和tvec就是要求使用者输入该网格的“节点”， 例如S ...谢谢！ 我已经将显式和隐式的代码分别copy到m文件里了 也保存和命名了 但是当我在外部调用的时候 还是出现问题了呀 如下所示 >> finDiffExplicit(29.0,30.0,0.05,0.25,0:0.05:150,0:0.01:0.33,'call') Warning: NaN found in Y, interpolation at undefined values          will result in undefined values. > In interp1 at 179   In finDiffExplicit at 81 ans =    NaN >> finDiffImplicit(29.0,30.0,0.05,0.25,0:0.05:150,0:0.01:0.33,'call') Warning: NaN found in Y, interpolation at undefined values          will result in undefined values. > In interp1 at 179   In finDiffImplicit at 78 ans =    NaN 另外 是不是如果代码成功的话 matlab除了能给出价格（例如 2.5082） 还能作出图像呢？如果这个代码不能作出图像 能麻烦你帮我编个代码把图像做出来吗？ 本人实在是matlab无能啊 如果能成功帮我搞定论文里有关matlab的部分 我愿意支付酬劳以作答谢 万分感谢！

WenshanQi07 发表于 2012-7-17 21:08:08 |显示全部楼层
 xuruilong100 发表于 2012-7-17 11:17 让使用者自己设定“网格”，这个函数不够智能我自己不会编代码 这是我在网上找到的 如果你会编更智能的 那就更好了

WenshanQi07 发表于 2012-7-17 21:10:18 |显示全部楼层
 Chemist_MZ 发表于 2012-7-17 07:59 楼主的代码好混乱，这个代码有点累赘了，不够精简，那个NaN只是初始化数据的一个方法，初始化可以是NaN，0， ...谢谢！ 本人matlab无能啊 可不可以麻烦你说得详细一点儿呢 怎样输入那个stock向量呢？

 您需要登录后才可以回帖 登录 | 我要注册 回帖后跳转到最后一页