使用 python 拟合经验分布

Posted

技术标签:

【中文标题】使用 python 拟合经验分布【英文标题】:Fitting empirical distributions using python 【发布时间】:2020-12-16 09:23:03 【问题描述】:

我有 255 个月(约 21 年)的金融资产回报率,范围从 -22.25% 到 +18.09%。我正在使用来自Fitting empirical distribution to theoretical ones with Scipy (Python)? 的代码将数据拟合到分布中并生成随机数。

这是数据的直方图。我相信上面的代码尝试使用 MLE(最大似然估计)将数据拟合到分布中,并且列表中有大约 88 种不同的分布。我的问题是,例如,burr 分布只是正随机变量(https://en.wikipedia.org/wiki/Burr_distribution,https://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.burr.html)。

但是当我拟合分布、获取参数并制作 PDF 时,我得到以下结果:

哪个分布既有正值又有负值。

说实话,我认为我并不完全理解代码和拟合分布的含义。为什么应该只适合正值的分布也适合负值?

【问题讨论】:

loc=-99.11 不会将正值推入负值区域吗? @JohanC 我相信。 loc 和 scale 似乎改变了值,但我不太确定。我在哪里可以了解更多关于它们的信息? 嗯,你可以先用标准值画出pdf,然后一个一个地改变参数,看看pdf是如何变化的。以一种颜色绘制标准 pdf,并在同一图上用另一种颜色进行修改。继续尝试并尝试理解 scipy 和 wikipedia 上的文档。 不清楚为什么要确定可以近似数据样本的任意理论分布。许多不同的分布将非常适合,但仅仅因为一个适合并不意味着您的数据来自这种分布。如果您想要来自同一分布的新随机样本,请参阅Creating a random number generator for arbitrary distributions。 【参考方案1】:

试试distfit 库。它适合基于您的经验数据的最佳理论分布。它返回 loc/scale 参数。您可以设置方向性以测试显着性(上限/下限)。拟合模型可用于生成新样本。在此处查看documentation。

pip install distfit

# import library
from distfit import distfit

# Lets create some random data for demonstration purposes. Ssuppose that X is your data.
X = np.random.normal(0, 2, 10000)

# Initialize with default settings
model= distfit(bound='both')

# Fit to find the best theoretical distribution 
model.fit_transform(X)

# The fitted distribution can now be used to generate new samples.
Xgenerate = model.generate(n=1000)

【讨论】:

以上是关于使用 python 拟合经验分布的主要内容,如果未能解决你的问题,请参考以下文章

拟合分布、拟合优度、p 值。是不是可以使用 Scipy (Python) 做到这一点?

使用 stats.exponweib.fit 在 python 中拟合 Weibull 分布

使用python中的对数轴缩放和拟合对数正态分布

用(python)Scipy拟合伽马分布

在 Python 中拟合对数正态分布的混合

这是拟合从python中的高斯分布生成的数据的正确方法吗?