Como Analisar Macro Data com R banner image

By Language

Quick Start Guides

Como Analisar Macro Data com R

Um guia prático para obter, ordenar e visualizar séries temporais de indicadores FXMacroData em R usando httr2, jsonlite e ggplot2 de chamada de API para gráfico pronto para publicação em menos de 50 linhas de código.

Também disponível em English

R é uma das linguagens mais poderosas para análise estatística e modelagem financeira e tem um ecossistema maduro para trabalhar com dados de séries temporais. httr2 E ... jsonlita No final, você terá um fluxo de trabalho R reutilizável que extrai dados do banco central, constrói um tibble arrumado e produz um gráfico pronto para publicação tudo em menos de 50 linhas de código.

O que você vai construir

Um script R totalmente reprodutível que autentica contra a API REST FXMacroData, recupera a taxa de política e as séries temporais de inflação para várias moedas, as une em um único tibble e as traça com ggplot2 pronto para ser incorporado em um relatório Quarto ou R Markdown.

Requisitos prévios

  • R ≥ 4,2 e RStudio (ou qualquer ambiente R)
  • Os seguintes pacotes: httr2- Não . jsonlite- Não . dplyr- Não . tidyr- Não . lubridate- Não . ggplot2
  • Uma chave da API do FXMacroData registe-se em / subscrever para conseguir uma

Instale os pacotes necessários uma vez, se ainda não os tiver:

install.packages(c("httr2", "jsonlite", "dplyr", "tidyr", "lubridate", "ggplot2"))

Passo 1 Compreender a forma da API

Cada ponto final do indicador FXMacroData segue o mesmo padrão de URL:

GET https://fxmacrodata.com/api/v1/announcements/{currency}/{indicator}?api_key=YOUR_API_KEY

