你可以用 Python 和 Narwhal,凭一个 API 密钥拉取节假日、发布日期、经济数据、大宗商品现货价格、汇率和预测市场赔率。用 requests 读取 JSON 响应,再用 cron 为脚本安排每日拉取。
你将完成的设置
安装了 requests 的 Python 3 可以让你写出一个调用 Narwhal REST API 的脚本,并读取每个数据领域的响应字段。你将得到一个共用的请求辅助函数、每个领域的示例,以及一条每日 cron 条目。Narwhal 用同一个账户和同一个 API 密钥覆盖其各个数据 API;REST 和 MCP 共用这个密钥。示例使用 https://api.narwhalapi.com 作为基础 URL,并发送 Authorization: Bearer YOUR_KEY。路径用来选择数据领域,每次调用从 JSON 响应中读取对应的字段。
设置你的 API 密钥
- 创建免费密钥 在 narwhalapi.com/signup 创建你的免费密钥。每个请求的 Authorization 标头都使用同一个密钥,所以整个脚本都可以用它。
- 把密钥保存在 shell 环境中 在你要使用 curl 和 Python 的 shell 中设置
NARWHAL_API_KEY,并把占位符替换成你的密钥。Python 辅助函数在构建 Bearer 标头时读取这个环境变量。export NARWHAL_API_KEY=... - 为 Python 3 安装 requests 为 Python 脚本安装
requests。PyPI 上还有narwhalapiSDK,可用pip install narwhalapi安装。pip install requests
编写 Python 之前先拉取数据
- 请求节假日 JSON 使用 curl 和你在 shell 中设置的环境变量。这个请求会向节假日端点发送 Bearer 标头,并在你编写 Python 代码之前打印 JSON。
curl -H "Authorization: Bearer $NARWHAL_API_KEY" \ "https://api.narwhalapi.com/v1/calendars/holidays/USA/2026" - 读取节假日行 在
holidays中查看返回的行。每一行都有date和name;Python 示例先统计行数,然后用这些字段打印第一个节假日。
用代码获取数据
六个请求都使用共用的 get 辅助函数。它把 API 基础 URL 与路径拼接,发送标头,传递查询参数,并在 raise_for_status() 之后读取 JSON。随后各次调用选取每个领域的响应字段,因此 print 语句可以处理节假日行、发布日期、观测值、现货价格、汇率和会议概率。
查询参数留在各自的调用中:发布日期请求包含国家、日期边界和数量上限,而汇率请求包含货币。辅助函数通过 params 发送它们,然后返回解析后的响应。请把辅助函数放在各领域示例之前,这样每个示例都能使用 get、API 和 HEADERS。下面的每个示例都用自己的路径和响应字段复用这个辅助函数。
import os
import requests
API = "https://api.narwhalapi.com"
HEADERS = {"Authorization": f"Bearer {os.environ['NARWHAL_API_KEY']}"}
def get(path, **params):
r = requests.get(API + path, params=params, headers=HEADERS, timeout=10)
r.raise_for_status()
return r.json()
holidays = get("/v1/calendars/holidays/USA/2026")["holidays"]
releases = get(
"/v1/economics/calendar",
countries="USA",
start_date="2026-11-01",
end_date="2026-11-30",
limit=100,
)["releases"]
cpi = get("/v1/economics/USA/cpi/observations", start="2025-09")["observations"]
brent = get("/v1/commodities/spot/BRENT/USD")["price"]
fx = get("/v1/fx/rates/USD", currencies="EUR,IDR")["rates"]
fed = get("/v1/predictions/policy-paths/federal-reserve")["meetings"]
print(len(holidays), holidays[0]["date"], holidays[0]["name"])
print(len(releases), releases[0]["period"], releases[0].get("at"))
print(cpi[-1]["period"], cpi[-1]["value"])
print("Brent", brent)
print({r["currency"]: r["rate"] for r in fx})
print(fed[0]["resolves_at"][:10], fed[0]["p_hold"])按计划定时运行
可以用一条 cron 条目每天运行一次脚本。使用提供的条目,并把脚本放在 /path/pull.py;它调用 /usr/bin/python3,并把打印输出追加到 pull.log。脚本每天发起六次调用,请求数量很少。
0 7 * * * /usr/bin/python3 /path/pull.py >> pull.log在任务运行的环境中设置 NARWHAL_API_KEY。在共享机器上,请把密钥放在任务引入的文件中,不要写进 crontab。定时脚本读取的变量与 shell 示例相同,请求也使用同样的 Bearer 标头。
Python 中的节假日
读取 holidays 获取每个节假日的日期和名称。2026 年 10 月 24 日的响应包含 2026 年的 11 个 US 节假日,1 月 1 日的元旦排在第一位。这个示例使用共用的辅助函数,并从第一行打印这两个字段;完整脚本还会打印节假日行的数量。
holidays = get(
"/v1/calendars/holidays/USA/2026"
)["holidays"]
print(holidays[0]["date"], holidays[0]["name"])Python 中的发布日期
读取 releases 获取所请求国家和日期范围内的经济发布日期。每个发布都有 at、period、topic 和 status。2026 年 10 月 24 日的响应在 2026 年 11 月的范围内包含 31 个发布。示例打印第一个发布的 period,并像完整脚本一样用 .get() 读取它的 at 字段。
releases = get(
"/v1/economics/calendar",
countries="USA",
start_date="2026-11-01",
end_date="2026-11-30",
limit=100,
)["releases"]
print(releases[0]["period"], releases[0].get("at"))Python 中的经济数据
读取 observations 获取 CPI 的期间和数值,用 start 请求从某个期间开始的观测值。在 2026 年 10 月 24 日的响应中,2026 年 9 月的 CPI 指数为 336.940。每个观测值都有 period 和 value;这个示例从返回的最后一行读取这两个字段。Narwhal 的经济数据还包括通胀、GDP 和收益率。
cpi = get(
"/v1/economics/USA/cpi/observations", start="2025-09"
)["observations"]
print(cpi[-1]["period"], cpi[-1]["value"])Python 中的大宗商品现货价格
读取 price 获取以 USD 计价的 Brent 现货价格。2026 年 10 月 24 日的响应显示 Brent 为每桶 116.8809 美元。示例把这个字段赋给 brent,并带标签打印出来。大宗商品现货代码包括 XAU、XAG、XPT、XPD、XCU、BRENT 和 WTI 等;这个请求使用 BRENT。
brent = get(
"/v1/commodities/spot/BRENT/USD"
)["price"]
print("Brent", brent)Python 中的汇率
读取 rates 获取所请求货币对 USD 的汇率。每一行都有 currency 和 rate,示例把它们转成字典。2026 年 10 月 24 日的响应显示 USD/EUR 为 0.89342,USD/IDR 为 18107.8,均为 2026 年 10 月 23 日的收盘价。这次调用通过 currencies 参数同时请求 EUR 和 IDR。
fx = get(
"/v1/fx/rates/USD", currencies="EUR,IDR"
)["rates"]
print({r["currency"]: r["rate"] for r in fx})Python 中的预测市场赔率
读取 meetings 获取美联储政策利率路径。每次会议都有 resolves_at、p_cut、p_hold 和 p_hike。2026 年 10 月 24 日的响应显示,2026 年 10 月 28 日会议的维持不变概率为 0.9188。这个示例使用与完整脚本相同的字段,打印 resolves_at 的日期部分和第一次会议的 p_hold 值。
fed = get(
"/v1/predictions/policy-paths/federal-reserve"
)["meetings"]
print(fed[0]["resolves_at"][:10], fed[0]["p_hold"])为什么会得到 401?
Authorization 标头缺失,或者环境变量为空。用 bool(os.environ.get('NARWHAL_API_KEY')) 打印 Python 是否拿到了 NARWHAL_API_KEY 的值。辅助函数用这个变量构建标头,所以要在脚本运行的环境中设置它。预期的标头是 Authorization: Bearer YOUR_KEY,密钥值由环境变量提供。对于定时拉取,请在任务环境中检查变量是否为空。
如何把行列表转成表格?
对你想转成表格的行列表使用 pandas.DataFrame(rows)。节假日调用的列表是 holidays;发布日期的列表是 releases。读取响应行之后如何处理表格,请参阅 pandas 教程。CPI 的 observations、汇率的 rates 和预测的 meetings 字段同样是行列表。在传给 pandas.DataFrame(rows) 之前,先在 Python 中选取响应字段。
发布于。