广义双曲分布#
广义双曲分布定义为以广义逆高斯分布作为混合分布的法方差-均值混合分布。“双曲”特性指的是对数概率分布的形状可以描述为双曲线。双曲分布有时被称为半肥尾分布,因为它们的概率密度比“亚双曲”分布(例如,正态分布,其对数概率呈二次方递减)下降得慢,但比其他“极值”分布(例如,帕累托分布,其对数概率呈对数递减)下降得快。
函数#
文献中存在不同的参数化;SciPy 实现了 Prause (1999) 中的“第 4 个参数化”。
对于
\(x, p \in ( - \infty; \infty)\)
\(|b| < a\) 如果 \(p \ge 0\)
\(|b| \le a\) 如果 \(p < 0\)
\(K_{p}(.)\) 表示第二类和 \(p\) 阶的修正贝塞尔函数 (
scipy.special.kn
)
上面的概率密度以“标准化”形式定义。要平移和/或缩放分布,请使用 \(\text{loc}\) 和 \(\text{scale}\) 参数。具体来说,\(f(x, p, a, b, \text{loc}, \text{scale})\) 与 \(\frac{1}{\text{scale}}f(y, p, a, b)\) 完全等价,其中 \(y = \frac{1}{\text{scale}}(x - \text{loc})\)。
此参数化源自 Barndorff (1978) 中的原始 \((\lambda, \alpha, \beta, \delta, \mu)\) 参数化,通过设置
\(\lambda = p\)
\(\alpha = \frac{a}{\delta} = \frac{\hat{\alpha}}{\delta}\)
\(\beta = \frac{b}{\delta} = \frac{\hat{\beta}}{\delta}\)
\(\delta = \text{scale}\)
\(\mu = \text{location}\)
可以从上述的正态方差-均值混合有效地对 scipy.stats.genhyperbolic
的随机变量进行采样,其中 scipy.stats.geninvgauss
被参数化为 \(GIG\Big(p = p, b = \sqrt{\hat{\alpha}^2 - \hat{\beta}^2}, \text{loc} = \text{location}, \text{scale} = \frac{1}{\sqrt{\hat{\alpha}^2 - \hat{\beta}^2}}\Big)\),因此:\(GH(p, \hat{\alpha}, \hat{\beta}) = \hat{\beta} \cdot GIG + \sqrt{GIG} \cdot N(0,1)\)
“广义”特性表明此分布是几种其他概率分布的超类,例如
\(f(p = -\nu/2, a = 0, b = 0, \text{loc} = 0, \text{scale} = \sqrt{\nu})\) 具有自由度为 \(\nu\) 的学生 t 分布 (
scipy.stats.t
)。\(f(p = 1, a = \hat{\alpha}, b = \hat{\beta}, \text{loc} = \mu, \text{scale} = \delta)\) 具有双曲分布。
\(f(p = - 1/2, a = \hat{\alpha}, b = \hat{\beta}, \text{loc} = \mu, \text{scale} = \delta)\) 具有正态逆高斯分布 (
scipy.stats.norminvgauss
)。\(f(p = 1, a = \delta, b = 0, loc = \mu, \text{scale} = \delta)\) 对于 \(\delta \rightarrow 0\),具有拉普拉斯分布 (
scipy.stats.laplace
)。
示例#
了解参数如何影响分布的形状很有用。虽然将 \(b\) 解释为偏度非常简单,但理解 \(a\) 和 \(p\) 之间的区别并不那么明显,因为两者都会影响分布的峰度。\(a\) 可以解释为概率密度衰减的速度(其中 \(a > 1\) 时渐近衰减速度快于 \(log_e\),反之亦然)或者等效地,解释为对数概率双曲线渐近线的斜率(其中 \(a > 1\) 时衰减速度快于 \(|1|\),反之亦然)。\(p\) 可以看作是概率密度分布的肩宽(其中 \(p < 1\) 导致窄肩,反之亦然)或者等效地,看作是对数概率双曲线的形状,当 \(p < 1\) 时为凸形,否则为凹形。
import numpy as np
from matplotlib import pyplot as plt
from scipy import stats
p, a, b, loc, scale = 1, 1, 0, 0, 1
x = np.linspace(-10, 10, 100)
# plot GH for different values of p
plt.figure(0)
plt.title("Generalized Hyperbolic | -10 < p < 10")
plt.plot(x, stats.genhyperbolic.pdf(x, p, a, b, loc, scale),
label = 'GH(p=1, a=1, b=0, loc=0, scale=1)')
plt.plot(x, stats.genhyperbolic.pdf(x, p, a, b, loc, scale),
color = 'red', alpha = 0.5, label='GH(p>1, a=1, b=0, loc=0, scale=1)')
[plt.plot(x, stats.genhyperbolic.pdf(x, p, a, b, loc, scale),
color = 'red', alpha = 0.1) for p in np.linspace(1, 10, 10)]
plt.plot(x, stats.genhyperbolic.pdf(x, p, a, b, loc, scale),
color = 'blue', alpha = 0.5, label='GH(p<1, a=1, b=0, loc=0, scale=1)')
[plt.plot(x, stats.genhyperbolic.pdf(x, p, a, b, loc, scale),
color = 'blue', alpha = 0.1) for p in np.linspace(-10, 1, 10)]
plt.plot(x, stats.norm.pdf(x, loc, scale), label = 'N(loc=0, scale=1)')
plt.plot(x, stats.laplace.pdf(x, loc, scale), label = 'Laplace(loc=0, scale=1)')
plt.plot(x, stats.pareto.pdf(x+1, 1, loc, scale), label = 'Pareto(a=1, loc=0, scale=1)')
plt.ylim(1e-15, 1e2)
plt.yscale('log')
plt.legend(bbox_to_anchor=(1.1, 1))
plt.subplots_adjust(right=0.5)
# plot GH for different values of a
plt.figure(1)
plt.title("Generalized Hyperbolic | 0 < a < 10")
plt.plot(x, stats.genhyperbolic.pdf(x, p, a, b, loc, scale),
label = 'GH(p=1, a=1, b=0, loc=0, scale=1)')
plt.plot(x, stats.genhyperbolic.pdf(x, p, a, b, loc, scale),
color = 'blue', alpha = 0.5, label='GH(p=1, a>1, b=0, loc=0, scale=1)')
[plt.plot(x, stats.genhyperbolic.pdf(x, p, a, b, loc, scale),
color = 'blue', alpha = 0.1) for a in np.linspace(1, 10, 10)]
plt.plot(x, stats.genhyperbolic.pdf(x, p, a, b, loc, scale),
color = 'red', alpha = 0.5, label='GH(p=1, 0<a<1, b=0, loc=0, scale=1)')
[plt.plot(x, stats.genhyperbolic.pdf(x, p, a, b, loc, scale),
color = 'red', alpha = 0.1) for a in np.linspace(0, 1, 10)]
plt.plot(x, stats.norm.pdf(x, loc, scale), label = 'N(loc=0, scale=1)')
plt.plot(x, stats.laplace.pdf(x, loc, scale), label = 'Laplace(loc=0, scale=1)')
plt.plot(x, stats.pareto.pdf(x+1, 1, loc, scale), label = 'Pareto(a=1, loc=0, scale=1)')
plt.ylim(1e-15, 1e2)
plt.yscale('log')
plt.legend(bbox_to_anchor=(1.1, 1))
plt.subplots_adjust(right=0.5)
plt.show()
参考#
正态方差-均值混合 https://en.wikipedia.org/wiki/Normal_variance-mean_mixture
广义双曲分布 https://en.wikipedia.org/wiki/Generalised_hyperbolic_distribution
O. Barndorff-Nielsen,“双曲分布和双曲线上分布”,《斯堪的纳维亚统计杂志》,第 5(3) 卷,第 151-157 页,1978 年。https://www.jstor.org/stable/4615705
Eberlein E., Prause K. (2002) 广义双曲模型:金融衍生品和风险度量。见:Geman H., Madan D., Pliska S.R., Vorst T. (eds) 数学金融 - 巴切利耶大会 2000。施普林格金融。施普林格,柏林,海德堡。https://doi.org/10.1007/978-3-662-12429-1_12
Scott, David J, Würtz, Diethelm, Dong, Christine 和 Tran, Thanh Tam, (2009), 广义双曲分布的矩,MPRA 论文,德国慕尼黑大学图书馆,https://EconPapers.repec.org/RePEc:pra:mprapa:19081。