3

我想生成一系列收益 x,使得收益的标准差为 0.03 和 1+x = 1 的乘积。总而言之,收益有两个条件:

1)sd(x) == 0.03

2)prod(1+x) == 1

这可能吗?如果可以,我如何在 R 中实现它?

谢谢你。

4

2 回答 2

5

稍微复杂一点的方法是使用对数正态分布的知识:从?dlnorm, Var= exp(2*mu + sigma^2)*(exp(sigma^2) - 1)。我们希望几何平均值等于 1,因此对数刻度上的平均值应该为 0。我们有Var = exp(sigma^2)*(exp(sigma^2)-1),显然无法解析解决这个问题,但我们可以使用uniroot

找到正确的对数方差:

vfun <- function(s2,v=0.03^2) { exp(s2)*(exp(s2)-1)-v }
s2 <- uniroot(vfun,interval=c(1e-6,100))$root

生成值:

set.seed(1001)
x <- rnorm(1000,mean=0,sd=sqrt(s2))
x <- exp(x-mean(x))-1   ## makes sum(x) exactly zero
prod(1+x)  ## exactly 1
sd(x)

这会产生标准偏差不完全等于 0.03 但接近的值。如果我们愿意,我们也可以解决这个问题......

于 2012-12-21T16:54:21.273 回答
3

一种非常简单的方法是简单地模拟退货,直到您有一组满足您的要求。不过,您将需要指定对您的要求的容差(请参阅此处的原因)。

nn <- 10
epsilon <- 1e-3
while ( TRUE ) {
    xx <- rnorm(nn,0,0.03)
    if ( abs(sd(xx)-0.03)<epsilon & abs(prod(1+xx)-1)<epsilon ) break
}
xx

产量

[1]  0.007862226 -0.011437600 -0.038740969  0.028614022  0.006986953
[6] -0.004131429  0.030846398 -0.037977057  0.046448318 -0.025294236
于 2012-12-21T16:48:50.527 回答