在Matlab中绘制置信区间

问题描述 投票:1回答:2

我无法通过Matlab中的errorbar函数绘制置信区间。我在下面写了下面的代码

clear all;
close all;
%CH15      Program for Chapter 15
%
%   Monte Carlo for a European call

randn('state',100)

%%%%%%%%%%%%%%%%% Problem and method parameters %%%%%%%%%%%%%%%
S = 10; E = 9; sigma = 0.1; r = 0.06; T = 1; 
Dt = 1e-3; N = T/Dt; M = 1e4;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

hold on;
for M = [2^5,2^6,2^7,2^8,2^9,2^10,2^11,2^12,2^13,2^14,2^15,2^16,2^17]
    V = zeros(M,1);
    for i = 1:M
        Sfinal = S*exp((r-0.5*sigma^2)*T+sigma*sqrt(T)*randn);
        V(i) = exp(-r*T)*max(Sfinal-E,0);
    end
    aM = mean(V); bM = std(V);
    conf = [aM - 1.96*bM/sqrt(M), aM + 1.96*bM/sqrt(M)]
    %xlabel('Samples') % x-axis label
    title('Monte Carlo Approximations')
    ylabel('Option value approximation') % y-axis label
    set(gca, 'YScale', 'log')
    set(gca, 'XScale', 'log')
    yticks([10^0.1 10^0.2 10^0.3])
    axis([10^1 10^6 10^0.1 10^0.3])
    yticklabels({'10^{0.1}','10^{0.2}','10^{0.3}'})
    plot(M,aM,'x')
    plot(M,ch08(10,9,0.06,0.1,1),'--.k')
    err = ones*(size(conf));
    errorbar(aM,conf(1),conf(2))
end

为了匹配下面显示的图片(由于某种原因,plot(M,ch08(10,9,0.06,0.1,1),'--')没有显示任何东西,但我忽略了这个美容问题)。

Monte Carlo Implementation

在上面的Matlab代码中,计算置信区间

conf = [aM - 1.96*bM/sqrt(M), aM + 1.96*bM/sqrt(M)]

我目前的实现几乎与上面的图片相符。

enter image description here

我不知道如何在Matlab中绘制置信区间。我查看了Google,发现推荐的方法是通过errorbar函数。

我想我可以补充一下

conf = [aM - 1.96*bM/sqrt(M), aM + 1.96*bM/sqrt(M)]

在误差条函数内部,以绘制第一张图片内显示的垂直置信区间线。这是否可以通过调整来实现

errorbar(aM,conf(1),conf(2))

以某种方式跟踪conf = [aM - 1.96*bM/sqrt(M), aM + 1.96*bM/sqrt(M)]的变化?

我也在我的Matlab代码中引用了第二个脚本,

function [C, Cdelta, P, Pdelta] = ch08(S,E,r,sigma,tau)
% Program for Chapter 8
% This is a MATLAB function
%
% Input arguments: S = asset price at time t
%                  E = Exercise price
%                  r = interest rate
%                  sigma = volatility
%                  tau = time to expiry (T-t) 
%
% Output arguments: C = call value, Cdelta = delta value of call 
%                   P = Put value, Pdelta = delta value of put
%
%   function [C, Cdelta, P, Pdelta] = ch08(S,E,r,sigma,tau)

if tau > 0
   d1 = (log(S/E) + (r + 0.5*sigma^2)*(tau))/(sigma*sqrt(tau));
   d2 = d1 - sigma*sqrt(tau);
   N1 = 0.5*(1+erf(d1/sqrt(2)));
   N2 = 0.5*(1+erf(d2/sqrt(2)));
   C = S*N1-E*exp(-r*(tau))*N2;
   Cdelta = N1;
   P = C + E*exp(-r*tau) - S;
   Pdelta = Cdelta - 1;
else 
   C = max(S-E,0);
   Cdelta =  0.5*(sign(S-E) + 1);
   P = max(E-S,0);
   Pdelta = Cdelta - 1;
