Primeira vez aqui? Seja bem vindo e cheque o FAQ!
x

Como gerar dados para fazer um experimento de Monte Carlo com CAPM?

0 votos
26 visitas
perguntada Dez 10, 2018 em Finanças por MarcioGama (96 pontos)  
Compartilhe

1 Resposta

0 votos
respondida Dez 10, 2018 por MarcioGama (96 pontos)  

A resposta a seguir não é nada mais do que uma implementação da metodologia de geração de dados apresentada em : "A Monte Carlo investigation of the accuracy of multivariate CAPM tests." Journal of Financial Economics 14.3 (1985): 359-375" de Christine E. Amsler e Peter Schmidt. (Não encontrei um link aberto para o artigo)

O modelo é o seguinte:

Sejam \(T\) o número de períodos e \(K\) o número de ativos, a equação do mercado é definida como: \(r_{i} = i_{T}\alpha_{i} + r_{m}\beta_{i} + \epsilon_{i}\) , \(i = 1, ..., T\).
Onde:
\(r_{i}\) é um vetor \((T\times1)\) que contem os retornos do ativo \(i\).
\(r_{m}\) é um vetor \((T\times1)\) que contem os retornos do mercado.
\(\epsilon_{i}\) é um vetor \((T\times1)\) do erro aleatório.
\(i_{T}\) é um vetor \((T\times1)\) de uns.
\(\alpha_{i}\) e \(\beta_{i}\) são parâmetros escalares.

Sejam \(\alpha\) e \(\beta\) vetores \((K \times 1)\) compostos pelos \(\alpha_{i}\) e \(\beta_{i}\) e \(\mu\) o vetor \((K \times 1)\) onde o i-ésimo valor é \(E(r_{i})\).

O modelo CAPM implica linearidade entre \(\beta\) e \(\mu\), logo existem os escalares \(\gamma_{1}\) e \(\gamma_{2}\) tal que: \(\mu = \gamma_{1}i_{T} + \gamma_{2}\beta \) que implica em \(\alpha = \gamma_{1}i_{T} + \gamma_{2}^{*}\beta\), onde \(\gamma_{2}^{*} = \gamma_{2} - E(r_{m})\). Além disso, a eficiência média-variância de \(r_{m}\) implica em \(\gamma_{2} = \mu_{m} - \gamma_{1}\) e, consequentemente, \( \gamma_{2}^{*} = -\gamma_{1}\).

Para geração dos dados, os autores definem as variáveis \(T\), \(K\), \(\beta\), \(\mu_{m}\), \(\sigma_{m}\) , \(\gamma_{1}\) e \(\sum\).

Eles primeiramente tiram \(T\) valores para \(r_{m}\) de uma distribuição Normal com média \(\mu_{m}\) e variância \(\sigma_{m}^{2}\). Em seguida, calculam o \(\alpha\) de acordo com a equação descrita acima e por fim calculam o \(E(r_{i}) = \alpha_{i} + \beta_{i}r_{m}\).

Um dos experimentos feito pelos autores usa os seguintes parâmetros:
\(T = 400, K = 5, \sigma_{m} = 0.0328, \mu_{m} = 0.0125, \gamma_{1} = 0.0012\) (os autores chamam os valores de \(\sigma_{m}\) e \(\gamma_{1}\) de valores de Stambaugh) e
\(\beta = \left[\begin{array}{cc}
0.507 \\
0.881 \\
1.015\\
1.296\\
1.427\\
\end{array}\right]\) e \(\sum = \left[\begin{array}{cc}
0.26& & & & \\
0.08 & 0.23 & & & \\
0.09 & 0.20 & 0.58 & & &\\
-0.04 & 0.17 & 0.41 & 0.94 & \\
-0.1& 0.1 & 0.31 & 0.40 & 0.58
\end{array}\right]\)

Segue a implementação no python.

import numpy as np
from scipy.linalg import cholesky
from scipy.stats import norm

#definindo as variáveis
T = 400
K = 5

u_m = 0.0125
sigma_m = 0.0328

gamma1 = 0.0012

sigma = np.array([
    [0.26, 0.08, 0.09, -0.04, -0.10],
    [0.08, 0.23, 0.20, 0.17, 0.10],
    [0.09, 0.20, 0.58 , 0.41, 0.31],
    [-0.04, 0.17, 0.41, 0.94, 0.40 ], 
    [-0.10, 0.10, 0.31, 0.40, 0.58]
])

beta = np.array([0.507, 0.881, 1.015, 1.296, 1.427])

#gerando o retorno de mercado 
rm = np.random.normal(u_m,sigma_m,T)

#calculando alpha
alpha = gamma1*(np.ones(K) - beta.T)

#gerando os epsilons utilizando a decomposição de cholesky
z = norm.rvs(size=(K,T))
c = cholesky(sigma, lower = True)
eps = np.dot(c,z)

#calculando o retorno de algum ativo.
r_0 = alpha[0] + beta[0]*rm + eps[0].T
...