楼主: WenshanQi07
8793 37

[学科前沿] 【求助】欧式期权定价之隐式有限差分法-为什么matlab做出的图那么诡异呀? [分享]

  • 0关注
  • 0粉丝

大专生

58%

还不是VIP/贵宾

-

威望
0
论坛币
10 个
通用积分
0
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
440 点
帖子
52
精华
0
在线时间
32 小时
注册时间
2011-3-11
最后登录
2012-8-2

WenshanQi07 发表于 2012-7-29 22:25:47 |显示全部楼层
论文研究的是用有限差分法进行欧式期权定价
我已利用matlab    分别作出 显式、隐式 和Crank-Nicolson 的欧式看涨期权的图像   
显式和CN的图像都是一条随着股价的增加而期权价值逐渐增加的平滑的曲线
可是为什么隐式的图像那么诡异呢 是一条先增再降的曲线
请问这个隐式的图像合理吗 为什么会出现这样的情况呢
谢谢
关键词:MATLAB 有限差分法 matla atlab 期权定价 matlab 价值 论文

欧式看涨期权价格与股价-CN.jpg

欧式看涨期权-CN

欧式看涨期权-CN
欧式看涨期权价格与股价-显式.jpg

回帖推荐

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

帮你修改好了,这回应该没问题了。你那个程序有问题,写得乱七八糟的。或者直接粘来的可能作者没有把输入和使用的注意事项弄清楚。看明白花了好久,还不如自己写一个呢。以后还是尽量自己写吧,粘现成的真的不放心。 我改成脚本文件了,你可以自己改成函数文件。 hope helpful~

本帖被以下文库推荐

stata SPSS
xuruilong100 发表于 2012-7-29 23:29:24 |显示全部楼层
把程序贴出来
回复

使用道具 举报

Chemist_MZ 在职认证  发表于 2012-7-30 00:03:38 |显示全部楼层
楼主应该是程序写得有问题
扫头像关注公众号“二点三西格玛”衍生品定价与风险管理
回复

使用道具 举报

WenshanQi07 发表于 2012-7-30 06:20:23 |显示全部楼层
xuruilong100 发表于 2012-7-29 23:29
把程序贴出来
matlab程序还是之前的那个 如下
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);


画图的程序 如下
>> sptprice = zeros(100,1);
optprice = zeros(100,1);
for(i = 1:100)
     sptprice(i,1) = i;
     optprice(i,1) = finDiffImplicit(50,sptprice(i,1),0.05,0.3,0:1:100,0:0.001:1,'CALL');
end
plot(sptprice,optprice,'-')
grid on
回复

使用道具 举报

WenshanQi07 发表于 2012-7-30 06:22:44 |显示全部楼层
Chemist_MZ 发表于 2012-7-30 00:03
楼主应该是程序写得有问题
请问该如何修改我的程序呢?为什么隐式的看跌期权的图像是对的 但看涨期权的图像就那么诡异呢?
回复

使用道具 举报

WenshanQi07 发表于 2012-7-30 06:24:36 |显示全部楼层
xuruilong100 发表于 2012-7-29 23:29
把程序贴出来
很奇怪 为什么隐式看跌期权的图像是正常的 偏偏就只有隐式看涨期权的图像不正常呢?
回复

使用道具 举报

Chemist_MZ 在职认证  发表于 2012-7-30 07:19:27 |显示全部楼层
WenshanQi07 发表于 2012-7-30 06:22
请问该如何修改我的程序呢?为什么隐式的看跌期权的图像是对的 但看涨期权的图像就那么诡异呢?
ok,我帮你看看
扫头像关注公众号“二点三西格玛”衍生品定价与风险管理
回复

使用道具 举报

Chemist_MZ 在职认证  发表于 2012-7-30 09:24:24 |显示全部楼层
WenshanQi07 发表于 2012-7-30 06:24
很奇怪 为什么隐式看跌期权的图像是正常的 偏偏就只有隐式看涨期权的图像不正常呢?
帮你修改好了,这回应该没问题了。你那个程序有问题,写得乱七八糟的。或者直接粘来的可能作者没有把输入和使用的注意事项弄清楚。看明白花了好久,还不如自己写一个呢。以后还是尽量自己写吧,粘现成的真的不放心。
我改成脚本文件了,你可以自己改成函数文件。 IM.m.zip (1.16 KB)


hope helpful~
已有 4 人评分经验 论坛币 学术水平 热心指数 信用等级 收起 理由
dawnsense + 5 + 1 + 1 + 1 精彩帖子
h2h2 + 10 + 10 + 10 精彩帖子
见路不走 + 5 + 5 热心帮助其他会员
WenshanQi07 + 1 + 1 + 1 热心帮助其他会员

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

扫头像关注公众号“二点三西格玛”衍生品定价与风险管理
回复

使用道具 举报

Chemist_MZ 在职认证  发表于 2012-7-30 09:29:59 |显示全部楼层
具体的错误,其实他solve at each node 的那个part和put的边界条件都有点问题,只是这两个问题正好抵消了(通俗的说),put弄出来就对了,call就错了。
扫头像关注公众号“二点三西格玛”衍生品定价与风险管理
回复

使用道具 举报

xuruilong100 发表于 2012-7-30 10:10:13 |显示全部楼层
sptprice = zeros(100,1);
optprice = zeros(100,1);
for(i = 1:100)
     sptprice(i,1) = i;
     optprice(i,1) = finDiffImplicit(50,sptprice(i,1),0.05,0.3,0:1:100,0:0.001:1,'CALL');
end
plot(sptprice,optprice,'-')
grid on

lz没搞明白FDM的原理,stock价格1到100,网格上界还是100,这是不可以的。
正确的做法是设网格上界S_max,使得(0,S_max)以非常大的概率覆盖住stock,
把上界定到300试试
已有 1 人评分学术水平 热心指数 信用等级 收起 理由
WenshanQi07 + 1 + 1 + 1 热心帮助其他会员

总评分: 学术水平 + 1  热心指数 + 1  信用等级 + 1   查看全部评分

回复

使用道具 举报

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

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

GMT+8, 2020-6-5 14:16