我想生成一系列收益 x,使得收益的标准差为 0.03 和 1+x = 1 的乘积。总而言之,收益有两个条件:
1)sd(x) == 0.03
2)prod(1+x) == 1
这可能吗?如果可以,我如何在 R 中实现它?
谢谢你。
稍微复杂一点的方法是使用对数正态分布的知识:从?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 但接近的值。如果我们愿意,我们也可以解决这个问题......
一种非常简单的方法是简单地模拟退货,直到您有一组满足您的要求。不过,您将需要指定对您的要求的容差(请参阅此处的原因)。
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