R 是统计分析和财务建模最强大的语言之一,它具有成熟的生态系统,用于处理时间序列数据. 本指南通过您需要采集,清理和分析的一切,使用现代的 没有 现在我 石 完成后,您将拥有可重复使用的R工作流程, 能够提取央行数据,构建整洁的图表,
你将要建造什么
一个完全可重复的R脚本,可以对FXMacroData REST API进行验证,检索多种货币的政策利率和通货膨胀时间序列,将它们连接到单个图标中,并用gggplot2绘制它们,准备嵌入到四分之一或R Markdown报告中.
预先要求
- R ≥ 4.2 和RStudio (或任何R环境)
- 接下来的包装:
httr2没有人知道.jsonlite没有人知道.dplyr没有人知道.tidyr没有人知道.lubridate没有人知道.ggplot2 - 一个FXMacroData API 键 登录 订阅 为了得到一个
如果您还没有,请安装所需的包一次:
install.packages(c("httr2", "jsonlite", "dplyr", "tidyr", "lubridate", "ggplot2"))
步骤1 了解API的形状
每个FXMacroData指标终点都遵循相同的URL模式:
GET https://fxmacrodata.com/api/v1/announcements/{currency}/{indicator}?api_key=YOUR_API_KEY
响应是一个JSON对象, data 每个元素都有一个 date
并且一个 val 领域 (并可选择一个 announcement_datetime 对于发布时间的精确性) 例如,获取美国联邦储备政策利率:
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" }
]
}
这种清洁的结构与R数据框架完全相匹配,
步骤2 设置您的API键
存储您的API密钥在环境变量中,而不是硬编码它.
~/.Renviron 文件:
FXMD_API_KEY=your_actual_api_key_here
然后重新加载环境,并检索每个脚本的顶部的键:
readRenviron("~/.Renviron")
API_KEY <- Sys.getenv("FXMD_API_KEY")
if (nchar(API_KEY) == 0) stop("FXMD_API_KEY is not set in .Renviron")
安全提示
永远不要将API密钥提交到版本控制. .Renviron 为了你的 .gitignore 如果您将其存储在项目目录中,则可以使用密码管理器或CI环境变量.
步骤3 写一个通用获取辅助器
随着 没有 您可以声明式构建请求,明确处理错误,并在单个管道中解码JSON. 下面的函数将所有三个步骤包裹成一个可重复使用的辅助器:
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
)
}
这里主要的选择: req_error() 确保HTTP 4xx/5xx响应抛出R条件,而不是默默返回错误数据; resp_body_json(simplifyVector = TRUE) 强迫嵌套数组直接进入数据而不是列表; as_date() 通过滑液,你会得到一个适当的
Date 立即进入列.
步骤4 获取多种货币和指标
现在使用助手在三年时间内为四个G4货币拉出政策利率,
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>
您可以轻松查找其他指标.例如,将通胀率与政策利率相连,可以计算实际利率差距,这是运输交易定位的关键驱动因素:
inflation <- purrr::map_dfr(
currencies,
\(ccy) fetch_indicator(ccy, "inflation", start = START)
)
# Combine into one tidy frame
macro_data <- bind_rows(policy_rates, inflation)
您可以查找的指标
完整的目录可在 它们的数据来源:汇率分析的关键系列包括: 政策_利率没有人知道. 货币膨胀没有人知道. 国内生产总值没有人知道. 失业率没有 型每个系列都使用相同的获取模式,只需更改货币和指标.
步骤5 清理和重塑数据
对于大多数分析,你需要数据 宽度 格式 每个指标每货币一个列 而不是API返回的堆式格式. pivot_wider() 电话处理这个在一个步骤, fill() 转移到一个常规的月度格子中,将中央银行稀少的公告观察:
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)
步骤6 计算实际利率差距
实际利率差距是政策利率减去通货膨胀率 正差距意味着央行与消费者价格增长相比处于限制区间.
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
)
步骤7 通过ggplot2可视化
随着整齐的图形准备, ggplot2多行图需要几行. colour 审美性:
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")
使用 geom_step() 没有 geom_line() 对于政策利率系列, 中央银行决定是离散的阶段变化, 步骤图正确地表示了这一点.
步骤8 报告的出口
如果您将此图嵌入到 Quarto 或 R Markdown 文档中,请将数据保存到 CSV 格式以可重复性,并将图画保存到高分辨率 PNG 格局以进行线性染:
readr::write_csv(spread_data, "macro_spread_data.csv")
ggsave(
filename = "policy_rates.png",
width = 10,
height = 5.6,
dpi = 150
)
对于互动的闪亮仪表板,同样的子直接输入 plotly::ggplotly() 对于零摩擦互动性
步骤9 通过计划脚本自动化
为了保持您的分析没有手动重启, 包裹取取逻辑在一个独立的R脚本和计划它 cronR (Linux/macOS) 或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.")
结合这个和 发布日历终点 只有在预计有高影响力数据的日子才会触发更新,在安静的日子里避免不必要的API调用.
完整的工作示例
设置一个60行脚本. FXMD_API_KEY 在你的 .Renviron运行文件,您就有了一个完全可刷新的宏观数据集,
总结
你已经学会了:
- 使用环境变量安全验证FXMacroData
- 建造一个可重复使用的
fetch_indicator()帮助与 没有 现在我 石 - 拉和堆叠多货币指标系列
purrr::map_dfr() - 重新塑造,前进填充,并计算与 没有 现在我 时间
- 制作准备出版的步骤图 图片中的
- 通过计划的R脚本自动更新每日
作为下一步,探索 国内生产总值没有人知道. 美国没有 贸易平衡 总结结果,以建立一个更全面的宏观分数表,跨越所有G10货币.相同的gethelper和ggplot2工作流程不变只需要改变指标.