从经验数据生成随机多元值

机器算法验证 马尔可夫链蒙特卡罗 蒙特卡洛 密度函数
2022-03-17 13:32:43

我正在研究一个蒙特卡洛函数,用于对具有部分相关回报的几种资产进行估值。目前,我只是生成一个协方差矩阵并提供给rmvnorm()R 中的函数。(生成相关的随机值。)

但是,从资产收益的分布来看,它不是正态分布的。

这实际上是一个由两部分组成的问题:
1)当我所拥有的只是一些没有已知分布的真实数据时,我如何估计某种 PDF 或 CDF?

2)如何生成相关值,如 rmvnorm,但对于这种未知(和非正态)分布?

谢谢!


这些分布似乎不适合任何已知分布。我认为假设一个参数然后将其用于蒙特卡罗估计是非常危险的。

我可以看看某种引导程序或“经验蒙特卡罗”方法吗?

4个回答

关于第一个问题,您可以考虑重新采样数据。如果您的数据随时间相关(而不是同时相关),则会出现问题,在这种情况下,您将需要类似块引导程序之类的东西。但是对于返回数据,一个简单的引导程序可能就可以了。

我想第二个问题的答案很大程度上取决于目标分布。

第一个问题的答案是建立一个模型。在您的情况下,这意味着选择分布并估计其参数。

当您拥有分布时,您可以使用 Gibbs 或 Metropolis 算法从中采样。

在旁注中,你真的需要从这个分布中取样吗?通常感兴趣的是分布的某些特征。您可以通过 bootstrap 使用经验分布来估计它,或者再次为此特征构建模型。

我和@mpiktas 在一起,我也认为你需要一个模型。

我认为这里的标准方法是估计一个 copula 来捕捉不同资产之间的依赖结构,并为不同的资产使用例如倾斜正态分布或 t 分布的边际分布。这为您提供了一个非常通用的模型类(更通用的是假设例如多元 t 分布),这几乎是您的任务类型的标准(例如,我认为巴塞尔协议 II 要求金融机构使用 copula 方法来估计他们的 VaR) . R有一个copula包。

(1) 这是生成模拟时间序列所需的 CDF。要构建它,首先将您的价格变化/回报直方图。从您最左边的垃圾箱开始计算垃圾箱人口的累积总和。通过除以总箱数来规范化您的新功能。你剩下的是一个CDF。这是一些可以解决问题的numpy代码:

# Make a histogram of price changes

counts,bin_edges = np.histogram(deltas,numbins,normed=False) # numpy histogram

# Make a CDF of the price changes

n_counts,bin_edges2 = np.histogram(deltas,numbins,normed=True)
cdf = np.cumsum(n_counts)  # cdf not normalized, despite above
scale = 1.0/cdf[-1]
ncdf = scale * cdf

(2) 要生成相关选择,请使用 copula。请参阅我之前关于生成相关时间序列的问题的答案。