1

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

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

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

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) )
4

2 回答 2

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您可以使用inpymc.Matplot和 call检查收敛性plot(mcmc)。我使用mcmc.sample( 25000, 15000, 1 ) 并获得了更好的结果。

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

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

于 2014-02-11T03:26:17.790 回答
0

请注意,如果您想使用信息先验,则不应使用np.linalg.inv(cov_matrix)for Wishart,而应使用cov_matrix. 确切地说,您应该使用cov_matrix * n_obs才能正确缩放

于 2015-04-08T03:06:01.863 回答