R语言金融数据:用 Narwhal API 拉取

用 R 和 Narwhal API,凭一个 API 密钥拉取节假日、发布日期、经济数据、大宗商品现货价格、汇率和预测市场赔率。把密钥保存在 .Renviron 中,用 httr2 读取响应,并在 R 脚本中使用返回的字段。

你将完成的设置

R 可以通过 httr2 调用 Narwhal REST API 并读取 JSON 响应。你将得到一个可复用的 narwhal() 辅助函数、覆盖全部六个数据领域的调用,以及一个可以安排为 pull.R 的脚本。辅助函数使用 https://api.narwhalapi.com 作为基础 URL,并为每个请求添加路径和查询参数。Narwhal 的经济数据包括 CPI、通胀、GDP 和收益率;这里的经济数据调用选取的是 CPI 观测值。

示例把每个响应领域保存在各自的 R 对象中。节假日和发布日期以记录列表的形式返回,CPI 观测值、汇率和预测市场会议也是如此。大宗商品示例读取单个 price 字段。为计算选取字段,或把记录转成数据框时,请记住这些响应的形状。

设置你的 API 密钥

  1. 创建免费密钥 在 narwhalapi.com/signup 创建你的密钥。Narwhal 用同一个账户和同一个 API 密钥覆盖其各个数据 API。
  2. 把密钥保存在 .Renviron 中 把密钥放进 .Renviron,环境变量名为 NARWHAL_API_KEY。把占位符替换成你的密钥,并且不要把密钥写进 pull.R。变量名必须与辅助函数中传给 Sys.getenv() 的名称一致。环境变量示例中的 ... 是密钥的占位符。
    环境变量
    NARWHAL_API_KEY=...
  3. 安装 R 包 用这里的命令安装 httr2 和 jsonlite。请求辅助函数使用 httr2 发出 GET 请求并读取其 JSON 正文。
    安装包
    install.packages(c("httr2", "jsonlite"))

用代码获取数据

把这段代码保存为 pull.R。辅助函数用 Sys.getenv() 读取 NARWHAL_API_KEY,并通过 Authorization: Bearer YOUR_KEY 标头把密钥作为 Bearer 令牌发送。每次调用提供一个路径;需要日期范围或货币选择的调用还要提供查询参数。后面的各领域示例都使用同一个辅助函数。

R,httr2 辅助函数和六个领域
library(httr2)

narwhal <- function(path, ...) {
  request("https://api.narwhalapi.com") |>
    req_url_path_append(path) |>
    req_url_query(...) |>
    req_auth_bearer_token(Sys.getenv("NARWHAL_API_KEY")) |>
    req_perform() |>
    resp_body_json()
}

holidays <- narwhal("v1/calendars/holidays/USA/2026")$holidays
releases <- narwhal("v1/economics/calendar", countries = "USA",
                    start_date = "2026-11-01", end_date = "2026-11-30",
                    limit = 100)$releases
cpi      <- narwhal("v1/economics/USA/cpi/observations", start = "2025-09")$observations
brent    <- as.numeric(narwhal("v1/commodities/spot/BRENT/USD")$price)
fx       <- narwhal("v1/fx/rates/USD", currencies = "EUR,IDR")$rates
fed      <- narwhal("v1/predictions/policy-paths/federal-reserve")$meetings

cpi_values <- vapply(cpi, function(row) as.numeric(row$value), numeric(1))
n <- length(cpi_values)
mom <- cpi_values[n] / cpi_values[n - 1] - 1
print(round(mom * 100, 2))   # month-on-month change in percent

在辅助函数内部,req_url_path_append(path) 把端点路径追加到基础 URL,req_url_query(...) 添加查询参数。req_auth_bearer_token() 接收从环境中读取的密钥。随后调用通过 req_perform() 和 resp_body_json() 把响应正文返回给 R。如各领域示例所示,用 $ 从该正文中读取指定名称的字段。

CPI 计算把每个观测值的 value 读取为数字。它用返回列表中的最后一个值除以前一个值,再减去 1,并以百分比打印环比变化。在计算之外使用观测值的数值时,period 字段应与每个观测值放在一起。

