Introdução ao Modelo CAPM (Capital Asset Pricing Model)

Introdução

Um dos modelos mais famosos na área de Finanças é o conhecido CAPM (Capital Asset Pricing Model). Ele data sua origem no trabalho de Treynor, Sharpe, Lintner e Mossin.

Formulação Matemática

Para derivar o modelo CAPM de uma forma mais rigorosa, nós utilizaremos um resultado encontrado na resolução de um portfólio ótimo quando é permitida venda a descoberto.1
A resolução do problema envolve encontrar a composição do portfólio que maximiza a inclinação da reta que passa entre a taxa livre de risco (no eixo vertical) e o próprio portfólio. Mais formalmente, isso envolveria maximizar a função:

\[\theta=(\overline{R}_P-R_F)/\sigma_P \] Sujeita a seguinte restrição: \[\sum_{i=1}^N X_i=1\] onde \(X_i\) é o percentual do ativo \(i\in[1,2,...,N]\).; \(\overline{R}_P\) é o retorno esperado do portfólio; \(R_F\) é o retorno livre de risco e \(\sigma_P\) é o desvio-padrão do portfólio (medida de risco).

Ou seja, estamos maximizar a unidade de medida que captura a fração entre prêmio de risco sobre o risco envolvido.

Repare que a mesma função acima pode ser aberta nos \(N\) ativos que a compoem. Ficando:

\[\theta=\frac{\sum_{i=1}^N X_i.(\overline{R}_i-R_F)}{(\sum_{i=1}^N X_i^2.\sigma^2_i+2.\sum_{1<i<j<N}X_i.X_j.\sigma_{i,j})^{1/2}} \] A solução do problema de maximação exige como condição que: \[\begin{array}{c} \partial\theta/\partial X_1=0 \\ \partial\theta/\partial X_2=0 \\ ... \\ \partial\theta/\partial X_N=0 \end{array}\] Onde as derivadas de \(\theta\) com relação a \(X_i\) são2: \[\partial\theta/\partial X_i=-\lambda.(X_1.\sigma_{1i}+X_2.\sigma_{2i}+...+X_N.\sigma_{Ni}+X_i.\sigma_{i}^2)+\overline{R}_i-R_F=0\]

Repare que a condição da equação anterior vale para cada ação e, portanto, há uma equação para cada ação no mercado. Se houver expectativas homogêneas, então todos os investidores devem selecionar o mesmo portfólio ótimo. Se todos os investidores selecionam o mesmo portfólio, então, em equilíbrio, esse portfólio deve ser um portfólio no qual todas as ações estão na mesma percentagem que são representadas no mercado. Em outras palavras, em equilíbrio, a proporção investida na ação 1 deve ser a mesma fração que representa o valor de mercado que a ação 1 representa no total.

