【发布时间】:2018-02-01 09:02:44
【问题描述】:
我正在尝试将 Johnson SU 分布拟合到一组标准普尔 500 指数回报的经验值。我的理解(免责声明:不是数学专家)是这个分布包含了第三和第四时刻(偏斜和峰度)。除了loc(平均值)和scale(标准偏差)之外,johnsonsu 还需要两个额外的参数,a 和b。但是这些参数的顺序和规范令人困惑。
这就是我的困惑的根源:如果我将回报引入 SPDR S&P 500 ETF Trust (SPY),我会得到以下经验统计数据:
from pandas_datareader.data import DataReader as dr
r = dr('SPY', 'google', start='2000')['Close'].pct_change().dropna()
mean, var, std, skew, kurt = r.mean(), r.var(0), r.std(0), r.skew(), r.kurt() # ddof = 0
# mean: 0.00027732907268771364
# var: 0.00014416720067485022
# std: 0.012006964673673785
现在,如果我对这个经验数据进行正态分布,.fit 应该返回loc 和scale 参数。 (所有这些都是正态分布所需要的。)检查一下:
import scipy.stats as scs
normmean, normstd = scs.norm.fit(r)
print(np.allclose(normmean, mean))
print(np.allclose(normstd, std))
True
True
但scs.johnsonsu.fit返回的内容不太清楚:
print(scs.johnsonsu.fit(r))
(0.098009661042083682, 1.022060362199493, 0.0013471690867203458, 0.0072653444313926403)
这些应该是分布的four parameters:xi, gamma, delta, lam。
即:
def johnsonmean(gamma, xi, delta, lam):
mean = xi - lam * np.exp(delta ** -2 / 2) * np.sinh(gamma / delta)
return mean
gamma, xi, delta, lam = scs.johnsonsu.fit(r) # correct order?
print(johnsonmean(gamma, xi, delta, lam))
-inf
和
mean, var, skew, kurt = scs.johnsonsu.stats(loc=xi, scale=lam,
a=gamma, b=delta, moments='msvk')
得到一堆NaNs。
【问题讨论】:
标签: python scipy distribution finance