从for循环内的变量创建表

时间:2018-04-22 17:33:22

标签: matlab for-loop

我正在写一个for循环来计算四个不同变量的值。第一个变量是M. M从10 ^ 2增加到10 ^ 5,

M = [10^2,10^3,10^4,10^5];

表中所需的其他三个变量显示在下面的代码中。

confmc
confcv
confmcSize/confcvSize

我首先创建一个for循环来迭代M的四个不同值。然后在for循环之外创建表。

如何调整实现以使表格显示M的所有四个值?

randn('state',100)

%%%%%% Problem and method parameters %%%%%%%%%
S = 5; E = 6; sigma = 0.3; r = 0.05; T = 1;
Dt = 1e-2; N = T/Dt; M = [10^2,10^3,10^4,10^5];
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

for k=1:numel(M)
    %%%%%%%%% Geom Asian exact mean  %%%%%%%%%%%%
    sigsqT= sigma^2*T*(N+1)*(2*N+1)/(6*N*N);
    muT = 0.5*sigsqT + (r - 0.5*sigma^2)*T*(N+1)/(2*N);

    d1 = (log(S/E) + (muT + 0.5*sigsqT))/(sqrt(sigsqT));
    d2 = d1 - sqrt(sigsqT);

    N1 = 0.5*(1+erf(d1/sqrt(2)));
    N2 = 0.5*(1+erf(d2/sqrt(2)));

    geo =  exp(-r*T)*( S*exp(muT)*N1 - E*N2 );
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

    Spath = S*cumprod(exp((r-0.5*sigma^2)*Dt+sigma*sqrt(Dt)*randn(M(k),N)),2);

    % Standard Monte Carlo
    arithave = mean(Spath,2);
    Parith = exp(-r*T)*max(arithave-E,0);  % payoffs 
    Pmean = mean(Parith);
    Pstd = std(Parith);
    confmc = [Pmean-1.96*Pstd/sqrt(M(k)), Pmean+1.96*Pstd/sqrt(M(k))];
    confmcSize = [(Pmean+1.96*Pstd/sqrt(M(k)))-(Pmean-1.96*Pstd/sqrt(M(k)))];

    % Control Variate
    geoave = exp((1/N)*sum(log(Spath),2));
    Pgeo = exp(-r*T)*max(geoave-E,0);      % geo payoffs 
    Z = Parith + geo - Pgeo;               % control variate version
    Zmean = mean(Z);
    Zstd = std(Z);
    confcv = [Zmean-1.96*Zstd/sqrt(M(k)), Zmean+1.96*Zstd/sqrt(M(k))];
    confcvSize = [(Zmean+1.96*Zstd/sqrt(M(k)))-(Zmean-1.96*Zstd/sqrt(M(k)))]; 
end

T = table(M,confmc,confcv,confmcSize/confcvSize)

当前代码返回

T =

  1×4 table

      M             confmc                  confcv            Var4 
    _____    ____________________    ____________________    ______

    1e+05    0.096756      0.1007    0.097306    0.097789    8.1622

如何更改我的实现以便计算M的所有四个值?

1 个答案:

答案 0 :(得分:1)

我刚修改了一些东西。看看下面的代码。

randn('state',100)

%%%%%% Problem and method parameters %%%%%%%%%
S = 5; E = 6; sigma = 0.3; r = 0.05; T = 1;
Dt = 1e-2; N = T/Dt; M = [10^2,10^3,10^4,10^5];
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
confmc = zeros(numel(M), 2);
confcv = zeros(numel(M), 2);
confmcSize =  zeros(numel(M), 1);
confcvSize = zeros(numel(M), 1);
for k=1:numel(M)
    %%%%%%%%% Geom Asian exact mean  %%%%%%%%%%%%
    sigsqT= sigma^2*T*(N+1)*(2*N+1)/(6*N*N);
    muT = 0.5*sigsqT + (r - 0.5*sigma^2)*T*(N+1)/(2*N);

    d1 = (log(S/E) + (muT + 0.5*sigsqT))/(sqrt(sigsqT));
    d2 = d1 - sqrt(sigsqT);

    N1 = 0.5*(1+erf(d1/sqrt(2)));
    N2 = 0.5*(1+erf(d2/sqrt(2)));

    geo =  exp(-r*T)*( S*exp(muT)*N1 - E*N2 );
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

    Spath = S*cumprod(exp((r-0.5*sigma^2)*Dt+sigma*sqrt(Dt)*randn(M(k),N)),2);

    % Standard Monte Carlo
    arithave = mean(Spath,2);
    Parith = exp(-r*T)*max(arithave-E,0);  % payoffs 
    Pmean = mean(Parith);
    Pstd = std(Parith);
    confmc(k,:) = [Pmean-1.96*Pstd/sqrt(M(k)), Pmean+1.96*Pstd/sqrt(M(k))];
    confmcSize(k,1) = [(Pmean+1.96*Pstd/sqrt(M(k)))-(Pmean-1.96*Pstd/sqrt(M(k)))];

    % Control Variate
    geoave = exp((1/N)*sum(log(Spath),2));
    Pgeo = exp(-r*T)*max(geoave-E,0);      % geo payoffs 
    Z = Parith + geo - Pgeo;               % control variate version
    Zmean = mean(Z);
    Zstd = std(Z);
    confcv(k,:) = [Zmean-1.96*Zstd/sqrt(M(k)), Zmean+1.96*Zstd/sqrt(M(k))];
    confcvSize(k,1) = [(Zmean+1.96*Zstd/sqrt(M(k)))-(Zmean-1.96*Zstd/sqrt(M(k)))]; 
end

T = table(M',confmc,confcv,confmcSize./confcvSize)

简而言之,我只使用矩阵而不是矢量或标量作为表的成员。在你的代码中,变量(confmc,confcv,confmcSize,confcvSize)被覆盖了。