r语言 - A replacement for qnorm?



我有这个问题,我知道它可以通过几种方式来实现。

假设证券X的收益按有均值的正态规律分布M =0,标准差s=5。

  • 在1%时的风险值是多少(即,它将低于1的最小值)案例的百分比)?

我用这种方法解决了,但我想知道是否有其他方法

qnorm(0.01,mean=0,sd=5)
pnorm(-11.63174,mean=0,sd=5)

考虑极值理论和实践,由于长尾的存在,证券的收益通常不是正态分布的。然后假设(用启发式)一个t分布,df非常小(大约6),不管有多少观测值。

(qt(0.01, 6) + 0) * 5
# [1] -15.71334
qnorm(0.01, mean = 0, sd = 5)
# [1] -11.63174

从技术角度来看,我们主要使用样本,所以是经验数据。然后对数据进行排序,提取值或简单地取分位数。

set.seed(1234)
# some random sample
x <- rnorm(10000, mean = 0, sd = 5)
quantile(x, 0.01)
#        1% 
# -11.52401 

A。下面是最明显的另一种方式,如果你能接受这个概念:

qnorm(0.01)*5+0

B。另一种方法是求解cdf函数1/2[1+erf((x-mu)/(sigma sqrt(2))] = 0.01对于x,逆erf可以近似为Maclaurin级数erf^(-1)(z) = sum_(k=0)^ inty ck/(2k+1)(sqrt(pi)/2z)^(2k+1)其中c0 =1, c1 =1, ck = sum_(m=0)^(k-1) cm ck-1-m/(m+1)(2m+1)。使用k=1000作为一个很好的近似,我们可以解出x的cdf函数来得到分位数。

c=c(1, 1)
K=1000
for (k in 2:K) {
c[k+1]=0
for (m in 0:(k-1)) {
c[k+1]=c[k+1]+c[m+1]*c[k-1-m+1]/(m+1)/(2*m+1)
}
}
c
z = 0.01*2-1
e = 0
for (k in 0:K) {
e = e+c[k+1]/(2*k+1) * (sqrt(pi) / 2*z)^(2*k+1)
}
e

e*5*sqrt(2) + 0
qnorm(0.01, 0, 5)

最新更新