Índice Cont — termômetro mensal de condições para PME brasileiras

Índice mensal composto (-3 a +3) de condições PME — 10 componentes públicos (BCB, IBGE, CAGED) em 4 sub-índices: crédito, demanda, trabalho, monetário.

Pipeline cont_lab_31_cont_lab_index rodado em 2026-05-25 sobre a janela 2014-012026-04. O índice composto está definido em 124 dos 148 meses da grade (84%) — os 24 meses iniciais perdem-se por exigência mínima de 24 observações para o z-score rolante (W = 60m). Saídas em outputs/resultado.parquet (148 × 12) e outputs/componentes.parquet (1.480 × 7).

Sumário executivo

  • Índice em 2026-03 = +0,353 (regime expansão), após sopro defensivo em jan/fev por reversão de concessoes_pj_real. Mês corrente (2026-04) só tem selic_real fechado — leitura preliminar neutra (−0,10).
  • Sub-trabalho domina o nível atual (+0,90), com PNAD em 6,1 % e CAGED-alvo positivo. Sub-monetário ainda em terreno negativo (−0,11) por selic_real ≈ 5 pp acima da neutralidade.
  • Validação histórica: mínimo −2,147 em 2016-02 (recessão Dilma), máximo +1,711 em 2019-12 (pré-pandemia). Top-5 picos posteriores são todos dezembros — sazonalidade de fim-de-ano em PMC/PMS.
  • Estacionariedade: ADF do indice_cont rejeita raiz unitária (t = −3,59 contra −2,86 crítico a 5 %). Sub-crédito e sub-demanda também são I(0); sub-trabalho (t = −2,05) e sub-monetário (t = −1,93) não rejeitam, refletindo persistência inflacionária e do desemprego estrutural.
  • Correlações esperadas: monetario × trabalho = −0,80 (juros ⇒ desemprego), demanda × trabalho = +0,61, demanda × monetario = −0,59. Sub-crédito é o mais ortogonal (|r| ≤ 0,27), justificando peso próprio.
  • Regimes em 124 meses definidos: 39 expansão (31 %), 68 neutro (55 %), 17 contração (14 %). Contração concentrada em 2016-01 → 2016-11 (11 meses consecutivos) — o índice replica corretamente a recessão sem que isso tenha sido imposto.

1. Construção do índice

Score mensal composto, normalizado em desvios-padrão, agregando 10 componentes em 4 sub-índices:

Sub-índiceComponentesFonte primária
Créditoinad_pj, concessoes_pj_real, juros_spreadBCB SGS 21088 / 20631 / 20722 − 432
Demandapms_volume, pmc_volumeIBGE SIDRA T6442 / T8880
Trabalhocaged_saldo_alvo, desocupacao_pnadME-CAGED + BCB SGS 24369
Monetárioselic_real, ipca_acum12m, ettj_inclinacaoBCB SGS 432 / 433 + ANBIMA

Para cada componente i no mês t, calculamos um z-score com janela rolante de W = 60 meses (mínimo 24 obs):

`` z_{i,t} = sinal_i × (x_{i,t} − μ_{i, t−W..t−1}) / σ_{i, t−W..t−1} ``

sinal_i ∈ {+1, −1} inverte componentes onde "mais = pior" (inadimplência, juros, IPCA, desocupação, Selic real, curva invertida). Cada sub-índice é média simples dos z-scores disponíveis; o composto é média dos 4 sub-índices; regime usa cortes em ±0,5σ. Normalização rolante (não global) é deliberada — captura distância de normalidade móvel, apropriado para um indicador de condições, não de nível.

2. Série histórica (2016-01 → 2026-04)

![](/posts/figs/cont-lab-index_01.png)

