Learn/時間序列

歷史匯率同時間序列資料

用 /v1/range 取得多種貨幣嘅歷史匯率,再載入 pandas 或其他工具。

ERexchangerate.dev·2026年6月19日·閱讀約 6 分鐘

範圍接口返回有分頁、來源同填充標記嘅已保存觀測。

重點
JSON 每頁最多 366 個觀測值;has_more 為 true 時,用 next_cursor 取得下一頁。
1,830 日係請求上限,唔代表每個貨幣對都有咁長歷史。檢查 source、行同 data: []。
例子冇 2026 年 6 月 13 日,因為範圍接口只返回保存觀測,唔會為每個曆日整行。
唔可以。係指示性匯率;請睇 notice 同 source。

使用範圍接口

start_date 同 end_date 包括首尾兩日。base 預設 USD,symbols 用逗號分隔。亦可以開英文歷史工具。

data 包含保存觀測行。有下一頁就繼續用 has_more 同 next_cursor;CSV 同 Parquet 可以下載支援時段。

GET /v1/rangecopy
$ curl -G "https://api.exchangerate.dev/v1/range" \
    -H "Authorization: Bearer exr_live_..." \
    --data-urlencode "base=USD" \
    --data-urlencode "symbols=EUR,GBP" \
    --data-urlencode "start_date=2026-06-10" \
    --data-urlencode "end_date=2026-06-13"

閱讀 JSON 回應

data 包含保存觀測行。有下一頁就繼續用 has_more 同 next_cursor;CSV 同 Parquet 可以下載支援時段。

JSONcopy
{
  "result": "success",
  "base": "USD",
  "start_date": "2026-06-10",
  "end_date": "2026-06-13",
  "data": [
    { "date": "2026-06-10", "rates": { "EUR": 0.86663, "GBP": 0.74727 },
      "source": "ecb_daily", "is_forward_filled": false },
    { "date": "2026-06-11", "rates": { "EUR": 0.86678, "GBP": 0.74829 },
      "source": "ecb_daily", "is_forward_filled": false },
    { "date": "2026-06-12", "rates": { "EUR": 0.86453, "GBP": 0.74613 },
      "source": "ecb_daily", "is_forward_filled": false }
  ],
  "has_more": false,
  "next_cursor": null
}

缺少嘅曆日

例子冇 2026 年 6 月 13 日,因為範圍接口只返回保存觀測,唔會為每個曆日整行。

用 Python 分頁

呢個迴圈會跟晒每個游標。

Python · requestscopy
import requests

API = "https://api.exchangerate.dev/v1"
KEY = "exr_live_..."   # free key at https://exchangerate.dev/signup

params = {
    "base": "USD",
    "symbols": "EUR,GBP",
    "start_date": "2026-06-10",
    "end_date": "2026-06-13",
}

rows = []
while True:
    resp = requests.get(
        f"{API}/range",
        headers={"Authorization": f"Bearer {KEY}"},
        params=params,
        timeout=10,
    )
    resp.raise_for_status()
    data = resp.json()
    rows.extend(data["data"])
    if not data["has_more"]:
        break
    cursor = data.get("next_cursor")
    if not cursor or cursor <= params.get("cursor", ""):
        raise RuntimeError("Incomplete historical response")
    params["cursor"] = cursor

for row in rows:
    filled = row["is_forward_filled"]
    print(row["date"], row["rates"]["EUR"], row["rates"]["GBP"], "filled" if filled else "")

分清觀測值同順延值

範圍觀測嘅 is_forward_filled 係 false;指定日期可能返回之前嘅值並標記 true。

週末唔係觀測值
範圍結果省略 2026 年 6 月 13 日。直接查呢日可能返回之前嘅值,並標記 is_forward_filled 為 true。

選擇指定日期或範圍

單日查詢適合睇一日;範圍適合圖表、回填同批量分析。

項目指定日期範圍
請求每日一次一次請求加分頁
回應一日data 陣列

檢查覆蓋範圍

1,830 日係請求上限,唔代表每個貨幣對都有咁長歷史。檢查 source、行同 data: []。

pandas

載入 pandas 後按日期排序,計算前剔除順延值。

Python · pandascopy
import pandas as pd

# rows contains every page from the loop above
df = pd.json_normalize(rows)
df["date"] = pd.to_datetime(df["date"])
df = df.set_index("date").sort_index()

# keep only rows that were actually published that day
df = df[~df["is_forward_filled"]]

print(df[["rates.EUR", "rates.GBP"]].tail())

pandas 唔係必需,其他工具都可以處理相同資料。

在歷史匯率工具查詢日期(英文)

ER
exchangerate.dev
FX 資料整合實用指南

延伸閱讀

Tutorial用 Python 取得匯率閱讀
比較Fixer vs exchangerate.dev比較Open Exchange Rates vs exchangerate.dev比較Currencylayer vs exchangerate.dev指南用 JavaScript 同 Node.js 做貨幣換算指南用 Python 攞匯率指南喺 Next.js 同 TypeScript 攞匯率即時匯率EUR/USD即時匯率GBP/USD即時匯率USD/JPY