학습/시계열

과거 환율과 시계열 데이터

/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를 받을 수 있습니다.

날짜 조회와 범위 선택

단일 날짜는 확인용이고 범위는 차트, backfill, 일괄 분석용입니다.

항목날짜범위
요청날짜마다 한 번한 번의 요청과 페이지
응답하루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 데이터 연동 실무 가이드

계속 읽기

TutorialPython으로 환율 가져오기읽기
비교Fixer vs exchangerate.dev비교Open Exchange Rates vs exchangerate.dev비교Currencylayer vs exchangerate.dev가이드ECB 기준환율 설명가이드JavaScript와 Node.js로 통화 변환하기가이드Python으로 환율 가져오기실시간 환율EUR/USD실시간 환율GBP/USD실시간 환율USD/JPY