A resposta é um objeto JSON com um data matriz onde cada elemento tem um date E um val campo (e opcionalmente um announcement_datetime Por exemplo, obtendo a taxa de política da Reserva Federal dos EUA:

curl "https://fxmacrodata.com/api/v1/announcements/usd/policy_rate?api_key=YOUR_API_KEY&start=2022-01-01"
{
  "data": [
    { "date": "2025-03-19", "val": 4.25, "announcement_datetime": "2025-03-19T18:00:00Z" },
    { "date": "2025-01-29", "val": 4.25, "announcement_datetime": "2025-01-29T19:00:00Z" },
    { "date": "2024-12-18", "val": 4.25, "announcement_datetime": "2024-12-18T19:00:00Z" }
  ]
}

Esta estrutura limpa mapeia perfeitamente para um quadro de dados R com transformação mínima.

Passo 2 Configure sua chave de API

Armazenar sua chave de API em uma variável de ambiente em vez de codificá-lo em scripts. ~/.Renviron Ficheiro:

FXMD_API_KEY=your_actual_api_key_here

Depois recarregue o ambiente e recupere a chave no topo de cada script:

readRenviron("~/.Renviron")
API_KEY <- Sys.getenv("FXMD_API_KEY")
if (nchar(API_KEY) == 0) stop("FXMD_API_KEY is not set in .Renviron")

Dica de segurança

Nunca comprometa chaves de API para controle de versão. .Renviron - Para o teu ... .gitignore Para implementações reprodutíveis, use um gerenciador de segredos ou uma variável de ambiente CI.

Passo 3 Escreva um Auxiliar de Recuperação Genérico

Com httr2 Você cria solicitações declarativamente, lida com erros explicitamente e decodifica JSON em um único pipeline.

library(httr2)
library(jsonlite)
library(dplyr)
library(lubridate)

BASE_URL <- "https://fxmacrodata.com/api/v1"

#' Fetch an indicator time series from FXMacroData
#'
#' @param currency  Three-letter currency code, e.g. "usd", "eur", "gbp"
#' @param indicator Indicator slug, e.g. "policy_rate", "inflation", "gdp"
#' @param start     Optional start date as "YYYY-MM-DD" string
#' @param end       Optional end date as "YYYY-MM-DD" string
#' @return A tibble with columns: date (Date), val (numeric), currency (chr), indicator (chr)
fetch_indicator <- function(currency, indicator, start = NULL, end = NULL) {
  req <- request(BASE_URL) |>
    req_url_path_append("announcements", currency, indicator) |>
    req_url_query(api_key = API_KEY) |>
    req_error(is_error = \(resp) resp_status(resp) >= 400)

  if (!is.null(start)) req <- req |> req_url_query(start = start)
  if (!is.null(end))   req <- req |> req_url_query(end   = end)

  resp <- req |> req_perform()
  rows <- resp |> resp_body_json(simplifyVector = TRUE)

  as_tibble(rows$data) |>
    mutate(
      date      = as_date(date),
      val       = as.numeric(val),
      currency  = toupper(currency),
      indicator = indicator
    )
}

As principais escolhas aqui: req_error() garante que as respostas HTTP 4xx/5xx lancem uma condição R em vez de retornarem silenciosamente dados errados; resp_body_json(simplifyVector = TRUE) coerce matrizes aninhadas diretamente para um quadro de dados em vez de uma lista; e as_date() do lubrificante dá-lhe um bom Date Coluna imediatamente.

Passo 4 Obter várias moedas e indicadores

Agora use o auxiliar para puxar as taxas de política para quatro moedas do G4 em uma janela de três anos exatamente o tipo de comparação multi-moeda que impulsiona decisões de negociação de divergência:

currencies <- c("usd", "eur", "gbp", "jpy")
START      <- "2022-01-01"

# Pull policy rates for all four currencies and stack into one tibble
policy_rates <- purrr::map_dfr(
  currencies,
  \(ccy) fetch_indicator(ccy, "policy_rate", start = START)
)

# Quick check
dplyr::glimpse(policy_rates)
#> Rows: ~80
#> Columns: date <date>, val <dbl>, currency <chr>, indicator <chr>

Por exemplo, puxando a inflação geral ao lado das taxas de juros permite calcular o spread de taxa real, um fator chave do posicionamento do carry-trade:

inflation <- purrr::map_dfr(
  currencies,
  \(ccy) fetch_indicator(ccy, "inflation", start = START)
)

# Combine into one tidy frame
macro_data <- bind_rows(policy_rates, inflation)

Indicadores que podem ser obtidos

O catálogo completo está disponível em: fxmacrodata.com/api-data-docsAs séries-chave para a análise de divisas incluem: Taxa de política- Não . inflação- Não . PIB- Não . desempregoE ... PMITodas as séries usam o mesmo padrão de busca apenas mudar a moeda e o indicador de lesma.

Passo 5 Limpe e refaça os dados

Para a maioria das análises , quer os dados . largura O formato uma coluna por indicador por moeda em vez do formato ordenado empilhado devolvido pela API. pivot_wider() A chamada lida com isto numa única etapa, e fill() Apresenta as observações de anúncios escassos do banco central numa grelha mensal regular:

library(tidyr)

# Build a regular monthly date spine
date_spine <- tibble(date = seq.Date(as_date(START), Sys.Date(), by = "month"))

# Pivot to wide: one row per date, columns = currency_indicator
wide_data <- macro_data |>
  # Use year-month as join key so quarterly data aligns to month boundaries
  mutate(date = floor_date(date, "month")) |>
  pivot_wider(
    names_from  = c(currency, indicator),
    values_from = val,
    values_fn   = \(x) last(x)   # take latest reading within each month
  )

# Left-join onto the date spine and forward-fill sparse series
full_data <- date_spine |>
  left_join(wide_data, by = "date") |>
  fill(everything(), .direction = "down")

head(full_data)

Passo 6 Cálculo dos diferenciais de taxa real

Um diferencial de taxa real é a taxa de juro menos a inflação um diferencial positivo significa que o banco central está em território restritivo em relação ao crescimento dos preços ao consumidor.

spread_data <- full_data |>
  mutate(
    real_rate_usd = USD_policy_rate - USD_inflation,
    real_rate_eur = EUR_policy_rate - EUR_inflation,
    real_rate_gbp = GBP_policy_rate - GBP_inflation,
    real_rate_jpy = JPY_policy_rate - JPY_inflation,
    # EUR minus USD spread: positive = EUR relatively less restrictive
    eur_usd_spread = real_rate_eur - real_rate_usd
  )

Passo 7 Visualizar com ggplot2

Com o tibble arrumado pronto, um gráfico de várias linhas ggplot2 leva algumas linhas. colour Estética:

library(ggplot2)

policy_rates |>
  ggplot(aes(x = date, y = val, colour = currency)) +
  geom_step(linewidth = 0.9) +
  scale_colour_manual(
    values = c(USD = "#2563eb", EUR = "#16a34a", GBP = "#7c3aed", JPY = "#dc2626")
  ) +
  scale_y_continuous(labels = scales::label_percent(scale = 1)) +
  labs(
    title   = "G4 Central Bank Policy Rates",
    x       = NULL,
    y       = "Policy rate (%)",
    colour  = "Currency",
    caption = "Source: FXMacroData"
  ) +
  theme_minimal(base_size = 13) +
  theme(legend.position = "bottom")

Utilize geom_step() em vez de ... geom_line() para as séries de taxas de juro as decisões do banco central são alterações discretas de escada e um gráfico de etapas representa-as corretamente.

Etapa 8 Exportação para um relatório

Se você estiver incorporando este gráfico em um documento Quarto ou R Markdown, salve o quadro de dados em um CSV para reprodução e o gráfico para um PNG de alta resolução para renderização em linha:

readr::write_csv(spread_data, "macro_spread_data.csv")

ggsave(
  filename = "policy_rates.png",
  width    = 10,
  height   = 5.6,
  dpi      = 150
)

Para painéis interativos, o mesmo tibble alimenta diretamente o plotly::ggplotly() para interatividade sem atrito.

Passo 9 Automatizar com um script programado

Para manter sua análise atual sem re-executar manualmente, envolva a lógica de busca em um script R independente e agende-a com cronR (Linux/macOS) ou o Planeador de Tarefas do Windows:

# file: refresh_macro.R — run daily at 08:00 UTC
readRenviron("~/.Renviron")
source("fetch_helpers.R")

macro_data <- purrr::map_dfr(
  tidyr::crossing(
    currency  = c("usd", "eur", "gbp", "jpy"),
    indicator = c("policy_rate", "inflation", "unemployment")
  ),
  \(row) fetch_indicator(row$currency, row$indicator, start = "2020-01-01")
)

readr::write_csv(macro_data, paste0("data/macro_", Sys.Date(), ".csv"))
message("Refresh complete: ", nrow(macro_data), " observations written.")

Junta isto com o ... ponto final do calendário de liberação para acionar atualizações apenas nos dias em que se esperam dados de alto impacto, poupando chamadas desnecessárias de API em dias tranquilos.

Exemplo completo de trabalho

Todos os trechos acima combinam-se num único script de 60 linhas. FXMD_API_KEY - No teu ... .Renviron, execute o arquivo, e você tem um conjunto de dados macro totalmente atualizável pronto para modelagem em R.

Resumo

Aprendeu como:

  • Autenticar com segurança com o FXMacroData usando uma variável de ambiente
  • Construir um reutilizável . fetch_indicator() Ajudante com httr2 E ... jsonlita
  • Puxar e empilhar séries de indicadores multivaluados com purrr::map_dfr()
  • Reforma, preenchimento para a frente e cálculo de spreads derivados com - Não. E ... - Sim.
  • Produção de gráficos de etapas prontos para publicação com ggplot2
  • Automatizar atualizações diárias com um script R programado

Como próximo passo, explore o PIB- Não . PMIE ... Balança comercial O mesmo auxiliar de busca e o mesmo fluxo de trabalho ggplot2 aplicam-se inalterados só a lesma do indicador precisa mudar.

Blogroll