File: continuous_genhyperbolic.rst

package info (click to toggle)
scipy 1.17.0-1exp2
  • links: PTS, VCS
  • area: main
  • in suites: experimental
  • size: 235,340 kB
  • sloc: cpp: 506,914; python: 357,038; ansic: 215,028; javascript: 89,566; fortran: 19,308; cs: 3,081; f90: 1,150; sh: 860; makefile: 519; pascal: 284; lisp: 134; xml: 56; perl: 51
file content (139 lines) | stat: -rw-r--r-- 7,953 bytes parent folder | download | duplicates (4)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139

.. _continuous-genhyperbolic:

Generalized Hyperbolic Distribution
===================================

The Generalized Hyperbolic Distribution is defined as the normal variance-mean mixture with Generalized Inverse Gaussian distribution as the mixing distribution.
The "hyperbolic" characterization refers to the fact that the shape of the log-probability distribution can be described as a hyperbola. Hyperbolic distributions are sometime referred to as semi-fat tailed because their probability density decrease slower than "sub-hyperbolic" distributions (e.g. normal distribution, whose log-probability decreases quadratically), but faster than other "extreme value" distributions (e.g. `pareto` distribution, whose log-probability decreases logarithmically).

Functions
---------

Different parameterizations exist in the literature; SciPy implements the "4th parametrization" in Prause (1999).

.. math::
   :nowrap:

    \begin{eqnarray*}
        f(x, p, a, b) & = &
        \frac{(a^2 - b^2)^{p/2}}
        {\sqrt{2\pi}a^{p-0.5}
        K_p\Big(\sqrt{a^2 - b^2}\Big)}
        e^{bx} \times \frac{K_{p - 1/2}
        (a \sqrt{1 + x^2})}
        {(\sqrt{1 + x^2})^{1/2 - p}}
    \end{eqnarray*}

for:

-  :math:`x, p \in ( - \infty; \infty)`
-  :math:`|b| < a` if :math:`p \ge 0`
-  :math:`|b| \le a` if :math:`p < 0`
-  :math:`K_{p}(.)` denotes the modified Bessel function of the second kind and order :math:`p` (`scipy.special.kn`)

The probability density above is defined in the "standardized" form. To shift and/or scale the distribution use the :math:`\text{loc}` and :math:`\text{scale}` parameters. Specifically, :math:`f(x, p, a, b, \text{loc}, \text{scale})` is identically equivalent to :math:`\frac{1}{\text{scale}}f(y, p, a, b)` with :math:`y = \frac{1}{\text{scale}}(x - \text{loc})`.

This parameterization derives from the original :math:`(\lambda, \alpha, \beta, \delta, \mu)` parameterization in  Barndorff (1978) by setting:

-  :math:`\lambda = p`
-  :math:`\alpha = \frac{a}{\delta} = \frac{\hat{\alpha}}{\delta}`
-  :math:`\beta = \frac{b}{\delta} = \frac{\hat{\beta}}{\delta}`
-  :math:`\delta = \text{scale}`
-  :math:`\mu = \text{location}`


Random variates for the `scipy.stats.genhyperbolic` can be efficiently sampled from the above-mentioned normal variance-mean mixture where `scipy.stats.geninvgauss` is parametrized as :math:`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)` so that: :math:`GH(p, \hat{\alpha}, \hat{\beta}) = \hat{\beta} \cdot GIG + \sqrt{GIG} \cdot N(0,1)`


The "generalized" characterization suggests the fact that this distribution is a superclass of several other probability distribution, for instance:

-  :math:`f(p = -\nu/2,  a = 0, b = 0, \text{loc} = 0, \text{scale} = \sqrt{\nu})` has a Student's t-distribution (`scipy.stats.t`) with :math:`\nu` degrees of freedom.
-  :math:`f(p = 1, a = \hat{\alpha}, b = \hat{\beta}, \text{loc} = \mu, \text{scale} = \delta)` has a Hyperbolic Distribution.
-  :math:`f(p = - 1/2, a = \hat{\alpha}, b = \hat{\beta}, \text{loc} = \mu, \text{scale} = \delta)` has a Normal Inverse Gaussian Distribution (`scipy.stats.norminvgauss`).
-  :math:`f(p = 1, a = \delta, b = 0, loc = \mu, \text{scale} = \delta)` has a Laplace Distribution (`scipy.stats.laplace`) for :math:`\delta \rightarrow 0`


Examples
--------

It is useful to understand how the parameters affect the shape of the distribution. While it is fairly straightforward to interpret the meaning of :math:`b` as the skewness, understanding the difference between :math:`a` and :math:`p` is not as obvious, as both affect the kurtosis of the distribution. :math:`a` can be interpreted as the speed of the decay of the probability density (where :math:`a > 1` the asymptotic decay is faster than :math:`log_e` and vice versa) or - equivalently - as the slope of the log-probability hyperbola asymptote (where :math:`a > 1` decay is faster than :math:`|1|` and vice versa). :math:`p` can be seen as the width of the shoulders of the probability density distribution (where :math:`p < 1` results in narrow shoulders and vice versa) or - equivalently - as the shape of the log-probability hyperbola, which is convex for :math:`p < 1` and concave otherwise.

.. code-block:: python

    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()

References
----------

-  Normal Variance-Mean Mixture
   https://en.wikipedia.org/wiki/Normal_variance-mean_mixture

-  Generalized Hyperbolic Distribution
   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.

Implementation: `scipy.stats.genhyperbolic`