向 bars 端点发送一次请求,就能返回某种大宗商品的每日开盘价、最高价、最低价和收盘价,再用一个简短的脚本写入 CSV。2026 年 10 月 1 日至 23 日的黄金共有 17 行日线数据。周末没有 K 线。
通过 API 获取每日黄金 K 线
以美元计价的黄金使用 GET /v1/commodities/spot/XAU/USD/bars。每根 K 线包含 timestamp,以及 open、high、low、close 的十进制字符串。脚本将这些价格字段直接写入 CSV,日期取自时间戳。输出包含 date、open、high、low 和 close 这几列。
- 将 API 密钥存入环境变量 获取免费 API 密钥,并保存在环境变量
NARWHAL_API_KEY中。脚本会读取该变量,并通过Authorization: Bearer YOUR_KEY请求头发送密钥。 - 设置日期和时间间隔
start和end都是必填的 ISO 时间戳。示例使用2026-10-01T00:00:00Z至2026-10-24T00:00:00Z,并将interval设为1d,获取 2026 年 10 月 1 日至 23 日的每日黄金 K 线。 - 将脚本保存为 bars.py CSV 表头与 K 线字段的顺序要保持一致。脚本向
https://api.narwhalapi.com发送请求,并把返回的行写到标准输出,因此下一步的命令可以把它们存入文件。import csv, os, sys import requests H = {"Authorization": f"Bearer {os.environ['NARWHAL_API_KEY']}"} params = { "start": "2026-10-01T00:00:00Z", "end": "2026-10-24T00:00:00Z", "interval": "1d", "limit": 500, } out = csv.writer(sys.stdout) out.writerow(["date", "open", "high", "low", "close"]) cursor = None while True: if cursor: params["cursor"] = cursor body = requests.get( "https://api.narwhalapi.com/v1/commodities/spot/XAU/USD/bars", params=params, headers=H, timeout=15, ).json() for b in body["bars"]: out.writerow([b["timestamp"][:10], b["open"], b["high"], b["low"], b["close"]]) cursor = body.get("next_cursor") if not cursor: break - 写入 gold.csv 使用
python bars.py > gold.csv写出 CSV 文件。2026 年 10 月 1 日至 23 日的输出,在表头下方有 17 行每日数据。
循环之前的 out.writerow 负责写表头。在循环内,每次调用 out.writerow 都会按表头的顺序添加一根 K 线。价格字段保持响应中的十进制字符串,日期由 b["timestamp"][:10] 提供。要在表格或模型中使用每日收盘价,请从所需日期那一行取 close 值。该 K 线的开盘价、最高价和最低价也在同一行。对于按小时或按分钟导出的数据,这个脚本仍然只写入每个时间戳的日期部分。
使用历史表格或导入表格
无需编写脚本,打开黄金商品页面上的价格历史即可使用其表格。已登录的账户还可以从商品页面将历史下载为 CSV。
要把脚本生成的 CSV 导入 Excel,请使用“数据”>“从文本/CSV”。在 Google 表格中,请使用“文件”>“导入”。文件包含日期以及每根 K 线的开盘价、最高价、最低价和收盘价,因此同一份导出的历史数据既可用于表格,也可作为模型的输入。导入这些行时,请把日期列与价格一起保留。
选择下载方式和时间间隔
| 情况 | 最合适的方法 | 原因 |
|---|---|---|
| 快速查看 | 网站图表 | 在商品页面查看黄金价格历史 |
| 可重复的下载,或模型的输入 | 脚本 | 将请求的 K 线写入 CSV |
| 小时或分钟数据 | 将 interval 设为 1h 或 1m 的脚本 | 请求所需的时间间隔并缩短时间窗口 |
bars 端点的 interval 接受 1m、1h 和 1d。日线历史请保持 1d。如需小时或分钟数据,请修改该参数并缩短请求的时间窗口;示例中的日期和 CSV 样例对应的是日线数据。
为什么黄金价格历史中没有周末?
现货黄金在周末休市时没有 K 线。2026 年 10 月 1 日至 23 日跨越 23 个自然日,共有 17 根日线,全部在工作日。请把 CSV 中的日期理解为返回的 K 线所对应的日期。日线间隔不会向文件中添加周末的行。
每次请求会返回多少根 K 线?
每次请求最多返回 limit 根 K 线,脚本中为 500。循环会不断跟进 next_cursor,直到它为 null,并把每次响应的 K 线写入同一个 CSV。修改请求的日期或时间间隔时,请保留这段循环,这样导出的结果才能包含后续的页面。对于较长的时间范围,请保持 start、end 和 interval 不变,由游标选择后续的页面。脚本会在发出下一次请求之前把该游标加入 params。表头位于循环之外,因此所有页面共用同一组列名。
出现 409 cursor_expired 表示需要不带游标重新开始。像脚本开头那样用 cursor = None 重新开始导出,并根据这次新的请求写出文件。
如果我的开始日期早于序列开始时间怎么办?
所有账户都可读取完整历史。请查看返回的第一个日期,以了解 CSV 从哪里开始,因为序列可能晚于你请求的开始日期。
实例:2026 年 10 月的黄金
从示例中 2026 年 10 月的日线请求开始。返回的日期从 2026-10-01 开始,到 2026-10-23 结束,共有 17 行数据。先写入 CSV 表头,再按表头的顺序写入每根 K 线的日期和价格字段。第一个收盘价是 2026 年 10 月 1 日的 4177.4458,它位于第一行数据的 close 列,排在日期、开盘价、最高价和最低价之后。
| 日期 | 打开 | 最高值 | 最低值 | 关闭 |
|---|---|---|---|---|
| 2026-10-01 | 4156.8352 | 4192.5215 | 4139.7787 | 4177.4458 |
| 2026-10-02 | 4177.2183 | 4225.6497 | 4125.9232 | 4141.5280 |
发布于。