下载大宗商品价格历史 CSV(金属价格)

向 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 这几列。

  1. 将 API 密钥存入环境变量 获取免费 API 密钥,并保存在环境变量 NARWHAL_API_KEY 中。脚本会读取该变量,并通过 Authorization: Bearer YOUR_KEY 请求头发送密钥。
  2. 设置日期和时间间隔 start 和 end 都是必填的 ISO 时间戳。示例使用 2026-10-01T00:00:00Z 至 2026-10-24T00:00:00Z,并将 interval 设为 1d,获取 2026 年 10 月 1 日至 23 日的每日黄金 K 线。
  3. 将脚本保存为 bars.py CSV 表头与 K 线字段的顺序要保持一致。脚本向 https://api.narwhalapi.com 发送请求,并把返回的行写到标准输出,因此下一步的命令可以把它们存入文件。
    Python,将每日黄金 K 线输出为 CSV(运行方式:python bars.py > gold.csv)
    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
    
  4. 写入 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-014156.83524192.52154139.77874177.4458
2026-10-024177.21834225.64974125.92324141.5280

发布于。

后续步骤