要把记录列表转成数据框,请使用 dplyr::bind_rows 或 do.call(rbind, lapply(x, as.data.frame))。这里的 x 是你要转换的列表,例如 holidays、releases 或 cpi。请先选取响应字段,让转换拿到的是该领域的记录。

这些调用把路径和查询参数分开处理。对于 CPI,路径选择 USA CPI 观测值,start 提供起始期间。对于汇率,路径选择 USD,currencies 提供 EUR 和 IDR。两种调用都使用辅助函数的基础 URL 和 Bearer 身份验证。

安排每日拉取

用 cron 或 Windows Task Scheduler 每天运行一次 Rscript pull.R。cronR 包可以帮你写出 cron 行。把你需要的请求连同辅助函数及其环境变量读取一起保留在 pull.R 中,这样定时命令调用的就是同一个脚本。

每日脚本命令
Rscript pull.R

日期和货币选择仍保持脚本中写的样子。例如,发布日期调用请求的是 2026 年 11 月,节假日调用请求的是 2026 年的 USA 节假日。每日调度会重复这些请求。调度方式请参阅安排每日数据拉取。

R 中的节假日

从 holidays 读取 2026 年 USA 的节假日。每条记录都有 date 和 name,所以把记录转成数据框时请同时保留这两个字段。这次调用在路径中使用国家和年份,并从响应中读取节假日列表。

读取节假日
response <- narwhal("v1/calendars/holidays/USA/2026")
holidays <- response$holidays
holidays

R 中的发布日期

从 releases 读取 2026 年 11 月 USA 的经济发布日期。请求包含国家、开始日期、结束日期和数量上限。每个发布都有 at、period、topic 和 status;在 R 中使用发布记录时,请把这些字段放在一起。

读取发布日期
response <- narwhal("v1/economics/calendar", countries = "USA",
                    start_date = "2026-11-01", end_date = "2026-11-30", limit = 100)
releases <- response$releases
releases

R 中的经济数据

从 observations 读取起始期间为 2025 年 9 月的 USA CPI 观测值。每个观测值都有 period 和 value。辅助函数示例用这些数值计算环比变化;展示观测值或由它得出的结果时,请让期间与数值放在一起。

读取 CPI 观测值
response <- narwhal("v1/economics/USA/cpi/observations", start = "2025-09")
cpi <- response$observations
cpi

R 中的大宗商品现货价格

从 price 读取以 USD 计价的 Brent 现货价格。这次调用在路径中选择商品和货币,然后用 as.numeric() 转换返回的价格。大宗商品现货代码包括 XAU、XAG、XPT、XPD、XCU、BRENT 和 WTI 等。

读取 Brent 现货价格
response <- narwhal("v1/commodities/spot/BRENT/USD")
brent <- as.numeric(response$price)
brent

R 中的汇率

以 USD 为基准货币,读取所请求货币 EUR 和 IDR 的汇率。响应字段是 rates,每条记录都有 currency 和 rate。把列表转成数据框时,请让货币字段与其汇率放在一起。

读取汇率
response <- narwhal("v1/fx/rates/USD", currencies = "EUR,IDR")
fx <- response$rates
fx

R 中的预测市场赔率

从 meetings 读取美联储政策利率路径的响应。每次会议都有 resolves_at、p_cut、p_hold 和 p_hike。把概率读入 R 时,请把会议字段放在一起,让结算时间与降息、维持和加息字段并列。

读取政策路径会议
response <- narwhal("v1/predictions/policy-paths/federal-reserve")
fed <- response$meetings
fed

密钥应该放在哪里?

把密钥放在 .Renviron 中,绝不要写进脚本。辅助函数读取 Sys.getenv("NARWHAL_API_KEY") 用于 Bearer 身份验证。REST 和 MCP 共用这个密钥,所以无论通过哪种方式访问 Narwhal,你用的都是同一个账户和密钥。

为什么 price 是字符串?

十进制数以字符串形式返回。如 Brent 示例所示,请用 as.numeric() 把 price 转成数字,以便在 R 中计算。CPI 计算也会先转换每个观测值的 value,再相除以得到变化。

发布于。

后续步骤