Existe correlação entre vagas de emprego e o S&P 500?

Introdução

Todo analista de dados conhece a sensação: um gráfico que simplesmente não parece certo. Desde o início de 2022, um desses gráficos tem dominado as discussões macroeconômicas. Ele mostra duas linhas que historicamente dançaram em um ritmo semelhante – o índice S&P 500 e o número de vagas de emprego em aberto (JOLTS) – de repente se separando em uma divergência dramática, formando o que muitos apelidaram de “boca de jacaré”.

Esta anomalia visual levanta questões fundamentais. Estaríamos testemunhando uma mudança estrutural, talvez acelerada pela ascensão da IA generativa, que quebrou a relação tradicional entre os mercados financeiros e a economia real? Ou seria esta divergência apenas um eco amplificado de um ciclo macroeconômico clássico, impulsionado pelo aperto monetário mais agressivo em quarenta anos?

Neste post, vamos mergulhar fundo nessa questão. Usaremos os próprios gráficos como nosso guia, começando pela evidência visual que gerou o debate, e então empregaremos um modelo de Vetor Autorregressivo (VAR) para submeter nossas hipóteses ao rigor estatístico.

Trajetória JOLTS x S&P 500

Para comparar duas séries de magnitudes tão distintas, a normalização é essencial. Ao escalar tanto o S&P 500 quanto as vagas em aberto para um intervalo de 0 a 1, podemos focar em suas tendências relativas.

O gráfico resultante é impressionante. Até 2022, as duas séries exibem um comovimento notável. Ambas caem durante a crise de 2008, se recuperam juntas e disparam após o choque inicial da pandemia de COVID-19. A partir do início de 2022, no entanto, a relação se desfaz. O S&P 500 (em amarelo) inicia uma queda acentuada, enquanto as vagas em aberto (em azul) permanecem em níveis historicamente elevados, apenas começando a moderar muito mais tarde.

É neste contexto que a narrativa da IA ganha força, com o lançamento do ChatGPT em novembro de 2022 (marcado pela linha tracejada) ocorrendo em meio a essa divergência. A hipótese é que as empresas, antecipando ganhos de produtividade com a IA, mantiveram o otimismo para contratações mesmo com os mercados financeiros sinalizando problemas. Mas seria essa a história completa?

Um economista sabe que nenhuma variável opera no vácuo. O gráfico seguinte revela o “ator principal” que estava fora do palco no primeiro gráfico: a política monetária do Federal Reserve.

Este gráfico mostra duas coisas cruciais. Primeiro, a subida quase vertical da taxa de juros básica (Fed Funds Rate), destacada pela área sombreada a partir de março de 2022. Segundo, a consequente inversão da curva de juros (Inclinação da Curva), que mergulha em território negativo – um dos mais confiáveis preditores de recessão.

A mensagem visual é clara: o S&P 500, um ativo forward-looking extremamente sensível às taxas de juros e às expectativas de crescimento, reagiu imediatamente a este novo regime. O mercado de trabalho, no entanto, opera com inércia e fricções. A relutância das empresas em demitir (“labor hoarding”) após a experiência traumática da pandemia manteve a demanda por trabalho artificialmente alta. O gráfico sugere que a divergência não foi causada por um novo fator (como a IA), mas sim pela velocidade de reação drasticamente diferente dos mercados financeiros e do mercado de trabalho a um choque macroeconômico massivo e comum.

Vemos esse efeito mais claramente quando comparamos o S&P 500 e JOLTS em suas taxas de variação interanuais.

Análise Econométrica: causalidade sentido granger

A narrativa visual é convincente, mas para um econometrista, ela é apenas o ponto de partida. Para testar formalmente essas relações, construímos um modelo VAR(2) com as séries em variação anual (YoY), garantindo a estacionariedade e permitindo uma interpretação econômica direta.

Primeiro, é necessário confirmar a estacionariedade das séries temporais. Para isto, fazemos o uso do teste de estacionariedade ADF. Com valor crítico de 0.10, confirmamos que as 3 séries são estacionárias.

[1] "S&P 500 YoY p-valor: 0.0175"
[1] "Jobs YoY p-valor: 0.0961"
[1] "Yield Slope p-valor: 0.0652
AIC(n)  HQ(n)  SC(n) FPE(n) 
     3      2      1      3 
