R adalah salah satu bahasa yang paling kuat untuk analisis statistik dan pemodelan keuangan dan memiliki ekosistem yang matang untuk bekerja dengan data deret waktu. httr2 Dan jsonlit Pada akhirnya Anda akan memiliki alur kerja R yang dapat digunakan kembali yang menarik data bank sentral, membangun tibble yang rapi, dan menghasilkan grafik siap publikasi semua dalam kurang dari 50 baris kode.
Apa yang Akan Anda Bangun
Sebuah skrip R yang dapat direproduksi sepenuhnya yang mengotentikasi terhadap FXMacroData REST API, mengambil kebijakan tingkat dan inflasi seri waktu untuk beberapa mata uang, bergabung dengan mereka ke dalam tibble tunggal, dan plot mereka dengan ggplot2 siap untuk dimasukkan ke dalam laporan Quarto atau R Markdown.
Persyaratan
- R ≥ 4,2 dan RStudio (atau lingkungan R lainnya)
- Paket berikut:
httr2Aku akan pergi.jsonliteAku akan pergi.dplyrAku akan pergi.tidyrAku akan pergi.lubridateAku akan pergi.ggplot2 - Kunci API FXMacroData daftar di /langganan untuk mendapatkan satu
Instal paket yang diperlukan sekali jika Anda belum memilikinya:
install.packages(c("httr2", "jsonlite", "dplyr", "tidyr", "lubridate", "ggplot2"))
Langkah 1 Memahami Bentuk API
Setiap titik akhir indikator FXMacroData mengikuti pola URL yang sama:
GET https://fxmacrodata.com/api/v1/announcements/{currency}/{indicator}?api_key=YOUR_API_KEY
Tanggapan adalah objek JSON dengan data array dimana setiap elemen memiliki date
dan val bidang (dan opsional announcement_datetime Untuk presisi waktu rilis). Misalnya, mengambil suku bunga kebijakan Federal Reserve AS:
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" }
]
}
Struktur bersih ini memetakan sempurna ke kerangka data R dengan transformasi minimal.
Langkah 2 Atur kunci API Anda
Simpan kunci API Anda dalam variabel lingkungan daripada mengkode keras dalam skrip.
~/.Renviron File:
FXMD_API_KEY=your_actual_api_key_here
Kemudian muat ulang lingkungan dan mengambil kunci di bagian atas setiap skrip:
readRenviron("~/.Renviron")
API_KEY <- Sys.getenv("FXMD_API_KEY")
if (nchar(API_KEY) == 0) stop("FXMD_API_KEY is not set in .Renviron")
Tip keamanan
Jangan pernah mengikat kunci API untuk kontrol versi. .Renviron Untukmu .gitignore Jika Anda menyimpannya di direktori proyek. untuk penyebaran yang dapat direproduksi, gunakan pengelola rahasia atau variabel lingkungan CI.
Langkah 3 Tuliskan Bantuan Mengambil Generik
Dengan httr2 Anda membangun permintaan secara deklaratif, menangani kesalahan secara eksplisit, dan mendekode JSON dalam satu pipa.
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
)
}
Pilihan utama di sini: req_error() memastikan respon HTTP 4xx/5xx membuang kondisi R daripada diam-diam mengembalikan data yang buruk; resp_body_json(simplifyVector = TRUE) memaksa array tersayap langsung ke bingkai data bukan daftar; dan as_date() Dari pelumas memberi Anda yang tepat
Date Kolom segera.
Langkah 4 Dapatkan beberapa mata uang dan indikator
Sekarang gunakan pembantu untuk menarik suku bunga kebijakan untuk empat mata uang G4 selama jendela tiga tahun persis jenis perbandingan multi-mata uang yang mendorong keputusan perdagangan divergensi:
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>
Anda dapat mengambil indikator tambahan dengan mudah. misalnya, menarik inflasi utama bersama dengan suku bunga kebijakan memungkinkan Anda menghitung spread suku bunga riil, pendorong utama posisi 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)
Indikator yang dapat Anda dapatkan
Katalog lengkap tersedia di fxmacrodata.com/api-data-docsSeri kunci untuk analisis FX meliputi kebijakan_tingkatAku akan pergi. inflasiAku akan pergi. PDBAku akan pergi. pengangguran, dan PMISetiap seri menggunakan pola yang sama hanya mengubah mata uang dan slug indikator.
Langkah 5 Bersihkan dan Bentuk ulang Data
Untuk sebagian besar analisis Anda ingin data di lebar format satu kolom per indikator per mata uang daripada format rapi ditumpuk dikembalikan oleh API. pivot_wider() panggilan menangani ini dalam satu langkah, dan fill() menyalurkan pengamatan pengumuman bank sentral yang jarang terjadi ke grid bulanan reguler:
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)
Langkah 6 Menghitung Spread Tarif Nyata
Spread suku bunga riil adalah suku bunga kebijakan dikurangi inflasi spread positif berarti bank sentral berada di wilayah yang membatasi relatif terhadap pertumbuhan harga konsumen.
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
)
Langkah 7 Visualisasikan dengan ggplot2
Dengan tibble rapi siap, grafik ggplot2 multi-line mengambil beberapa baris. colour estetika:
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")
Gunakan geom_step() daripada geom_line() untuk seri suku bunga kebijakan keputusan bank sentral adalah perubahan tangga diskrit dan grafik langkah mewakili itu dengan benar.
Langkah 8 Ekspor untuk Laporan
Jika Anda menyematkan bagan ini ke dalam dokumen Quarto atau R Markdown, simpan kerangka data ke CSV untuk reproduksi dan plot ke PNG resolusi tinggi untuk rendering inline:
readr::write_csv(spread_data, "macro_spread_data.csv")
ggsave(
filename = "policy_rates.png",
width = 10,
height = 5.6,
dpi = 150
)
Untuk dashboard interaktif Shiny, tibble yang sama langsung masuk ke plotly::ggplotly() untuk interaktivitas tanpa gesekan.
Langkah 9 Otomatis dengan Skrip Terjadwal
Untuk menjaga analisis Anda saat ini tanpa manual re-run, membungkus logika fetch dalam standalone R skrip dan menjadwalkan dengan cronR (Linux/macOS) atau Windows Task Scheduler:
# 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.")
Pasangkan ini dengan Tanggal akhir rilis untuk memicu pembaruan hanya pada hari-hari ketika data berdampak tinggi diharapkan, menghemat panggilan API yang tidak perlu pada hari yang tenang.
Contoh kerja lengkap
Semua cuplikan di atas digabungkan menjadi satu ~ 60 baris skrip. FXMD_API_KEY di dalam .Renviron, jalankan file, dan Anda memiliki dataset makro yang dapat diperbarui siap untuk dimodelkan di R.
Ringkasan
Anda telah belajar bagaimana:
- Otentikasi dengan aman dengan FXMacroData menggunakan variabel lingkungan
- Bangun yang bisa digunakan kembali.
fetch_indicator()- Aku akan membantu. httr2 Dan jsonlit - Tarik dan tumpukan seri indikator multi-mata uang dengan
purrr::map_dfr() - Reshape, maju-isi, dan menghitung terhasil menyebar dengan Dplyr Dan Tidyr
- Membuat grafik langkah siap publikasi dengan ggplot2
- Mengotomatiskan pembaruan harian dengan skrip R terjadwal
Sebagai langkah selanjutnya, jelajahi PDBAku akan pergi. PMI, dan neraca perdagangan endpoints to build a fuller macro scorecard across all G10 currencies. The same fetch helper and ggplot2 workflow applies unchanged — only the indicator slug needs to change.