Para partir da equação acima em direção ao CAPM, devemos reconhecer que o lado esquerdo da equação é o mesmo que \(\lambda.cov(R_k.R_M)\). Para enxergar isso, repare que3: \[R_M=\sum_ {i=1}^N R_i.X_i'\] Assim, temos que: \[cov(R_k,R_M)=E\left[(R_k-\overline{R}_k).\left(\sum_{i=1}^NR_i.X_i' -\sum_{i=1}^N\overline{R}_i.X_i' \right) \right] \] Rearranjando o segundo termo, temos: \[cov(R_k,R_M)=E\left[(R_k-\overline{R}_k).\left(\sum_{i=1}^NX_i'.(R_i-\overline{R}_i) \right) \right] \] Abrindo os termos da multiplicação, temos: \[cov(R_k,R_M)=E[X_1'.E(R_k-\overline{R}_k).(R_1-\overline{R}_1)+...\] \[...+X_k'.E(R_k-\overline{R}_k)^2+...+X_N'.E(R_k-\overline{R}_k).(R_N-\overline{R}_N)]\]

Previamente, argumentamos que \(X_i'\) são as proporções de mercado. Comparando a equação anterior com o primeiro termo da derivada \(\partial\theta/\partial X_i\) temos uma igualdade. Assim, a equação que formula a condição de equilíbrio pode ser reescrita como: \[\lambda.cov(R_k,R_M)=\overline{R}_k-R_F\] Devido a condição ser a mesma para todas as ações (todos possíveis valores de \(k\)), temos como implicação que ela também a seja para todos os portfólios de ações. Um possível portfólio é o portfólio de mercado. Escrevendo a equação acima para o portfólio de mercado e substituindo \(cov(R_M,R_M)=\sigma_M^2\), temos: \[\lambda=\frac{\overline{R}_M-R_F}{\sigma_M^2}\] Substituindo esse valor para \(\lambda\) na equação de equilibrio para \(R_k\) e reorganizando-a, temos: \[\overline{R}_k=R_F+\frac{\overline{R}_M-R_F}{\sigma_M^2}.cov(R_k,R_m)\] Ou ainda \[\overline{R}_k=R_F+\beta_k.(\overline{R}_M-R_F)\] Isso completa uma forma de derivar a SML (Security Market Line) e consequentemente a equação geral do modelo CAPM. O que ela informa é que o retorno médio de um ativo \(k\) é explicado pelo retorno livre de risco (nossa Selic diária, por exemplo) mais um coeficiente que capta a sensibilidade ao prêmio de risco (Retorno de mercado menos o retorno livre de risco).

Análise do Modelo Utilizando o R

Apresentada a formulação matemática do modelo CAPM, vamos agora verificar a utilização dele para analisar algumas ações da B3. Para isso, faremos uso dos seguintes pacotes: xts, PerformanceAnalytics, xtsanalytics, BETS e stargazer.

O segundo pacote é para lidar com séries temporais descontínuas (intervalos irregulares como ocorre na bolsa), o segundo é um pacote de ferramentas para análise de ações e do portfólio, o terceiro é um pacote recente, muito útil, que facilita a organização dos dados baixados do yahoo finance, o quarto é para baixar a série temporal diária da Selic e a última é para juntar dados de regressões em uma tabela só.

O código começa limpando os dados anteriores através do comando rm(list=ls()).

rm(list=ls())

library(xts)
library(PerformanceAnalytics)
library(xtsanalytics)
library(BETS)
library(stargazer)
library(kableExtra)


#remotes::install_github("jeanmarcgp/xtsanalytics")
Busca <- BETSsearch("interest rate")
kable(head(Busca)) %>%
  kable_styling(bootstrap_options = "striped", full_width = F)
code description unit periodicity start last_value source
1002 Credit operations with nonearmarked funds (floating rate) - Acquisition of vehicles-individuals - Interest rate % p.d. D 31/05/2000 31/12/2012 Sisbacen PESP300
1015 Credit operations with nonearmarked funds (based on price index rate) - Acquisition of vehicles-individuals - Interest rate % p.d. D 31/05/2000 31/12/2012 Sisbacen PESP300
1027 Credit operations with nonearmarked funds (preset rate) - Acquisition of other goods-individuals - Interest rate % p.d. D 31/05/2000 31/12/2012 Sisbacen PESP300
1038 Credit operations with nonearmarked funds (postset rate) - Acquisition of other goods-individuals - Interest rate % p.d. D 31/05/2000 31/12/2012 Sisbacen PESP300
1050 Credit operations with nonearmarked funds (floating rate) - Acquisition of other goods-individuals - Interest rate % p.d. D 31/05/2000 31/12/2012 Sisbacen PESP300
1063 Credit operations with nonearmarked funds (based on price index rate) - Acquisition of other goods-individuals - Interest rate % p.d. D 31/05/2000 31/12/2012 Sisbacen PESP300

Na sequência fazemos uma busca geral nas bases do BETS, através da função `BETSsearch() para séries de taxa de juros. Ao olhar no resultado da busca, verificamos que o código 11 é referente a taxa Selic em taxa e observações diárias. Posteriormente, fazemos o download através do comando BETSget() e transformamos em série temporal através da função xts().

Uma vez obtida nossa taxa básica, o próximo passo é obter a série de preços das ações. Escolhemos ad hoc as ações ITUB4, WEGE3, B3SA, ABEV3, PETR4. Como retorno do mercado, utilizamos como proxy o índice Ibovespa. Fazemos o dowload dessas séries com os preços ajustados através da função mget_symbols(). Obtidos os preços, calculamos os retornos diários através da função Return.calculate() e na sequência juntamos com a série da taxa selic diária.

Para alinhar os ativos para que todos tivessem as mesmas observações, utilizamos o comando na.omit(). Criamos a série de prêmio de risco como sendo a diferença entre a rentabilidade do mercado (Ibov) menos o retorno da taxa selic.

# Selic Diária em valor percentual a.d.
Selic_Dia       <- BETSget(code = "11")
Ret_Livre_Risco <- xts(Selic_Dia$value*0.01, order.by = Selic_Dia$date)

Ativos <- cbind("ITUB4.SA",
                "WEGE3.SA",
                "B3SA3.SA",
                "ABEV3.SA",
                "PETR4.SA",
                "^BVSP")


Precos <- mget_symbols(Ativos, OHLC = "Ad")
## Getting data from yahoo...
## Downloading symbols: ITUB4.SA WEGE3.SA B3SA3.SA ABEV3.SA PETR4.SA ^BVSP
## 
## Successfully downloaded symbol: ITUB4.SA
## Successfully downloaded symbol: WEGE3.SA
## Successfully downloaded symbol: B3SA3.SA
## Successfully downloaded symbol: ABEV3.SA
## Successfully downloaded symbol: PETR4.SA
## Successfully downloaded symbol: ^BVSP
## 
## 
## DOWNLOAD SUMMARY:
## =================
## Symbols successfully downloaded: ITUB4.SA WEGE3.SA B3SA3.SA ABEV3.SA PETR4.SA BVSP 
## Symbols NOT downloaded: 
## 
## Applying na.locf to the matrix...
Retornos <- Return.calculate(Precos, method = "discrete")

Serie <- cbind(Ret_Livre_Risco,Retornos)

Retornos <- na.omit(Serie)

Retornos$Premio_Risco <- Retornos$BVSP - Retornos$Ret_Livre_Risco

Na sequência, obtemos o resultado de regressões por MQO do retorno diário da ação contra o prêmio de risco e o retorno livre de risco. A regressão é estimada sem intercepto.

ITUB4.fit <- lm(`ITUB4.SA` ~ Premio_Risco + Ret_Livre_Risco -1, data = Retornos)
WEGE3.fit <- lm(`WEGE3.SA` ~ Premio_Risco + Ret_Livre_Risco -1, data = Retornos)
B3SA3.fit <- lm(`B3SA3.SA` ~ Premio_Risco + Ret_Livre_Risco -1, data = Retornos)
ABEV3.fit <- lm(`ABEV3.SA` ~ Premio_Risco + Ret_Livre_Risco -1, data = Retornos)
PETR4.fit <- lm(`PETR4.SA` ~ Premio_Risco + Ret_Livre_Risco -1, data = Retornos)

Isso posto, agregamos os resultados das regressões na forma de tabela através da função stargazer(). Ela formata a tabela e a gera no formato HTML.

stargazer(ITUB4.fit,WEGE3.fit,B3SA3.fit,ABEV3.fit,PETR4.fit,
          type = "html", digits = 3)
Dependent variable:
ITUB4.SA WEGE3.SA B3SA3.SA ABEV3.SA PETR4.SA
(1) (2) (3) (4) (5)
Premio_Risco 0.991*** 0.575*** 1.069*** 0.525*** 1.455***
(0.015) (0.022) (0.020) (0.018) (0.026)
Ret_Livre_Risco 1.828*** 2.771*** 2.728*** 1.634** 1.607
(0.664) (0.958) (0.862) (0.763) (1.127)
Observations 2,223 2,223 2,223 2,223 2,223
R2 0.651 0.234 0.564 0.285 0.583
Adjusted R2 0.651 0.234 0.564 0.285 0.583
Residual Std. Error (df = 2221) 0.012 0.017 0.015 0.014 0.020
F Statistic (df = 2; 2221) 2,075.932*** 339.616*** 1,437.908*** 442.990*** 1,554.108***
Note: p<0.1; p<0.05; p<0.01

Regressões obtidas e apresentadas, vamos agora investigar visualmente a “cara” tem essas regressões. Para isso usamos, o pacote ggplot2 para plotar essas figuras.

library(ggplot2)
theme_set(theme_bw())

ggplot(data = Retornos, aes(y = `ITUB4.SA`, x = Premio_Risco)) + 
  geom_point(col='blue') + 
  xlab('Prêmio de Risco') + 
  ylab('Expectativa de Retorno') + 
  ggtitle('Retorno ITUB4') + 
  geom_smooth(method = "lm", se = T, col = "black")

ggplot(data = Retornos, aes(y = `WEGE3.SA`, x = Premio_Risco)) + 
  geom_point(col=' dark green') + 
  xlab('Prêmio de Risco') + 
  ylab('Expectativa de Retorno') + 
  ggtitle('Retorno WEGE3') + 
  geom_smooth(method = "lm", se = T, col = "black") 

ggplot(data = Retornos, aes(y = `B3SA3.SA`, x = Premio_Risco)) + 
  geom_point(col='cyan') + 
  xlab('Prêmio de Risco') + 
  ylab('Expectativa de Retorno') + 
  ggtitle('Retorno B3SA3') + 
  geom_smooth(method = "lm", se = T, col = "black")

ggplot(data = Retornos, aes(y = `ABEV3.SA`, x = Premio_Risco)) + 
  geom_point(col='brown') + 
  xlab('Prêmio de Risco') + 
  ylab('Expectativa de Retorno') + 
  ggtitle('Retorno ABEV3') + 
  geom_smooth(method = "lm", se = T, col = "black")

ggplot(data = Retornos, aes(y = `PETR4.SA`, x = Premio_Risco)) + 
  geom_point(col='orange') + 
  xlab('Prêmio de Risco') + 
  ylab('Expectativa de Retorno') + 
  ggtitle('Retorno PETR4') + 
  geom_smooth(method = "lm", se = T, col = "black")

Referências

BANZ, R. W. The relationship between return and market value of common stocks. Journal of Financial Economics, v. 9, n. 1, p. 3-18, 1981.

BLACK, F.; JENSEN, M. C.; SCHOLES, M. The capital asset pricing model: some empirical tests. In: JENSEN, M. C. (Ed.). Studies in the Theory of Capital Markets. New York: Praeger, 1972. p. 79-121.

ROSS, S. A. The arbitrage theory of capital asset pricing. Journal of Economic Theory, v. 13, n. 3, p. 341-360. 1976.

SHARPE, W. F. Capital asset prices: a theory of market equilibrium under conditions of risk. Journal of Finance, v. 19, n. 3, p. 425- 442, 1964.


  1. O investidor pode tomar dinheiro emprestado e emprestar quantias ilimitadas de dinheiro à taxa livre de risco para poder aplicar (ou aplicarem) no mercado de renda variável.

  2. Obtenção detalhada da derivada: Reorganizando a função, temos que: \[\theta=\sum_{i=1}^N X_i.(\overline{R}_i-R_F).\left(\sum_{i=1}^N X_i^2.\sigma^2_i+2.\sum_{1<i<j<N}X_i.X_j.\sigma_{i,j}\right) ^{-1/2}\] Utilizando a derivada do produto na equação acima, obtemos: \[\frac{\partial[F_1(X).F_2(X)]}{\partial X}=F_1(X).\frac{\partial F_2(X)}{\partial X} + F_2(X).\frac{\partial F_1(X)}{\partial X}\] Sendo: \[F_1(X)=\sum_{i=1}^N X_i.(\overline{R}_i-R_F)\] e \[F_2(X)=\left(\sum_{i=1}^N X_i^2.\sigma^2_i+2.\sum_{1<i<j<N}X_i.X_j.\sigma_{i,j}\right) ^{-1/2}\] As respectivas derivadas são: \[\frac{\partial F_1(X)}{\partial X_k}= (\overline{R}_k-R_F)\] e \[\frac{\partial F_2(X)}{\partial X_k}=\left(-\frac{1}{2}\right).\left(\sum_{i=1}^N X_i^2.\sigma^2_i+2.\sum_{1<i<j<N}X_i.X_j.\sigma_{i,j} \right)^{-3/2}.\] \[.2.\left(X_k.\sigma_k^2+\sum_{j=1,j\neq k}^NX_j.\sigma_{j,k} \right)\] Observe que as derividas surgem com o termo \(k\). A ideia é que o portfólio esteja aumentando em mais uma ação e o quanto essa ação está proporcionando de risco e retorno a mais para o portfólio como um todo. Simplificando a última derivada: \[\frac{\partial F_2(X)}{\partial X_k}=-\frac{\left(X_k.\sigma_k^2+\sum_{j=1,j\neq k}^NX_j.\sigma_{j,k} \right)}{\left(\sum_{i=1}^N X_i^2.\sigma^2_i+2.\sum_{1<i<j<N}X_i.X_j.\sigma_{i,j} \right)^{3/2}}\] Juntando os termos, igualando a zero, temos: \[\frac{\partial\theta}{\partial X_k}=\frac{-\sum_{i=1}^N X_i.(\overline{R}_i-R_F).\left(X_k.\sigma_k^2+\sum_{j=1,j\neq k}^NX_j.\sigma_{j,k} \right)}{\left(\sum_{i=1}^N X_i^2.\sigma^2_i+2.\sum_{1<i<j<N}X_i.X_j.\sigma_{i,j} \right)^{3/2}} + \] \[+\frac{(\overline{R}_k-R_F)}{\left(\sum_{i=1}^N X_i^2.\sigma^2_i+2.\sum_{1<i<j<N}X_i.X_j.\sigma_{i,j}\right) ^{1/2}}\] Multiplicando por \(\left(\sum_{i=1}^N X_i^2.\sigma^2_i+2.\sum_{1<i<j<N}X_i.X_j.\sigma_{i,j}\right) ^{1/2}\) ambos os lados e simiplificando resulta em: \[\frac{\partial\theta}{\partial X_k}=-\frac{\sum_{i=1}^N X_i.(\overline{R}_i-R_F).\left(X_k.\sigma_k^2+\sum_{j=1,j\neq k}^NX_j.\sigma_{j,k} \right)}{\left(\sum_{i=1}^N X_i^2.\sigma^2_i+2.\sum_{1<i<j<N}X_i.X_j.\sigma_{i,j} \right)} + (\overline{R}_k-R_F)\] Chamando \(\lambda\) de \(\frac{\sum_{i=1}^N X_i.(\overline{R}_i-R_F)}{\left(\sum_{i=1}^N X_i^2.\sigma^2_i+2.\sum_{1<i<j<N}X_i.X_j.\sigma_{i,j}\right)}\) a expressão acima se torna: \[\frac{\partial\theta}{\partial X_k}=-\lambda.\left(X_k.\sigma_k^2+\sum_{j=1,j\neq k}^NX_j.\sigma_{j,k} \right)+(\overline{R}_k-R_F)\]

  3. O apostófro na notação faz referências as proporções que o mercado possui de cada ativo.

Júlio Fernando Costa Santos
Júlio Fernando Costa Santos
Professor of Economics

My research interests include Finance, Macroeconomics and Econometric techniques.

Related