是的,虽然不是 100% 准确,但这是可能的。
import statsmodels.sandbox.distributions.extras as extras
import scipy.interpolate as interpolate
import scipy.stats as ss
import matplotlib.pyplot as plt
import numpy as np
def generate_normal_four_moments(mu, sigma, skew, kurt, size=10000, sd_wide=10):
f = extras.pdf_mvsk([mu, sigma, skew, kurt])
x = np.linspace(mu - sd_wide * sigma, mu + sd_wide * sigma, num=500)
y = [f(i) for i in x]
yy = np.cumsum(y) / np.sum(y)
inv_cdf = interpolate.interp1d(yy, x, fill_value="extrapolate")
rr = np.random.rand(size)
return inv_cdf(rr)
接下来,我们使用生成数据
data = generate_normal_four_moments(mu=0, sigma=1, skew=-1, kurt=3)
让我们检查一下时刻:
np.mean(data)
np.var(data)
ss.skew(data)
ss.kurtosis(data)
给予
-0.039986656405454374
1.051375501684874
-1.071149838792561
2.9813805363255472