在 Excel 的 NORMINV() 上随着样本量的增加而增加平均偏差

Increasing mean deviation with increasing sample size on Excel's NORMINV()

我在尝试用 C 编写 Excel 的 NORMINV() 时有一个奇怪的行为。作为 norminv() 我从数学家那里得到了 this 函数,这可能是正确的,因为我也尝试不同的结果相同。这是代码:

double calculate_probability(double x0, double x1)
{
    return x0 + (x1 - x0) * rand() / ((double)RAND_MAX);
}

int main() {

long double probability = 0.0;
long double mean = 0.0;
long double stddev = 0.001;
long double change_percentage = 0.0;
long double current_price = 100.0;
srand(time(0));
int runs = 0;
long double prob_sum = 0.0;
long double price_sum = 0.0;

while (runs < 100000)
{
    probability = calculate_probability(0.00001, 0.99999);
    change_percentage = mean + stddev * norminv(probability); //norminv(p, mu, sigma) = mu + sigma * norminv(p)
    current_price = current_price * (1.0 + change_percentage);
    runs++;
    prob_sum += probability;
    price_sum += current_price;
}
printf("\n\n%f %f\n", price_sum / runs, prob_sum / runs);
return 0;
}

现在我想模拟 Excel 的 NORMINV(rand(), 0, 0.001),其中 rand() 是一个 > 0 且 < 1 的值,0 是平均值,0.001 是标准值偏差.

1000 个值看起来没问题:

100.729780 0.501135

对于 10000 个值,它传播得太多了:

107.781909 0.502301

如果有 100000 个值,它有时会传播得更多:

87.876500 0.498738

现在我不知道为什么会这样。我的假设是随机数生成器也必须呈正态分布。在我的例子中,probability 计算得很好,因为平均值几乎一直是 0.5。因此我不知道为什么平均偏差在增加。有人可以帮助我吗?

您正在按照 random walk 的方式进行操作,只是您的动作是乘法比例因子而不是加法步骤。

考虑两个连续的动作,第一个给出 20% inflation,第二个给出 20% 的紧缩。从 100 的基线开始,在第一步之后你是 120。如果你现在取 120 的 80%,你将得到 96 而不是原来的 100。换句话说,看似对称的​​比例因子实际上并不对称。虽然您的比例因子是随机的,但它们仍然是围绕 1 对称创建的,所以看到偏差累积我并不感到惊讶。