楼主: WenshanQi07
7752 21

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

  • 0关注
  • 0粉丝

大专生

58%

还不是VIP/贵宾

-

威望
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;
关键词:MATLAB程序 MATLAB 有限差分法 matla atlab function matlab option error price

回帖推荐

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 ...

本帖被以下文库推荐

stata SPSS
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
已有 1 人评分经验 论坛币 收起 理由
见路不走 + 5 + 5 热心帮助其他会员

总评分: 经验 + 5  论坛币 + 5   查看全部评分

回复

使用道具 举报

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向量呢?
回复

使用道具 举报

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

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

GMT+8, 2020-6-4 03:19