2014-01-30 49 views
0

我需要建模并估计从资产类别方差 - 协方差矩阵返回,所以我一直在寻找在股票收益例子在第6章给出的https://github.com/CamDavidsonPilon/Probabilistic-Programming-and-Bayesian-Methods-for-HackersPyMC - 协方差威沙特分布估计

这是我简单的实现方式,其中我从使用已知均值和方差 - 协方差矩阵的多变量正态分布开始。然后我尝试使用非信息性的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)) 

回答

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年的样本烧伤后可能还没有收敛。你可以用plotpymc.Matplot检查收敛,并调用plot(mcmc)。我用mcmc.sample(25000, 15000, 1) 并得到更好的结果。

我想象你使用这种低样品的原因是性能。这很大程度上是由大量样本造成的:您有10000个观测值。对于你在实践中的实际情况,这可能相当高。

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

+0

感谢您的评论!我已经按照您的建议实施了这些更改,并且确实有所帮助。在回顾了关于这个主题的更多文献之后,一个关键的改进是由Wishart分布产生的协方差矩阵需要通过观察数量来缩小。我已经在这篇文章中发布了对上述内容的改进 - http://stackoverflow.com/questions/21711150/pymc-variance-covariance-matrix-estimation – akhil

0

请注意,如果您想使用以前的信息,您不应该使用np.linalg.inv(cov_matrix)Wishart,而只是cov_matrix。确切地说,您应该使用cov_matrix * n_obs以便正确缩放