使用 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) 做到这一点?