A série sintetiza onze anos de macro brasileira:

  • 2016: vale duplo (−2,15 em fev/16; média anual −1,32) — única contração de 11 meses consecutivos da série.
  • 2017–19: recuperação lenta, até o pico pré-pandemia (+1,71 em dez/19) com Selic 4,5 %.
  • 2020: choque pandêmico não aparece como contração — amortecido pela explosão de concessoes_pj_real (Pronampe, BNDES emergencial) e queda da Selic. Lição: índices financeiros podem mascarar choques de demanda quando a resposta de crédito é heroica.
  • 2022: segunda melhor média da série (+0,85), puxada por PMC/PMS aquecidos.
  • 2024–25: dois anos consecutivos em expansão estrutural (médias +0,63 e +0,49); 13 de 24 meses no regime expansão.
  • 2026 YTD: média +0,27, com março voltando a expansão.

3. Decomposição por sub-índice (estado atual e últimos 12 meses)

MêsSub-créditoSub-demandaSub-trabalhoSub-monetárioÍndice ContRegime
2025-07−0,27+1,39+1,35−0,42+0,51expansão
2025-08−1,14+1,31+1,31−0,38+0,27neutro
2025-10−0,64+1,45+1,31−0,27+0,46neutro
2025-12+0,62+2,66+1,35−0,19+1,11expansão
2026-01−0,10+0,69+1,21−0,19+0,40neutro
2026-02−0,11+0,08+1,03−0,11+0,22neutro
2026-03+0,35+1,11+0,90−0,11+0,56expansão
2026-04n/dn/dn/d−0,10−0,10neutro (prelim.)

Quatro observações:

  1. Sub-trabalho é o esteio há 12 meses — entre +0,90 e +1,35 sem exceção. Desocupação PNAD ≈ 6 % e CAGED-alvo positivo seguram o índice mesmo quando o crédito tropeça.
  2. Sub-demanda é o mais volátil: +0,08 (fev/26) a +2,66 (dez/25). Efeito sazonal de fim-de-ano em PMC é nítido — em série dessazonalizada cairia para perto de +1.
  3. Sub-crédito é o pivô recente: de −1,14 (ago/25, choque inad_pj) para +0,62 (dez/25, alívio de concessões) e +0,35 em mar/26.
  4. Sub-monetário é lastro negativo: Selic real ≈ 5 pp acima da neutralidade recente. Sem corte na Selic, é matemática difícil empurrar esse sub para o positivo.

![](/posts/figs/cont-lab-index_02.png)

4. Correlações entre sub-índices

A matriz de Pearson sobre os 124 meses com índice definido confirma a estrutura macroeconômica esperada e ajuda a justificar a opção por pesos iguais entre sub-índices (sem fator latente).

CréditoDemandaTrabalhoMonetário
Crédito1,000,13−0,190,27
Demanda0,131,000,61−0,59
Trabalho−0,190,611,00−0,80
Monetário0,27−0,59−0,801,00

A correlação trabalho × monetário = −0,80 é a mais forte da matriz e fica dentro do limite de alerta (|r| > 0,85 dispararia aviso de colinearidade). É a transmissão clássica de política monetária para emprego no Brasil — Selic real alta esfria a demanda agregada e devolve desemprego com defasagem de 2–4 trimestres. Sub-crédito é o mais ortogonal (|r| ≤ 0,27), o que valida tratá-lo como dimensão independente.

![](/posts/figs/cont-lab-index_03.png)

5. Validação estatística

5.1 Estacionariedade (ADF, valor crítico a 5 % ≈ −2,86)

Sériet-stat ADFLag ótimonEstacionária a 5 %?
indice_cont−3,592124sim
sub_credito−3,262123sim
sub_demanda−3,292123sim
sub_trabalho−2,054123não
sub_monetario−1,943113não

O índice composto é estacionário, mas dois sub-índices não rejeitam raiz unitária. Sub-trabalho tem persistência baixa — as recuperações pós-2016 e pós-2020 foram lentas e monotônicas. Sub-monetário carrega a inércia do IPCA 12m e do regime Selic. Para uso preditivo: o índice agregado pode ser modelado em nível (ARMA, VAR); sub-índices exigirão diferenciação ou cointegração.

5.2 Top-5 picos e vales