Código
# O número ótimo de lags 'p' é geralmente o que é sugerido pela maioria dos critérios (AIC, HQ, SC)
[1] "Número de lags escolhido (p): 2"
VAR Estimation Results:
========================= 
Endogenous variables: sp500_yoy, jobs_yoy, yield_slope 
Deterministic variables: const 
Sample size: 210 
Log Likelihood: 518.598 
Roots of the characteristic polynomial:
0.974 0.8968 0.8968 0.3188 0.1919 0.002646
Call:
vars::VAR(y = dados_para_analise, p = p, type = "const")


Estimation results for equation sp500_yoy: 
========================================== 
sp500_yoy = sp500_yoy.l1 + jobs_yoy.l1 + yield_slope.l1 + sp500_yoy.l2 + jobs_yoy.l2 + yield_slope.l2 + const 

                Estimate Std. Error t value Pr(>|t|)    
sp500_yoy.l1    0.977991   0.070753  13.823   <2e-16 ***
jobs_yoy.l1    -0.077218   0.053773  -1.436    0.153    
yield_slope.l1  0.023109   0.020726   1.115    0.266    
sp500_yoy.l2   -0.048404   0.074029  -0.654    0.514    
jobs_yoy.l2     0.046817   0.050671   0.924    0.357    
yield_slope.l2 -0.025257   0.021070  -1.199    0.232    
const           0.012343   0.007989   1.545    0.124    
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1


Residual standard error: 0.06774 on 203 degrees of freedom
Multiple R-Squared: 0.8387, Adjusted R-squared: 0.8339 
F-statistic: 175.9 on 6 and 203 DF,  p-value: < 2.2e-16 


Estimation results for equation jobs_yoy: 
========================================= 
jobs_yoy = sp500_yoy.l1 + jobs_yoy.l1 + yield_slope.l1 + sp500_yoy.l2 + jobs_yoy.l2 + yield_slope.l2 + const 

                Estimate Std. Error t value Pr(>|t|)    
sp500_yoy.l1    0.330167   0.091698   3.601 0.000399 ***
jobs_yoy.l1     0.632717   0.069691   9.079  < 2e-16 ***
yield_slope.l1  0.002261   0.026861   0.084 0.933000    
sp500_yoy.l2   -0.094288   0.095943  -0.983 0.326901    
jobs_yoy.l2     0.195457   0.065670   2.976 0.003272 ** 
yield_slope.l2  0.011489   0.027307   0.421 0.674392    
const          -0.032931   0.010354  -3.181 0.001700 ** 
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1


Residual standard error: 0.0878 on 203 degrees of freedom
Multiple R-Squared: 0.8584, Adjusted R-squared: 0.8542 
F-statistic: 205.1 on 6 and 203 DF,  p-value: < 2.2e-16 


Estimation results for equation yield_slope: 
============================================ 
yield_slope = sp500_yoy.l1 + jobs_yoy.l1 + yield_slope.l1 + sp500_yoy.l2 + jobs_yoy.l2 + yield_slope.l2 + const 

                Estimate Std. Error t value Pr(>|t|)    
sp500_yoy.l1    0.436717   0.224675   1.944   0.0533 .  
jobs_yoy.l1    -0.127661   0.170754  -0.748   0.4555    
yield_slope.l1  1.274901   0.065815  19.371  < 2e-16 ***
sp500_yoy.l2   -0.304441   0.235075  -1.295   0.1968    
jobs_yoy.l2     0.033214   0.160903   0.206   0.8367    
yield_slope.l2 -0.285801   0.066906  -4.272 2.98e-05 ***
const           0.000451   0.025368   0.018   0.9858    
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1


Residual standard error: 0.2151 on 203 degrees of freedom
Multiple R-Squared: 0.9747, Adjusted R-squared: 0.974 
F-statistic:  1305 on 6 and 203 DF,  p-value: < 2.2e-16 



Covariance matrix of residuals:
             sp500_yoy   jobs_yoy yield_slope
sp500_yoy    0.0045893  0.0009498  -0.0002658
jobs_yoy     0.0009498  0.0077085  -0.0009284
yield_slope -0.0002658 -0.0009284   0.0462763

Correlation matrix of residuals:
            sp500_yoy jobs_yoy yield_slope
