PyMC - 用于协方差估计的Wishart分布

时间:2014-01-30 20:08:28

标签: covariance bayesian pymc

我需要根据资产类别回报对方差 - 协方差矩阵进行建模和估计,因此我查看了https://github.com/CamDavidsonPilon/Probabilistic-Programming-and-Bayesian-Methods-for-Hackers第6章中给出的股票收益示例

这是我的简单实现,其中我使用具有已知均值和方差 - 协方差矩阵的多元法线开始样本。然后我尝试使用非信息性的priror来估计它。

估计值与已知的先前值不同,所以我不确定我的实现是否正确。如果有人能指出我做错了什么,我会很感激吗?

import numpy as np
import pandas as pd
import pymc as pm


p=3
mu=[.03,.05,-.02]
cov_matrix= [[.025,0.0075, 0.00175],[0.0075,.007,0.00135],[0.00175,0.00135,.00043]]

n_obs=10000
x=np.random.multivariate_normal(mu,cov_matrix,n_obs)

prior_mu=np.ones(p)

prior_sigma = np.eye(p)


post_mu = pm.Normal("returns",prior_mu,1,size=p)
post_cov_matrix_inv = pm.Wishart("cov_matrix_inv",n_obs,np.linalg.inv(cov_matrix))

obs = pm.MvNormal( "observed returns", post_mu, post_cov_matrix_inv, observed = True, value = x )

model = pm.Model( [obs, post_mu, post_cov_matrix_inv] )
mcmc = pm.MCMC()

mcmc.sample( 5000, 2000, 3 )

mu_samples = mcmc.trace("returns")[:]
mu_samples.mean(axis=0)
cov_inv_samples = mcmc.trace("cov_matrix_inv")[:]
mean_covariance_matrix = np.linalg.inv( cov_inv_samples.mean(axis=0) )

2 个答案:

答案 0 :(得分:0)

这里有一些我可以改进代码+推理的建议:

  1. 我会pm.Wishart("cov_matrix_inv",n_obs,np.linalg.inv(cov_matrix))pm.Wishart("cov_matrix_inv",n_obs,np.eye(3) )因为它更客观(并且有10000个数据点,不管怎么说,你的事先并不重要)

  2. mcmc = pm.MCMC()应为mcmc = pm.MCMC(model)

  3. mcmc.sample( 5000, 2000, 3 )这里有很少的样本。当有大量样本时,MCMC的后半部分蒙特卡洛最强:我的意思是成千上万。这里只有1000,因此蒙特卡罗引起的误差会很高(误差会随着样本量的增加而减小)。此外,MCMC在2000年烧毁样品后可能不会收敛。您可以使用plot中的pymc.Matplot检查汇总并调用plot(mcmc)。我使用mcmc.sample( 25000, 15000, 1 ) 并获得了更好的结果。

  4. 我想你使用如此低样本的原因是性能。其中大部分是由大量样本引起的:你有10000个观测值。对于你在实践中实际拥有的东西,这可能是相当高的。

    请记住,贝叶斯推断的大部分价值都是后验样本:取这些样本的平均值似乎是浪费 - 考虑在Loss函数中使用样本(参见本书第5章)。

答案 1 :(得分:0)

请注意,如果您想使用信息丰富的优先信息,则不应将np.linalg.inv(cov_matrix)用于Wishart,而应仅使用cov_matrix。确切地说,您应该使用cov_matrix * n_obs才能正确扩展