Я пытался реализовать асимметричное обобщенное распределение t в Python, чтобы смоделировать некоторую финансовую отдачу. Я основал свой код на формулах, найденных в Википедии , и использовал бета-дистрибутив от scipy.
from scipy.special import beta
import numpy as np
from math import sqrt
def sgt(x, params):
# This function accepts an array of 5 parameters [mu, sigma, lambda, p, q]
mu, sigma, lam, p, q = params
v = (q**(-1/p)) / (sqrt((3*lam*lam + 1)*beta(3/p, q-2/p)/beta(1/p, q) - 4*lam*lam*(beta(2/p, q-1/p)/(beta(1/p, q)))**2))
m = 2*v*sigma*lam*q**(1/p)*beta(2/p, q - 1/p) / beta(1/p, q)
fx = p / (2*v*sigma*(q**(1/p))*beta(1/p, q)*((abs(x-mu+m)**p/(q*(v*sigma)**p*(lam*np.sign(x-mu+m)+1)**p + 1)+1)**(1/p + q)))
return fx
Теперь, похоже, функция отлично работает для некоторых наборов параметров, но ужасно для других наборов параметров.
Например:
dx = 0.001
x_axis = np.arange(-10, 10, dx)
ok_parameters = [0, 2, 0, 3, 8]
bad_parameters = [0, 2, 0, 1.05, 2.1]
ok_distribution = sgt(x_axis, ok_parameters)
bad_distribution = sgt(x_axis, bad_parameters)
Если я попытаюсь вычислить интегралы этих двух чисел:
a = np.sum(ok_distribution*dx)
b = np.sum(bad_distribution*dx)
Я получаю результаты a = 1.0013233154393804 и b = 2.2799746093533346.
Теоретически, оба они должны быть равны 1, но я предполагаю, что, поскольку я приблизил интеграл, значение не всегда будет точно равно 1. Во втором случае, однако, я не понимаю, почему значение так высоко.
Кто-нибудь знает, в чем проблема?
Это графики нормального (синего) и плохого (оранжевого)