sp500_yoy     1.00000  0.15969    -0.01824
jobs_yoy      0.15969  1.00000    -0.04916
yield_slope  -0.01824 -0.04916     1.00000

Teste de especificação do VAR

Abaixo verificamos a autocorrelação e normalidade do modelo VAR:

Autocorrelação

Código
    Portmanteau Test (asymptotic)

data:  Residuals of VAR object modelo_var
Chi-squared = 255.15, df = 126, p-value = 8.662e-11

Normalidade

Código
$JB

    JB-Test (multivariate)

data:  Residuals of VAR object modelo_var
Chi-squared = 1435.4, df = 6, p-value < 2.2e-16


$Skewness

    Skewness only (multivariate)

data:  Residuals of VAR object modelo_var
Chi-squared = 140.01, df = 3, p-value < 2.2e-16


$Kurtosis

    Kurtosis only (multivariate)

data:  Residuals of VAR object modelo_var
Chi-squared = 1295.4, df = 3, p-value < 2.2e-16

Teste Causalidade sentido Granger

Resultado 1:

  • Hipótese: A variação do S&P 500 Granger-causa a variação das vagas em aberto.
  • Resultado: p-valor = 3.68e-05. Hipótese nula rejeitada.

Interpretação: Este é o resultado mais forte da nossa análise. Ele confirma estatisticamente o que os gráficos sugerem: a performance do mercado de ações é um poderoso indicador antecedente para o mercado de trabalho. As expectativas dos investidores, que derrubaram o S&P 500 em 2022, continham informação valiosa que precedeu a eventual desaceleração na criação de vagas.

Resultado 2:

  • Hipótese: A variação das vagas em aberto Granger-causa a variação do S&P 500.
  • Resultado: p-valor = 0.4165. Hipótese nula não rejeitada.

Interpretação: A resiliência do mercado de trabalho, embora tenha sido o foco de muitas análises, não demonstrou ter poder preditivo sobre a direção do mercado de ações. O S&P 500 estava mais focado no aperto monetário e nas expectativas de recessão do que nos dados retroativos de um mercado de trabalho ainda aquecido por fatores pós-pandêmicos.

Resultado 3:

  • Hipótese: A inclinação da curva de juros Granger-causa o sistema.
  • Resultado: p-valor = 0.0789. Hipótese nula rejeitada (a 10%).

Interpretação: Este resultado valida a nossa narrativa visual. A inclinação da curva, nosso proxy para as expectativas do ciclo econômico e da política monetária, é um motor causal para ambas as variáveis. Isso reforça a conclusão de que o choque de política monetária foi o evento iniciador que desencadeou as dinâmicas subsequentes.

Código
# Teste 1: S&P 500 YoY causa Jobs YoY?
# H0: sp500_yoy NÃO Granger-causa jobs_yoy
causality_sp_to_jobs <- vars::causality(modelo_var, cause = "sp500_yoy", vcov. = sandwich::vcovHC(modelo_var))
print("--- H0: S&P 500 YoY NÃO Granger-causa Jobs YoY ---")
[1] "--- H0: S&P 500 YoY NÃO Granger-causa Jobs YoY ---"
Código
print(causality_sp_to_jobs)
$Granger

    Granger causality H0: sp500_yoy do not Granger-cause jobs_yoy
    yield_slope

data:  VAR object modelo_var
F-Test = 6.545, df1 = 4, df2 = 609, p-value = 3.68e-05


$Instant

    H0: No instantaneous causality between: sp500_yoy and jobs_yoy
    yield_slope

data:  VAR object modelo_var
Chi-squared = 5.2434, df = 2, p-value = 0.07268
Código
# Teste 2: Jobs YoY causa S&P 500 YoY?
# H0: jobs_yoy NÃO Granger-causa sp500_yoy
causality_jobs_to_sp <- vars::causality(modelo_var, cause = "jobs_yoy", vcov. = sandwich::vcovHC(modelo_var))
print("--- H0: Jobs YoY NÃO Granger-causa S&P 500 YoY ---")
[1] "--- H0: Jobs YoY NÃO Granger-causa S&P 500 YoY ---"
Código
print(causality_jobs_to_sp)
$Granger

    Granger causality H0: jobs_yoy do not Granger-cause sp500_yoy
    yield_slope

data:  VAR object modelo_var
F-Test = 0.98244, df1 = 4, df2 = 609, p-value = 0.4165