end
matlab plot intervals
2个回答
3
投票
  • errorbar通常用于此目的,但正如您所知,line(或plot)也可用于绘制置信区间线。我将专注于使用errorbar
  • plot(M,ch08(10,9,0.06,0.1,1),'--.k')不绘制虚线,因为ch08(10,9,0.06,0.1,1)只是一个值。对于要绘制的线,需要有多个y值(等于x值的数量),这些值可以相同(就像您的情况一样)。否则它只是点(在你的代码中发生)。

我在下面的代码中包含了上述和其他一些优化:

randn('state', 100);
S=10;   E=9;   sigma=0.1;   r=0.06;   T=1;   Dt=1e-3;   N=T/Dt; 
M = [2^5,2^6,2^7,2^8,2^9,2^10,2^11,2^12,2^13,2^14,2^15,2^16,2^17];
hold on;
for k=1:numel(M)
    %No need of loop here. Generate all random values in one go 
    Sfinal = S*exp((r-0.5*sigma^2)*T+sigma*sqrt(T)*randn(M(k),1));
    V = exp(-r*T)*max(Sfinal-E,0);
    aM = mean(V);   bM = std(V);

    plot(M(k),aM,'x');
    errorbar(M(k), aM, 1.96*bM/sqrt(M(k)));    
end
chvar = repmat(ch08(10,9,0.06,0.1,1),1,numel(M));  %<----Notice this
plot(M, chvar,'--.k'); 

%Other figure cosmetics
%These commands shouldn't be inside the loop to avoid unnecessary computations
title('Monte Carlo Approximations');
xlabel('Samples'); % x-axis label
ylabel('Option value approximation'); % y-axis label
set(gca,'XScale', 'log','YScale', 'log');
axis([10^1 10^6 10^0.1 10^0.3]);
set(gca,'YTick',[10^0.1 10^0.2 10^0.3]);
set(gca,'YTickLabel',{'10^{0.1}','10^{0.2}','10^{0.3}'});
%Nothing is wrong with using yticks and yticklabels function but those require >=R2016b

结果:

Result with errorbar


0
投票

一种解决方案是通过添加

line([M M], conf);

绘制一条直线垂直线

clear all;
close all;
%CH15      Program for Chapter 15
%
%   Monte Carlo for a European call

randn('state',100)

%%%%%%%%%%%%%%%%% Problem and method parameters %%%%%%%%%%%%%%%
S = 10; E = 9; sigma = 0.1; r = 0.06; T = 1; 
Dt = 1e-3; N = T/Dt; M = 0;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

hold on;
for M = [2^5,2^6,2^7,2^8,2^9,2^10,2^11,2^12,2^13,2^14,2^15,2^16,2^17]
    V = zeros(M,1);
    for i = 1:M
        Sfinal = S*exp((r-0.5*sigma^2)*T+sigma*sqrt(T)*randn);
        V(i) = exp(-r*T)*max(Sfinal-E,0);
    end
    aM = mean(V); bM = std(V);
    conf = [aM - 1.96*bM/sqrt(M), aM + 1.96*bM/sqrt(M)]
    title('Monte Carlo Approximations')
    xlabel('Num samples') % x-axis label
    ylabel('Option value approximation') % y-axis label
    set(gca, 'YScale', 'log')
    set(gca, 'XScale', 'log')
    yticks([10^0.1 10^0.2 10^0.3])
    axis([10^1 10^6 10^0.1 10^0.3])
    yticklabels({'10^{0.1}','10^{0.2}','10^{0.3}'})
    plot(M,aM,'x')
    plot(M,ch08(10,9,0.06,0.1,1),'--.k')
    line([M M], conf);
end

enter image description here

Matlab中似乎存在一个测试错误的错误

plot(M,ch08(10,9,0.06,0.1,1),'--')

没有绘制任何数据。

© www.soinside.com 2019 - 2024. All rights reserved.