免费拿美联储数据:FRED API 入门指南,让 Python 帮你做投资研究
为什么开发者投资人需要 FRED API?
大多数人做投资研究,第一反应是打开股票图。这其实是个误区。宏观经济状况——GDP 增长、通胀趋势、就业市场健康度——才是决定行业轮动、利率预期以及最终资产价格的底层逻辑。问题在于,过去要把干净可靠的宏观数据拉进 Python 工作流,要么靠爬虫去扒 BLS 表格,要么每年花几万块买 Bloomberg 终端。
美联储经济数据库(FRED)由圣路易斯联储维护,托管了超过 80 万个经济时间序列——从美国 GDP 到韩国出口量,再到地区住房库存,应有尽有。而且 FRED API 是免费的。你只需要申请一个 API 密钥,数据本身不要钱。对同时搞编程和投资的人来说,这是能加到研究工具箱里的最划算的工具之一。
我本人用 FRED 数据做个人投资研究已经三年了。这篇指南会告诉你我第一天就希望知道的东西:如何不费力地拿到 API 密钥、直接调 REST API 还是用 fredapi 库、拉取哪些真正影响市场的序列,以及怎么绕过新手常踩的速率限制陷阱。
两分钟拿到 FRED API 密钥
政府类 API 的注册流程出奇地简单:
- 打开 research.stlouisfed.org/useraccount/apikey
- 用电子邮箱创建免费账户——不需要组织认证,也不用等待审批
- 马上从控制面板复制那串 32 位的密钥
这个密钥的速率限制是每分钟 120 次请求。听起来挺大方,但如果你在循环里一次性拉 50 个序列,很快就会撞墙。在每个请求之间加一句 time.sleep(0.6) 就能稳稳躲在限制之下。
把密钥存到环境变量里,不要硬编码在代码中:
# 在终端设置环境变量(Linux/Mac)
export FRED_API_KEY="你的32位密钥"
⚠️ 警告
FRED API 密钥绑定的是你的账户,不是 IP。如果你不小心把它提交到了公开仓库,别人就能耗光你的速率限制——圣路易斯联储会直接限制该密钥的访问,而不会自动帮你换密钥。请一定用.env文件并把它加到.gitignore里。
直接调 REST API 还是用 fredapi Python 库?
你有两条集成路径。直接用 REST API 是一个标准的 JSON 接口,地址是 https://api.stlouisfed.org/fred/。每个请求需要传 series_id、api_key 和可选参数(如 observation_start 和 units)。下面是一次原始请求的样子:
import requests
# 构建请求URL和参数
url = "https://api.stlouisfed.org/fred/series/observations"
params = {
"series_id": "GDP", # 国内生产总值序列ID
"api_key": "你的密钥", # 你的API密钥
"file_type": "json", # 返回JSON格式
"observation_start": "2020-01-01", # 数据起始日期
}
resp = requests.get(url, params=params) # 发送GET请求
data = resp.json() # 解析返回的JSON数据
这样也能用。但等你第三次手动解析日期、处理分页、把字符串转成浮点数之后,你就会想找个封装库。fredapi 库(由 Mortada Mehyar 编写)把这些都处理好了——而且它的接口直接对应 FRED API 端点,所以即使以后需要降到底层写原始请求,心智模型也完全通用。
安装它:
# 使用pip安装fredapi库
pip install fredapi
然后初始化:
from fredapi import Fred
# 用你的密钥创建一个Fred对象
fred = Fred(api_key="你的密钥")
fredapi 提供了三类方法:获取序列数据(get_series)、元数据搜索(search、get_series_info)以及发布和分类信息。你 90% 的时间都会花在 get_series 上。
每个投资者都该跟踪的三个序列
FRED 有超过 80 万个序列,其中大部分是噪声。下面是我放在每个仪表盘里的三个核心序列,以及它们的精确 series_id。
GDP(国内生产总值)—— GDP
季度数据,经季节调整,单位十亿美元。这是衡量美国经济产出的最广义指标。我拉取它用来计算同比增速:
# 获取从2010年起的GDP数据
gdp = fred.get_series("GDP", observation_start="2010-01-01")
# 计算同比变化率(4个季度=1年),乘以100得到百分比
gdp_yoy = gdp.pct_change(periods=4) * 100
GDP 增速下滑通常比 2001 年和 2008 年衰退提前两到三个季度。它不是择时信号,但能告诉你当前的投资环境是在扩张还是收缩。
失业率—— UNRATE
月度数据,经季节调整,百分比。萨姆规则(Sahm Rule)——当失业率三个月移动平均值比过去 12 个月最低点高出 0.5 个百分点时触发——自 1970 年以来准确预测了美国每一次衰退,零误报。用五行代码就能实现:
# 获取失业率数据
unrate = fred.get_series("UNRATE")
# 计算三个月移动平均
ma_3 = unrate.rolling(3).mean()
# 获取过去12个月的最低值
min_12 = unrate.rolling(12).min()
# 计算萨姆指标:移动平均减去最低值
sahm = ma_3 - min_12
# 当指标大于0.5时触发衰退信号
recession_signal = sahm > 0.5
消费者价格指数—— CPIAUCSL
月度数据,经季节调整,指数基期 1982-1984=100。CPI 驱动美联储政策,美联储政策驱动债券收益率,债券收益率又驱动股票估值。我跟踪它的同比变化,并叠加联邦基金利率(FEDFUNDS)来判断货币政策是紧缩还是宽松:
# 获取CPI数据
cpi = fred.get_series("CPIAUCSL")
# 计算同比变化率(12个月)
cpi_yoy = cpi.pct_change(periods=12) * 100
# 获取联邦基金利率
fed_funds = fred.get_series("FEDFUNDS")
# 计算实际利率(名义利率减去通胀)
real_rate = fed_funds - cpi_yoy
当 real_rate 为深度负数时(如 2021-2022 年),美联储实际上在补贴借贷;当它转为正数并高出几百个基点时,流动性收紧,风险资产通常会重新定价。
💡 提示
序列 ID 区分大小写。GDP有效,gdp无效。如果请求返回空 DataFrame,首先检查 ID——这是最常见的无声失败原因。
搭建一个最简经济仪表盘
你不需要 Streamlit 或 Dash 就能做出有用的东西。一个 Pandas DataFrame 加 Matplotlib 对个人研究来说完全够了。下面是我用的骨架:
import matplotlib.pyplot as plt
from fredapi import Fred
# 初始化FRED客户端
fred = Fred(api_key="你的密钥")
# 定义要拉取的序列:标签 -> 序列ID
series = {
"GDP": "GDP",
"失业率": "UNRATE",
"CPI同比%": "CPIAUCSL",
"联邦基金利率": "FEDFUNDS",
"10年期国债收益率": "DGS10",
"标普500指数": "SP500",
}
# 创建3行2列的子图,设置总画布尺寸
fig, axes = plt.subplots(3, 2, figsize=(14, 12))
axes = axes.flatten() # 把二维数组展平为一维
# 遍历每个序列,绘制到对应的子图中
for ax, (label, series_id) in zip(axes, series.items()):
data = fred.get_series(series_id, observation_start="2015-01-01")
data.plot(ax=ax, title=label, linewidth=1.2) # 绘制折线图
ax.grid(True, alpha=0.3) # 添加半透明网格
ax.set_xlabel("") # 隐藏x轴标签
plt.tight_layout() # 自动调整子图间距
plt.savefig("macro_dashboard.png", dpi=150) # 保存图片
运行这段代码大约 10 秒就能得到一张包含六个经济指标的宽视图。我每月重新生成一次,把 PNG 存到 Notion 页面里,跟投资笔记放在一起。它的价值不在于图表本身——而在于强迫自己在做资产配置之前先看一眼宏观数据。
如果你想要更交互的体验,fredapi 的数据可以直接喂进 Jupyter notebook。配合 ipywidgets 做下拉选择器选序列 ID 和日期范围,你就能拥有一个不用点点点就能复制 FRED 官网功能的研究环境。
速率限制和实际使用中的限制
FRED API 有几个需要注意的地方:
-
每分钟 120 次请求,但每天也有限制:6000 次。 每日上限才是批量处理时的真正瓶颈。如果你要拉 500 个序列的历史数据,就得把请求分散到多天,或者激进地缓存结果。
-
没有实时数据。 大多数序列更新有延迟。GDP 每个季度更新一次,延迟一个月;失业率每月第一个星期五更新;CPI 在月中发布。如果你按日线交易,FRED 数据不是你的信号——它是你的背景信息层。
-
数据会被修订。 GDP 和就业数据有时会被大幅修正。2020 年一季度 GDP 初值是 -4.8%,最终修正为 -5.0%。如果你的回测用“日期 X 的 GDP”作为输入,但用的可能是 X 日期之后才有的修正数据。想要严格回测,请使用 ALFRED(ArchivaL FRED)API,它提供每个时间点上的原始数据。
fredapi通过vintage_dates参数支持这一点。 -
序列可能会被停用。 美联储偶尔会停止某些序列或调整统计方法。如果你的管道依赖某个特定序列 ID,当它停止更新时,程序会无声地失败。我每个季度检查一次序列元数据:
# 获取GDP序列的元数据信息
info = fred.get_series_info("GDP")
print(f"最后更新: {info.get('last_updated')}")
print(f"频率: {info.get('frequency')}")
我如何把 FRED 数据整合到投资研究中
我的工作流不是一个交易系统,而是一个决策辅助层。FRED 数据在一个典型的研究周期里是这样融入的:
-
行业配置: 我会拉取制造业数据(
INDPRO)、新屋开工(HOUST)和零售销售(RSXFS),再加上那三个核心序列。当制造业下行而服务业持平时,我会减少工业周期股,增加公用事业和必需消费品权重。这不是择时,而是调整概率估计。 -
债券久期决策: 10 年期国债收益率(
DGS10)减去 2 年期(DGS2)就是收益率曲线利差。曲线倒挂在过去 50 年里每次都先于衰退发生。当倒挂后曲线开始陡化,我会在固定收益部分延长久期。fredapi一行代码就能搞定:spread = fred.get_series("T10Y2Y")。 -
估值背景: 我跟踪标普 500 指数(
SP500)和名义 GDP,大致估算巴菲特指标(总市值 / GDP)。这个信号很粗糙,但极端值很有价值——在互联网泡沫前该比率飙到 180% 以上,2022 年初超过 200%。而低于 80% 通常意味着绝佳的入场点。
这些都不是独立的买卖信号。它们只是决策流程的输入。FRED API 消除了手动收集数据的麻烦,让你能把时间花在真正需要思考的分析上。
价值在于管道,而不在于数据
数据是免费的。你围绕数据构建的东西——自动拉取、预警阈值、你确实会在决策前查看的仪表盘——才是真正的优势来源。FRED 消除了获取机构级宏观数据的成本障碍。剩下的就要靠你自己把这些整合到一个可重复的研究流程中了。
先从那三个核心序列开始:GDP、UNRATE、CPIAUCSL。让它们在一个每周更新的脚本中跑起来。然后每个月新增一个你关心的资产对应的序列。六个月后,你就拥有一个只花了几十行 Python 代码时间、不需要任何费用的宏观监控系统。
