Qual a relação entre o S&P 500 e a taxa de juro real?

A taxa de juros de um país define grande parte das decisões de curto e longo prazo dos agentes econômicos. No post de hoje, iremos analisar a relação entre a Taxa de Juro Real do EUA e o Índice S&P 500.

Ao lembrarmos do cálculo de preço de uma ação de uma empresa, consideramos que o seu preço hoje é definido com base nos fluxos de caixa esperados para a companhia ao longo do tempo, trazidos a valor presente por uma taxa de desconto.  Essa taxa de desconto é afetada, em partes, pela taxa de juro real da economia.

A taxa de juro real (ex-ante) é calculada de acordo com o juro nominal e a expectativa de inflação de um país. Em termos exatos, é definido pela equação:

 $ (1+r) = (1+i) / (1 +\pi) $

Essa equação é usualmente aproximada pela taxa de juros menos a taxa de inflação:

r ≅ i – π

Essa aproximação é útil para taxa relativamente pequenas da taxa de juros e de inflação.

Voltando para o efeito da taxa de juro real em relação as empresas, é fácil perceber que não somente o juros nominais afetam severamente as decisões de curto prazo de agente, mas também as de longo prazo. Além disso, é importante reconhecer que há a necessidade de realizar o ajuste do juros pela expectativas na inflação. A suposição, é que quanto mais elevado a taxa de juro real de uma economia, mais descontado será o preço de empresas em uma bolsa, portanto, haverá relações negativas entre as duas variáveis.

Para avaliar essa suposição, e consequentemente o relacionamento entre o efeito taxa de juros reais sobre as empresas, usaremos o índice S&P 500 e a taxa de juros reais de 10 anos do EUA.

Coleta e análise os dados da Taxa de Juros Real do EUA

A Taxa de Juro Real do EUA é obtida através do FRED, especificadamente pelo código REAINTRATREARAT10Y, referente a Taxa de Juro de 10 anos, em frequência mensal. A instituição também disponibiliza as Taxas em 1 mês e 1 ano, também com frequência mensal.

Coletamos os dados por meio da função getSymbols, do pacote {quantmod}, utilizando o código e relatando a fonte dentro da função.


library(timetk)
library(feasts)
library(tsibble)
library(ggplot2)
library(patchwork)
library(dplyr)
library(quantmod)
library(forecast)


### Coleta de dados - Juros reais - 10-Year Real Interest Rate

getSymbols('REAINTRATREARAT10Y',
src = 'FRED'
)

### Tratamento - Juros reais - 10-Year Real Interest Rate

real_int <- REAINTRATREARAT10Y |>
tk_tbl(preserve_index = TRUE,
rename_index = 'date') |>
rename(real_int = REAINTRATREARAT10Y) |>
mutate(date = yearmonth(date)) |>
as_tsibble(index = date)

Para o tratamento, transformamos os dados em tibble, e posteriormente em tsibble. Isso permitirá o uso de funções gráficas do pacote {feast}. Vejamos abaixo os gráficos da Taxa de Juros Real - 10 anos, vemos que há uma tendência de queda do indicador, bem como pequenos pontos de volatilidades ao longo do tempo.

</pre>
### Analisando - Juros reais - 10-Year Real Interest Rate

real_int |>
gg_tsdisplay(y = real_int,
plot = c("histogram")) 

Coleta e análise os dados do S&P 500

O Standard & Poor's 500 é um índice composto por cerca de 500 ativos. Vamos utiliza-lo como medida que represente as empresas norte americanas. Abaixo, coletamos os dados do índice através do Yahoo Finance, por meio do pacote {quantmod}, utilizando a função getSymbols.

</pre>
### Coleta de dados - S&P 500

getSymbols('^GSPC',
src = 'yahoo',
from = min(index(REAINTRATREARAT10Y))
)

### Tratamento de dados - S&P 500

sp_monthly_tbl <- to.monthly(GSPC) |>
tk_tbl(preserve_index = TRUE,
rename_index = 'date') |>
select(date,
price_adjusted = GSPC.Adjusted
) |>
mutate(date = yearmonth(date)) |>
as_tsibble(index = date)
<pre>

Na parte de tratamento dos dados, alteramos a frequência para mensal (como forma de igualar o período com a Taxa de Juros Real), além de transformar em tibble (os dados são importados em classe xts), e posteriormente em tsibble.

Pelo gráfico, é possível perceber que há uma tendência de alta no índice.

</pre>
### Analisando - S&P 500

sp_monthly_tbl |>
gg_tsdisplay(y = price_adjusted,
c("histogram"))
<pre>

Qual a relação entre as duas variáveis?

Acima entendemos as propriedades estatísticas de ambas as variáveis. Seguiremos a construir uma forma de obter o relacionamento entre ambas as variáveis.

</pre>
### Relação entre as variáveis
ir_plot <- ggplot(real_int, aes(x = date))+
geom_line(aes(y = real_int), size = 0.8, color = "darkblue")+
scale_y_continuous(breaks = seq(-3, 8, by = 2),
labels = scales::label_percent(scale = 01))+
labs(title = "Juros reais - 10-Year Real Interest Rate",
subtitle = "Código: REAINTRATREARAT10Y",
x = '',
y = '',
caption = "Fonte: FRED | Elaborado por: analisemacro.com.br")

sp_plot <- ggplot(sp_monthly_tbl, aes(x = date))+
geom_line(aes(y = price_adjusted), size = 0.8, color = "darkred")+
labs(title = "Índice S&P 500",
subtitle = "Código: ^GSP",
x = '',
y = '',
caption = "Fonte: Yahoo Finance | Elaborado por: analisemacro.com.br")

