广义双曲分布#
广义双曲分布定义为正态方差-均值混合分布,其中广义逆高斯分布作为混合分布。“双曲”特征指的是对数概率分布的形状可以描述为双曲线。双曲分布有时被称为半胖尾分布,因为它们的概率密度下降速度比“亚双曲”分布(例如,正态分布,其对数概率呈二次方下降)慢,但比其他“极值”分布(例如,pareto 分布,其对数概率呈对数下降)快。
函数#
文献中存在不同的参数化; 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\) 的 Student’s 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)\) 具有 Laplace 分布 (
scipy.stats.laplace
) 对于 \(\delta \rightarrow 0\)
示例#
了解参数如何影响分布的形状非常有用。虽然将 \(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, “Hyperbolic Distributions and Distributions on Hyperbolae”, Scandinavian Journal of Statistics, Vol. 5(3), pp. 151-157, 1978. https://www.jstor.org/stable/4615705
Eberlein E., Prause K. (2002) The Generalized Hyperbolic Model: Financial Derivatives and Risk Measures. In: Geman H., Madan D., Pliska S.R., Vorst T. (eds) Mathematical Finance - Bachelier Congress 2000. Springer Finance. Springer, Berlin, Heidelberg. https://doi.org/10.1007/978-3-662-12429-1_12
Scott, David J, Würtz, Diethelm, Dong, Christine and Tran, Thanh Tam, (2009), Moments of the generalized hyperbolic distribution, MPRA Paper, University Library of Munich, Germany, https://EconPapers.repec.org/RePEc:pra:mprapa:19081.