有問題或遇到狀況?歡迎至 GitHub Discussions 發問。

Frankfurter 的 CSV 端點可直接載入 DataFrame,只要一行程式碼就能取得匯率。相較於一般市場報價,選擇 Frankfurter 的關鍵在於可重現性:鎖定單一資料來源後,歷史數據會維持原發布數值不變,今天跑出的回測結果與去年完全一致。

快速開始

將 read_csv 指向 CSV 端點:

import pandas as pd

df = pd.read_csv("https://api.frankfurter.dev/v2/rates.csv?base=usd&quotes=eur,gbp")

你會取得包含 date,base,quote,rate 的 DataFrame,每個目標貨幣占一列。

換算金額

CSV 提供的是匯率而非換算後總額,請將金額乘上 rate 欄位。若只需單一數值而不想載入 pandas,可直接用 requests 呼叫單一匯率端點:

import requests

rate = requests.get("https://api.frankfurter.dev/v2/rate/usd/eur").json()["rate"]
total = 100 * rate

鎖定官方資料來源

預設會回傳彙整所有來源的綜合匯率。加上 providers 可鎖定單一官方機構,確保分析結果具備可稽核性,因為許多司法管轄區規定外幣換算必須採用本國中央銀行公布的官方匯率。

df = pd.read_csv("https://api.frankfurter.dev/v2/rates.csv?base=usd&quotes=eur&providers=ecb")
ECB
歐洲中央銀行參考匯率,歐盟營業稅(VAT)與海關標準。
NBP
波蘭國家銀行,波蘭 VAT 與企業所得稅(CIT)法定換算匯率。
CNB
捷克國家銀行定盤價,用於捷克會計與稅務申報。
BCB
巴西中央銀行 PTAX,巴西合約與稅務參考匯率。
BANXICO
墨西哥銀行 FIX 匯率,用於結算美元計價債務。

瀏覽所有資料來源。鎖定單一來源時會依該機構自身的發布時間表更新,因此最新匯率可能比綜合匯率晚一天。

歷史時間序列

使用 from 指定起始日期,並搭配 group=month 將資料彙整為每月一列。解析日期欄位並設為索引後,即可直接繪圖或重新取樣。綜合歷史匯率可能隨新資料匯入而微幅變動,凡是需要重現結果的分析,請鎖定單一資料來源。

df = pd.read_csv(
    "https://api.frankfurter.dev/v2/rates.csv?from=1949-12-01&base=usd&quotes=gbp&providers=bbk&group=month",
    parse_dates=["date"],
    index_col="date",
)
df["rate"].plot()

上述查詢會從德國聯邦銀行(Deutsche Bundesbank)歷史檔案取得自 1949 年以來的美元兌英鎊匯率,你可以清楚看到 2.80 美元釘住匯率維持多年後於 1967 年脫鉤的過程。早期深度歷史資料來自德國聯邦銀行的法蘭克福定盤紀錄:美元兌馬克始於 1948 年,其餘多數美元交叉匯率涵蓋 1949 至 1970 年。1999 年起由歐洲中央銀行接手,因此連續的現代時間序列可使用預設綜合匯率或 providers=ecb。