我大致遵循本在线指南(link here)中提供的股票协方差示例,但我有一个更简单的示例模型 . 我以这样的方式构建它,我知道两个变量之间的协方差/相关性 .

我在下面发布了我的简短代码 . 基本上我正在做的是构建一个人工数据集,其中相关矩阵应该是[[1,-0.5],[ - 0.5,1]] . 在mcmc采样结束时,我得到了非对角线项的预测值,这个值非常不同 . 我看了收敛标准,看起来自相关性很低,分布是静止的 . 但是,我承认我仍然围绕着这里的所有细微差别,并且可能有一些方面仍然是我无法掌握的 .

这个问题与其他两个SO问题(OneTwo)有关并且非常基于这些问题 . 我觉得有必要问我自己的问题,尽管有相似之处,因为我没有得到我希望得到的答案 . 如果您有任何计算统计学家可以帮助提供洞察这个问题,将不胜感激!

import numpy as np
import pandas as pd
import pymc as pm
import matplotlib.pyplot as plt
import seaborn as sns

p=2
prior_mu=np.ones(p)
prior_sdev=np.ones(p)
prior_corr_inv=np.eye(p)

def cov2corr(A):
    """
    covariance matrix to correlation matrix.
    """
    d = np.sqrt(A.diagonal())
    A = ((A.T / d).T) / d
    #A[ np.diag_indices(A.shape[0]) ] = np.ones( A.shape[0] )
    return A

# construct artificial data set
muVector=[10,5]
sdevVector=[3.,5.]
corrMatrix=np.matrix([[1,-0.5],[-0.5, 1]])
cov_matrix=np.diag(sdevVector)*corrMatrix*np.diag(sdevVector)
n_obs = 500
x = np.random.multivariate_normal(muVector,cov_matrix,n_obs)

prior_mu = np.array(muVector)
prior_std = np.array(sdevVector)

inv_cov_matrix = pm.Wishart( "inv_cov_matrix", n_obs, np.diag(prior_std**2) )
mu = pm.Normal( "returns", prior_mu, 1, size = 2)

# create the model and sample
obs = pm.MvNormal( "observed returns", mu, inv_cov_matrix, observed = True, value = x )
model = pm.Model( [obs, mu, inv_cov_matrix] )
mcmc = pm.MCMC(model)
mcmc.use_step_method(pm.AdaptiveMetropolis,inv_cov_matrix)
mcmc.sample( 1e5, 2e4, 10)

# Determine prediction - Does not equal corrMatrix!
inv_cov_samples = mcmc.trace("inv_cov_matrix")[:]
mean_covariance_matrix = np.linalg.inv( inv_cov_samples.mean(axis=0) )
prediction = cov2corr(mean_covariance_matrix*n_obs)