向 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 |
發布於 。