$Instant

    H0: No instantaneous causality between: jobs_yoy and sp500_yoy
    yield_slope

data:  VAR object modelo_var
Chi-squared = 5.6481, df = 2, p-value = 0.05936
Código
# Testes adicionais para entender a dinâmica completa
# Yield Slope causa S&P 500 YoY?
causality_yield_to_sp <- vars::causality(modelo_var, cause = "yield_slope", vcov. = sandwich::vcovHC(modelo_var))
print("--- H0: Yield Slope NÃO Granger-causa S&P 500 YoY ---")
[1] "--- H0: Yield Slope NÃO Granger-causa S&P 500 YoY ---"
Código
print(causality_yield_to_sp)
$Granger

    Granger causality H0: yield_slope do not Granger-cause sp500_yoy
    jobs_yoy

data:  VAR object modelo_var
F-Test = 2.1036, df1 = 4, df2 = 609, p-value = 0.07891


$Instant

    H0: No instantaneous causality between: yield_slope and sp500_yoy
    jobs_yoy

data:  VAR object modelo_var
Chi-squared = 0.52936, df = 2, p-value = 0.7675
Código
# Yield Slope causa Jobs YoY?
causality_yield_to_jobs <- vars::causality(modelo_var, cause = "yield_slope", vcov. = sandwich::vcovHC(modelo_var))
print("--- H0: Yield Slope NÃO Granger-causa Jobs YoY ---")
[1] "--- H0: Yield Slope NÃO Granger-causa Jobs YoY ---"
Código
print(causality_yield_to_jobs)
$Granger

    Granger causality H0: yield_slope do not Granger-cause sp500_yoy
    jobs_yoy

data:  VAR object modelo_var
F-Test = 2.1036, df1 = 4, df2 = 609, p-value = 0.07891


$Instant

    H0: No instantaneous causality between: yield_slope and sp500_yoy
    jobs_yoy

data:  VAR object modelo_var
Chi-squared = 0.52936, df = 2, p-value = 0.7675

Conclusão

A “boca de jacaré” que intrigou tantos analistas não parece ser o sinal de uma nova era impulsionada pela IA, mas sim a manifestação visual de um ciclo macroeconômico clássico, exacerbado pelas condições únicas do pós-pandemia.

Os gráficos nos contaram uma história de reação em duas velocidades: a resposta instantânea e brutal dos mercados financeiros a um aperto monetário agressivo, e a reação lenta e retardada de um mercado de trabalho com fricções estruturais.

Embora o impacto da IA no mercado de trabalho seja uma questão crucial para o futuro, a grande divergência de 2022-2023 tem uma explicação mais imediata e fundamentada nos princípios da macroeconomia. Os gráficos nos mostraram o que aconteceu, e a econometria nos explicou o porquê.

Compartilhe esse artigo

Facebook
Twitter
LinkedIn
WhatsApp
Telegram
Email
Print

Comente o que achou desse artigo

Outros artigos relacionados

Existe correlação entre vagas de emprego e o S&P 500?

O que explica a divergência entre S&P 500 e vagas de emprego? Seria o impacto da IA ou a política monetária? Utilizando um análise dados e modelo VAR e testes de causalidade de Granger usando a linguagem de programação R, investigamos a relação e o motivo por trás da "boca de jacaré".

Como medir a comunicação do Banco Central?

Descubra como o índice ALT transforma a linguagem do Banco Central em dados analisáveis, permitindo investigar como o tom das atas do COPOM varia conforme o cenário macroeconômico e as decisões de política monetária.

Análise de Séries Temporais com a Linguagem R: dados ISP-RJ

Neste tutorial, vamos conduzir uma análise diagnóstica completa. Começaremos visualizando a série e sua tendência, depois a decomporemos em seus componentes fundamentais. Em seguida, investigaremos a distribuição estatística dos dados e, por fim, aplicaremos técnicas mais avançadas, como a análise de autocorrelação e testes de estacionariedade, que são pré-requisitos cruciais para a construção de modelos de previsão robustos como o ARIMA.

Boletim AM

Receba diretamente em seu e-mail gratuitamente nossas promoções especiais e conteúdos exclusivos sobre Análise de Dados!

Boletim AM

Receba diretamente em seu e-mail gratuitamente nossas promoções especiais e conteúdos exclusivos sobre Análise de Dados!

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.