#Pico (expansão)ÍndiceVale (contração)Índice
12019-12+1,7112016-02−2,147
22021-12+1,3732016-01−1,931
32022-12+1,1902016-03−1,854
42024-12+1,1242016-04−1,698
52025-12+1,1092016-05−1,360

Viés sazonal nos picos (todos dezembros) é real — sazonalidade de PMC/PMS e bônus CAGED. Em série dessazonalizada, o pico cairia para +0,8 a +1,0.

6. Componentes e leitura prática

![](/posts/figs/cont-lab-index_04.png)

A rede de componentes (figura 4) ajuda a inspecionar qual variável puxa cada bloco. Médias da série completa: concessões PJ reais R$ 264 bi/mês, pico R$ 414 bi em mar/20 (BNDES emergencial), z atual ≈ +0,9; Selic real média 4,4 pp, máximo +11,2 pp em dez/16, hoje ≈ 5 pp. Dois componentes estão ausentes no snapshot atual: CAGED-alvo (gap em lib/caged.py) e ETTJ inclinação (pendência ANBIMA) — sub-monetário opera com 2 de 3 esperados.

Leitura agregada: Brasil em 2026-Q1 está em expansão moderada, não eufórica. Composição é assimétrica — trabalho e demanda traçam, monetário freia, crédito oscila no zero. Choque adverso em emprego move o índice rapidamente para baixo dada a baixa folga monetária. O índice complementa o Termômetro PME diário publicado em 2026-05-25: aquele detecta turbulência em janela curta (5–10 dias); este confirma regime em janela mensal.

Limitações e próximos passos

  • CAGED e ETTJ ausentes no snapshot atual — z-scores não calculados; sub-monetário e sub-trabalho perdem 1 componente cada. Corrigir lib/caged.fetch_caged_mes (gap de p7z) e lib/anbima.fetch_ettj.
  • Sem dessazonalização explícita — picos de dezembro inflam +0,5 a +0,8σ. Próxima iteração aplica seasonal_decompose aditivo em PMC/PMS/CAGED.
  • Validação preditiva pendente: Granger causality indice_cont → CAGED total (lead 1–3m), o teste mais convincente da utilidade prática.
  • Pesos iguais entre sub-índices é hipótese, não estimativa — testar PCA dinâmico e comparar com fator latente.

Fontes primárias

  • BCB SGS (API JSON): séries 21088 (inadimplência PJ >90d), 20631 (concessões PJ), 20722 (juros médios PJ), 432 (Selic meta), 433 (IPCA mensal), 24369 (desocupação PNAD-C), 29037 (endividamento famílias) — janela 2014-01-01 → 2026-04-30.
  • IBGE SIDRA (API REST): tabela 6442/variável 11622 (PMS volume serviços), tabela 8880/variável 7169 (PMC volume varejo) — Nível 1 (Brasil), todas as competências.
  • ME — Novo CAGED: arquivos mensais CAGEDMOV{YYYYMM}.7z (FTP PDET), seções CNAE G/J/M/Q (lib/cnae_alvo.py).
  • BCB Olinda — Expectativas Focus: usado para validação cruzada (lead/lag com IPCA esperado ano corrente).
  • ANBIMA — ETTJ pré: arquivo CSV CZ-down.asp, vértices 63du e 252du da curva pré, slope = 252−63.

Reprodutibilidade

Código em lab/labs/cont_lab_31_cont_lab_index/. Pipeline:

`` uv run python code/collect.py # BCB SGS + SIDRA + CAGED + Focus + ANBIMA uv run python code/clean.py # melt → raw parquets → components.parquet uv run python code/model.py # z-rolling 60m + sub-índices + indice_cont + ADF + correlações uv run python code/figures.py # fig1..fig4 ``

Artefatos persistidos: outputs/resultado.parquet (148 × 12, série mensal completa com sub-índices), outputs/componentes.parquet (1.480 × 7, longo: data × componente × z-score) e outputs/metrics.json (descritivas, regimes, ADF, top-5, correlações). Plano original e schemas em notes/plano_execucao.md; logs de coleta em notes/collect_log.md.