无法弄清R中的Reduce和Monte Carlo Simulations,计算VaR

时间:2016-11-17 14:55:16

标签: r montecarlo computational-finance

为标题道歉。我想不出怎么称呼这个......

(另外,我知道这可能是个问题,但希望有人可以提供帮助。)

我有以下均值向量和协方差矩阵:

> mu0
       MSFT        AAPL 
0.001250251 0.001060690 
> sig0
             MSFT         AAPL
MSFT 1.275625e-04 3.334225e-05
AAPL 3.334225e-05 1.484212e-04

我有以下代码块(我知道它只有500个模拟。这是为了简洁起见。当我弄清楚代码时,我会提升它。):

wta = 0.562546911; wtm = 0.437453089; ct = -1000000*c(wtm,wta); lambda = .97; k = 20; 
M = 500; L1 = 0.0; l1 = rep(0,M); 
mu1 = mu0; sig1 = sig0; L1=0.0;
rando = rmvnorm(M, mu1, sig1)
for(i in 1:M){ 
  Xtd = t(rando[i,])
  mu1 = lambda*mu1+(1-lambda)*Xtd
  sig1 = lambda*sig0+(1-lambda)*t(Xtd)%*%Xtd; L1 = L1+t(ct)%*%t(Xtd)
  L1=L1+t(ct)%*%t(Xtd)
  for(j in 2:k){ 
    Xtd=rmvnorm(1,mu1, sig1)
    mu1=lambda*mu1+(1-lambda)*Xtd
    sig1=lambda*sig0+(1-lambda)*t(Xtd)%*%Xtd
    L1=L1+t(ct)%*%t(Xtd)
  } 
  l1[i]=L1
}

我讨厌这段代码。这很慢,也许更重要的是,非常难看。我认为使用Reduce或do.call或其他东西进行某种优化是成熟的。但我无法弄清楚如何为Reduce函数编写函数。说实话,我并不完全了解Reduce。我一直试图通读this,但努力在这里应用它。

问题似乎是我有几个必须积累的价值。通过随机数字的拉动,所以它就像我的' x' for Reduce是一个列表而不是一个向量,这似乎没有意义。我试着写这样的东西:

runStuff <- function(thePrev, theNext, theLam, theCT, theSig){
  Xtd=rmvnorm(1, thePrev[1], thePrev[2])
  theNext[3]=thePrev[3]+t(theCT)%*%t(Xtd)
  theNext[1]=theLam*thePrev[1]+(1-theLam)*Xtd
  theNext[2]=theLam*theSig+(1-lambda)*t(Xtd)%*%Xtd
  theNext
}

并且像这样使用它(我完全期望它不起作用),并且它不起作用:

Reduce(x=list(mu1, sig1, L1), f=runStuff, 
       theLam = lambda, theCT = ct, theSig = sig0, accumulate=TRUE)

有关如何在此方案中使用功能的任何帮助?

0 个答案:

没有答案