# Coloca lado a lado com o {patchwork}
ir_plot + sp_plot
<pre>

É possível analisar os gráficos da séries em conjunto. Vemos que a direção das séries são opostas ao longo do tempo, isso compactua com a suposição criada.

# Junta os dados
all_data <- real_int |> 
inner_join(sp_monthly_tbl, by = 'date') |> 
mutate(price_adjusted = log(price_adjusted))
</pre>
### Correlação

correlation::correlation(all_data)

# Parameter1 | Parameter2 | r | 95% CI | t(488) | p
# -------------------------------------------------------------------------
# real_int | price_adjusted | -0.78 | [-0.81, -0.74] | -27.32 | < .001***
#
# p-value adjustment method: Holm (1979)
# Observations: 490
<pre>
</pre>
## Regressão Linear Simples

reg_ir_sp <- dynlm::dynlm(price_adjusted ~ real_int, data = all_data)

summary(reg_ir_sp)

# Time series regression with "numeric" data:
# Start = 1, End = 490
#
# Call:
# dynlm::dynlm(formula = price_adjusted ~ real_int, data = all_data)
#
# Residuals:
# Min 1Q Median 3Q Max
# -1.35722 -0.46678 -0.08593 0.46985 2.55749
#
# Coefficients:
# Estimate Std. Error t value Pr(>|t|)
# (Intercept) 7.18976 0.03080 233.43 <2e-16 ***
# real_int -0.31538 0.01154 -27.32 <2e-16 ***
# ---
# Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
#
# Residual standard error: 0.5842 on 488 degrees of freedom
# Multiple R-squared: 0.6047, Adjusted R-squared: 0.6039
# F-statistic: 746.6 on 1 and 488 DF, p-value: < 2.2e-16
<pre>
</pre>
## Gráfico de Dispersão

ggplot(all_data, aes(x = real_int, y = price_adjusted))+
geom_point()+
geom_smooth(method = 'lm')+
labs(title = "Relação Taxa de Juros Real 10 anos - EUA x S&P 500",
caption = "Elaborado por analisemacro.com.br",
x = "Taxa de Juros Real",
y = "Índice S&P 500 - Log")
<pre>

Percebemos que há uma forte relação negativa. Bem como há significância estatística. Entretanto, isso realmente pode ser verdadeiro? Podemos aplicar testes no resíduos da regressão.

</pre>
# Teste Durbin Watson

lmtest::dwtest(reg_ir_sp)

# Durbin-Watson test
#
# data: reg_ir_sp
# DW = 0.16409, p-value < 2.2e-16
# alternative hypothesis: true autocorrelation is greater than 0

# Teste de estacionariedade do resíduos

tseries::adf.test(x = resid(reg_ir_sp))

# Augmented Dickey-Fuller Test
#
# data: resid(reg_ir_sp)
# Dickey-Fuller = -2.6773, Lag order = 7, p-value = 0.2916
# alternative hypothesis: stationary

# Analisa os resíduos

forecast::checkresiduals(reg_ir_sp)

# Breusch-Godfrey test for serial correlation of order up to 10
#
# data: Residuals
# LM test = 419.75, df = 10, p-value < 2.2e-16
<pre>

Pelo relativo alto valor do R² (60%), significância do coeficiente de regressão a 5%, além de considerar a tendência de ambas as séries, bem como suas distribuições e autocorrelação, é possível considerar que tenhamos uma regressão espúria. Isso pode ser provado através da avaliação do erros do modelo acima, por meio da estatística Durbin-Watson,  da estacionária do resíduos com um teste ADF e uma avaliação gráfica.

Considerações

Apesar de encontrar relações entre as duas variáveis, não é possível afirmar que isso seja verdadeiro. Propõe-se avaliar se as séries são cointegradas, além de testar as séries em diferentes ordens de integração.

Quer saber mais?

Conheça nossa Formação em Macroeconomia Aplicada.

Compartilhe esse artigo

Facebook
Twitter
LinkedIn
WhatsApp
Telegram
Email
Print

Comente o que achou desse artigo

Outros artigos relacionados

Transfer Learning: mostrando porque o Python está na ponta do desenvolvimento

A aprendizagem por transferência (transfer learning) é o reuso de um modelo pré-treinado em um novo problema. Portanto, sua utilização torna-se um avanço enorme para a previsão de diferentes tipos de variáveis, principalmente para aquelas ordenadas no tempo. Mostramos nesta postagem o uso do Transfer Learning com o Python para o caso de Séries Temporais.

Criando Tabelas com o Python: mostrando o poder da linguagem sobre o Excel

Nos dias atuais, pessoas que trabalham com dados estão constantemente confrontados com um dilema: criar uma tabela não tão genial no Excel ou manter em um formato ainda pior, como um dataframe, mas mantendo a flexibilidade de obtenção dos dados. Podemos resolver esse grande problema, unindo a flexibilidade e beleza ao usar a biblioteca great_tables do Python.

Análise do Censo Demográfico com o R

Como podemos analisar dados do Censo Demográfico para produzir pesquisas e implementar políticas públicas? Mostramos nesta postagem o resultado de uma breve análise dos dados preliminares do Censo Demográfico de 2022 usando o R.

como podemos ajudar?

Preencha os seus dados abaixo e fale conosco no WhatsApp

Boletim AM

Preencha o formulário abaixo para receber nossos boletins semanais diretamente em seu e-mail.