브라질 헤알을 인도 루피로, 노르웨이 크로네를 싱가포르 달러로, 또는 미국 달러가 양쪽 어디에도 들어가지 않는 통화쌍을 환산해야 한다면, 곧 크로스 환율 계산을 마주하게 됩니다. 대부분의 통화 API와 외환 거래소는 달러 기준으로 수천 개의 통화쌍을 호가하지만, 두 개의 비-USD 통화 사이에서 직접 거래되는 통화쌍은 극소수에 불과합니다. 그 외의 모든 것 — 즉 롱테일에 해당하는 통화쌍 — 은 크로스 환율로 계산됩니다.
이 가이드에서는 크로스 환율이 무엇인지, 세 가지 형태로 나타나는 공식, 계산기로 검증할 수 있는 예제, 그리고 JavaScript, Python, PHP, cURL의 프로덕션 품질 코드를 다룹니다. 또한 실제 시스템에서 1% 단위의 오차를 일으키는 함정 — 반올림, 매수/매도 호가 스프레드, 오래된 환율, 역수 변환 실수 — 도 함께 살펴봅니다.
크로스 환율이란
크로스 환율은 원래 호가에서 어느 쪽도 자국 통화나 기준 통화가 아닐 때, 한 통화를 다른 통화로 표현한 가격입니다. 실무적으로는 거의 항상 미국 달러를 포함하지 않는 통화쌍을 의미하며, 이는 각각 달러를 포함하는 두 개의 통화쌍에서 도출됩니다.
예를 들어 EUR/JPY 환율은 기술적으로 크로스 환율입니다. EUR/JPY는 세계에서 가장 활발히 거래되는 통화쌍 중 하나로 자체적인 호가 시장이 있지만, 그 기저의 논리는 같습니다. EUR/USD를 가져오고, USD/JPY를 가져와서 곱하면, 도쿄의 은행이 제시하는 것과 동일한 숫자가 나옵니다. 시장 호가와 계산된 크로스 환율은 차익거래에 의해 서로 고정되어 있어, 둘이 벌어지면 트레이더들이 개입해 다시 일치할 때까지 거래합니다.
직접 시장에 충분한 유동성이 없는 통화 — 예를 들어 나이지리아 나이라 대 필리핀 페소(NGN/PHP) — 는 오로지 크로스 환율로만 존재합니다. 의미 있는 NGN/PHP 시장은 사실상 없습니다. 이 통화쌍을 호가하는 누구든 NGN/USD와 USD/PHP로부터 계산하고 있는 것입니다.
기술적 정의는 차이를 더 명확히 합니다.
- 직접 환율은 시장이나 집계 피드에서 능동적으로 호가되는 환율입니다.
- 크로스 환율은 공통 기준 통화(보통 USD)를 공유하는 둘 이상의 직접 환율로부터 계산되는 환율입니다.
Finexly를 비롯한 대부분의 API 제공업체는 크로스 환율을 매끄럽게 제공합니다. 어떤 통화쌍이든 요청하면 엔진이 내부에서 계산을 처리합니다. 그래도 그 수학이 어떻게 동작하는지 아는 것은 중요합니다. 정밀도, 스프레드, 엣지 케이스를 어떻게 다루느냐에 직접 영향을 주기 때문입니다.
개발자에게 크로스 환율이 중요한 이유
크로스 환율은 세 가지 유형의 애플리케이션에서 등장합니다.
국경 간 결제와 송금. 브라질 클라이언트에게 청구하는 필리핀 프리랜서는 자신의 PHP 단가가 BRL로 얼마인지 궁금해합니다. 직접적인 BRL/PHP 시장은 없으며, 플랫폼은 USD를 거쳐 계산합니다.
다중 통화 이커머스. 노르웨이 판매자가 싱가포르 고객에게 가격을 표시하려면 NOK/SGD가 필요합니다. Stripe, Adyen 등 대부분의 결제 처리사는 이 크로스를 내부에서 계산하고 자체 FX 마진을 얹어서 보여줍니다.
금융 분석과 트레이딩. 퀀트 시스템은 다양한 통화로 표시된 포트폴리오의 익스포저를 헤지합니다. 순 EUR 익스포저를 알기 위해 MXN, INR, ZAR, BRL의 포지션을 EUR로 환산해야 하며 모두 크로스 계산입니다.
각각의 경우, 크로스 환율의 품질은 두 개의 기초 USD 통화쌍의 품질과 신선도에 전적으로 의존합니다. 2초 전 EUR/USD와 60초 전 USD/JPY를 결합하면, 그 사이 JPY가 움직인 만큼 잘못된 크로스 값이 나옵니다. 환율의 출처와 갱신 방식에 대한 입문은 환율의 작동 원리 가이드를 참고하세요.
크로스 환율 공식
소스가 되는 두 통화쌍이 어떻게 호가되느냐에 따라 세 가지 경우가 있습니다. 일반 원칙은 단순합니다. 환율을 분수로 쓸 때, 공통 통화가 약분되어야 합니다.
경우 1: 두 통화쌍 모두에서 USD가 호가 통화일 때
다음과 같다고 가정합니다.
- EUR/USD = 1.0850 (1 EUR = 1.0850 USD)
- GBP/USD = 1.2620 (1 GBP = 1.2620 USD)
EUR/GBP를 구하고 싶다면 공식은 다음과 같습니다.
EUR/GBP = (EUR/USD) / (GBP/USD)
EUR/GBP = 1.0850 / 1.2620 = 0.8598따라서 1유로는 0.8598파운드입니다. 두 소스 호가 모두 USD가 오른쪽에 있으므로 나눕니다.
경우 2: 두 통화쌍 모두에서 USD가 기준 통화일 때
다음과 같다고 가정합니다.
- USD/JPY = 152.30
- USD/CHF = 0.8920
JPY/CHF를 구하고 싶다면 공식은 다음과 같습니다.
JPY/CHF = (USD/CHF) / (USD/JPY)
JPY/CHF = 0.8920 / 152.30 = 0.005857따라서 1엔은 0.005857 스위스 프랑입니다. 두 소스 호가 모두 USD가 왼쪽에 있으므로 나눕니다. 단 비율은 뒤집어집니다.
경우 3: 한쪽은 USD가 기준, 다른 쪽은 USD가 호가(혼합)
가장 흔한 경우이자, 실수가 가장 자주 발생하는 경우입니다. 다음과 같다고 가정합니다.
- EUR/USD = 1.0850 (USD는 호가)
- USD/JPY = 152.30 (USD는 기준)
EUR/JPY를 구하고 싶다면 공식은 다음과 같습니다.
EUR/JPY = (EUR/USD) × (USD/JPY)
EUR/JPY = 1.0850 × 152.30 = 165.25따라서 1유로는 165.25엔입니다. 달러가 깔끔하게 약분되어 — 달러당 유로 × 엔당 달러 = 엔당 유로. 혼합 경우에는 곱합니다.
간단한 경험칙: 통화쌍을 분수로 적고, USD가 약분되도록 정렬한 뒤, 그에 따라 곱하거나 나눕니다. 분자에 남는 통화가 크로스 환율의 기준 통화가 됩니다.
직접 검증할 수 있는 예제
주요 통화 피드 어디든 사용해 이 숫자들을 검증해 볼 수 있습니다. 정확한 값은 시장에 따라 변하지만 구조가 핵심입니다.
예제 1: EUR/JPY (혼합 경우)
EUR/USD = 1.0850, USD/JPY = 152.30이라면:
EUR/JPY = 1.0850 × 152.30 = 165.2455예제 2: GBP/CHF (혼합 경우)
GBP/USD = 1.2620, USD/CHF = 0.8920이라면:
GBP/CHF = 1.2620 × 0.8920 = 1.1257예제 3: AUD/NZD (둘 다 USD에 대해 호가)
AUD/USD = 0.6630, NZD/USD = 0.6010이라면:
AUD/NZD = 0.6630 / 0.6010 = 1.1031따라서 1 호주달러는 1.1031 뉴질랜드달러입니다.
예제 4: BRL/INR (둘 다 USD를 기준으로 호가)
USD/BRL = 5.0850, USD/INR = 84.20이라면:
BRL/INR = (USD/INR) / (USD/BRL) = 84.20 / 5.0850 = 16.561따라서 1 브라질 헤알은 16.561 인도 루피입니다.
여기서 사용된 표준 세 글자 코드를 다시 보고 싶다면 ISO 4217 통화 코드 가이드를 참고하세요.
역수 환율과 통화쌍 뒤집기
데이터 피드가 USD/EUR을 주는데 EUR/USD가 필요할 때가 있습니다. 역수는 다음과 같습니다.
EUR/USD = 1 / (USD/EUR)USD/EUR = 0.9217이면 EUR/USD = 1 / 0.9217 = 1.0850입니다.
역수에 관한 두 가지 실용적 포인트:
첫째, 반올림은 누적됩니다. 환율을 소수점 4자리에서 반올림한 뒤 역수를 취하고, 다시 반올림하면 0.01% 이상의 오차가 들어올 수 있습니다. 고정밀이 필요한 애플리케이션에서는 표시 직전까지 역수를 부동소수점 풀 정밀도로 유지하세요. 정밀도 전략은 통화 API 캐시·에러 처리 모범 사례에서 자세히 다룹니다.
둘째, 역수를 취하면 매수와 매도가 뒤집힙니다. GBP/USD의 매수 1.2618, 매도 1.2622라면, USD/GBP의 매수는 1/1.2622 = 0.7923, 매도는 1/1.2618 = 0.7925입니다. 한 쪽 통화쌍의 매수는 다른 쪽 통화쌍의 매도의 역수이지, 매수의 역수가 아닙니다.
크로스 환율의 매수/매도 스프레드
두 개의 기초 통화쌍에서 크로스 환율을 만들면 스프레드가 누적됩니다.
가정해 봅시다.
- EUR/USD: 매수 1.0848, 매도 1.0852 (4 pip 스프레드)
- USD/JPY: 매수 152.27, 매도 152.33 (6 pip 스프레드)
이때 암묵적인 EUR/JPY 크로스는 다음과 같습니다.
Bid = 1.0848 × 152.27 = 165.183
Ask = 1.0852 × 152.33 = 165.309크로스에서의 스프레드가 12.6 pip이며, 어느 쪽 소스 통화쌍보다도 넓습니다. 실제로 직접 호가되는 EUR/JPY 시장은 이 계산값보다 더 좁은 스프레드를 갖습니다. 유동성이 풍부한 크로스 통화쌍에는 자체 마켓메이커가 있기 때문입니다.
개발자에게 주는 시사점은, 두 개의 USD 통화쌍에서 계산한 미드마켓 크로스 환율은 진짜 직접 시장의 추정치라는 것입니다. 체크아웃 가격 표시에는 충분하고 분석에도 무난하지만, 은행이나 브로커가 실제로 체결해 주는 가격은 아닙니다. 미드마켓 대 딜러 환율의 구분은 미드마켓 환율 가이드를 참고하세요.
Finexly API로 크로스 환율 계산하기
보통 크로스 환율을 손으로 계산할 필요는 없습니다. Finexly API는 어떤 기준 통화든, 어떤 대상 통화 목록이든 받아서 일관된 정밀도로 크로스를 내부에서 계산해 돌려줍니다. 네 가지 흔한 스택에서의 사용 예시입니다.
cURL
curl "https://api.finexly.com/v1/latest?base=BRL&symbols=INR,PHP,NGN" \
-H "Authorization: Bearer YOUR_API_KEY"응답:
{
"base": "BRL",
"date": "2026-05-09",
"rates": {
"INR": 16.561,
"PHP": 11.272,
"NGN": 312.45
}
}JavaScript (Node 20+, Fetch)
async function getCrossRates(base, targets) {
const url = `https://api.finexly.com/v1/latest?base=${base}&symbols=${targets.join(",")}`;
const res = await fetch(url, {
headers: { Authorization: `Bearer ${process.env.FINEXLY_API_KEY}` }
});
if (!res.ok) throw new Error(`Finexly API error: ${res.status}`);
return res.json();
}
const data = await getCrossRates("BRL", ["INR", "PHP", "NGN"]);
console.log(`1 BRL = ${data.rates.INR} INR`);Python
import os
import requests
def get_cross_rates(base, targets):
url = "https://api.finexly.com/v1/latest"
params = {"base": base, "symbols": ",".join(targets)}
headers = {"Authorization": f"Bearer {os.environ['FINEXLY_API_KEY']}"}
response = requests.get(url, params=params, headers=headers, timeout=10)
response.raise_for_status()
return response.json()
data = get_cross_rates("BRL", ["INR", "PHP", "NGN"])
print(f"1 BRL = {data['rates']['INR']} INR")PHP
<?php
function getCrossRates(string $base, array $targets): array {
$symbols = implode(',', $targets);
$url = "https://api.finexly.com/v1/latest?base={$base}&symbols={$symbols}";
$ch = curl_init($url);
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . getenv('FINEXLY_API_KEY')],
CURLOPT_TIMEOUT => 10,
]);
$body = curl_exec($ch);
if (curl_errno($ch)) throw new RuntimeException(curl_error($ch));
curl_close($ch);
return json_decode($body, true);
}
$data = getCrossRates('BRL', ['INR', 'PHP', 'NGN']);
echo "1 BRL = {$data['rates']['INR']} INR\n";네 예제 모두에서 API가 크로스 환율 계산을 대신 처리해 정확한 미드마켓 값을 반환합니다. 기준 통화는 지원되는 170개 이상의 통화 중 어느 것으로든 변경할 수 있고, 한 번의 호출로 원하는 만큼 대상 통화를 요청할 수 있습니다. 언어별 더 자세한 패턴은 Python 통화 API 튜토리얼, Node.js 연동 가이드, PHP 가이드를 참고하세요.
직접 크로스 환율을 계산해야 하는 경우
좋은 API가 있어도, 직접 데이터를 사용해 크로스를 계산하는 시나리오가 세 가지 있습니다.
과거 전략 백테스트. 자체 서버에 EUR/USD와 USD/JPY의 다년간 틱 데이터가 있다면, 외부 API를 수백만 번 호출하지 않고 EUR/JPY를 로컬에서 계산하는 편이 효율적입니다. 과거 환율 엔드포인트로 데이터를 시드한 다음, 백테스트 엔진 안에서 크로스를 도출하세요.
지연에 민감한 애플리케이션. 알고리즘 트레이딩 시스템은 네트워크 왕복 한 번이라도 줄이는 게 중요해서 메모리 안에서 USD 통화쌍으로부터 크로스를 미리 계산하기도 합니다. 트레이드오프는 동기화와 신선도에 대한 책임을 직접 져야 한다는 점입니다.
커스텀 혼합 환율. 어떤 플랫폼은 여러 소스를 섞거나 마진을 얹은 자체 환율을 호가합니다. 크로스 계산을 사내에서 처리하면, 고객에게 환율을 노출하기 전에 자체 비즈니스 로직을 적용할 수 있습니다.
이 중 어디에도 해당하지 않는 경우 — 체크아웃 페이지, 청구 도구, 내부 대시보드 등 — 은 API가 직접 크로스를 제공하도록 두는 편이 더 정확하고, 유지보수도 쉽고, 구현도 빠릅니다.
크로스 환율 계산에서 흔한 함정
개발자 코드 리뷰에서 가장 자주 보는 실수들입니다.
잘못된 통화쌍을 뒤집기. 두 소스 통화쌍이 반대 방향으로 호가될 때(한쪽은 USD가 기준, 다른 쪽은 USD가 호가), 뒤집어서 나누어야 할 자리에 곱하기 쉽습니다. 항상 환율을 분수로 적고, 공통 통화가 정말 약분되는지 확인하세요.
너무 일찍 반올림. 흔한 버그입니다. 각 소스 환율을 소수점 넷째 자리에서 반올림한 뒤 곱하면, 누적 반올림으로 0.01~0.1%의 오차가 발생할 수 있습니다. 금융 계산에서는 풀 정밀도를 유지하고 표시 직전에만 반올림하세요.
오래된 환율 사용. 두 소스 환율을 30초 간격으로 가져왔다면, 그것으로 만든 크로스는 내부적으로 일관성이 없습니다. 두 환율을 한 번의 API 호출(Finexly API의 ?symbols=A,B,C이 그 역할)로 받아 같은 타임스탬프를 갖게 하세요.
평일과 주말 데이터를 섞기. 외환 시장은 주말에 닫힙니다. 스케줄 작업이 금요일 EST 17:01에 EUR/USD를, 금요일 EST 16:59에 USD/JPY를 가져왔다면 살아있는 데이터와 멈춘 데이터를 섞고 있을 수 있습니다. 모든 환율 수집을 단일 시장 타임스탬프 기준으로 표준화하세요. 자세한 내용은 외환 시장 운영 시간 가이드에서 다룹니다.
거래용으로 스프레드 무시. 미드마켓 소스로 계산한 크로스 환율은 표시에 적합하지만, 실제 자금이 움직이는 경우 거래 방향에 따라 매수 또는 매도가 필요합니다. 미드에만 의존하지 말고 코드에 명시적으로 스프레드 모델을 넣으세요.
자주 묻는 질문
크로스 환율을 쉽게 말하면 무엇인가요?
두 통화 사이의 환율로, 각 통화의 제3 공통 통화(보통 미국 달러)에 대한 환율을 사용해 계산한 것입니다. 예를 들어 EUR/JPY 환율은 EUR/USD와 USD/JPY로부터 도출됩니다.
EUR/JPY와 GBP/JPY는 크로스 환율인가요?
기술적으로는 그렇습니다. 미국 달러를 포함하지 않으므로 엄격한 정의로는 크로스입니다. 다만 두 통화쌍 모두 직접 거래가 매우 활발하고 자체 호가 시장이 있어 실무에서는 메이저 통화쌍처럼 다뤄집니다.
왜 크로스 환율이 중요한가요?
크로스 환율은 그들 사이에 유동성 있는 직접 시장이 없는 통화 — 즉 세계 대부분의 통화쌍 — 를 가격 책정하고 거래할 수 있게 해 줍니다. 국경 간 결제, 다중 통화 상거래, 글로벌 금융 분석에 필수적입니다.
미국 달러를 가교로 쓰지 않고도 크로스 환율을 계산할 수 있나요?
가능합니다. 어떤 공통 통화든 가교가 될 수 있습니다. EUR이 유럽 중심 계산에서 가끔 쓰이고, JPY도 일부 아시아 시장에서 쓰입니다. USD가 기본인 이유는 USD에 대해 호가되는 통화쌍이 더 많아 데이터 품질이 좋기 때문입니다.
계산된 크로스 환율은 직접 시장 호가와 비교했을 때 얼마나 정확한가요?
EUR/JPY나 GBP/CHF 같은 유동적인 크로스의 경우, 차익거래 덕분에 계산값과 직접 호가가 거의 동일합니다. NGN/PHP 같은 비유동적 크로스의 경우, 계산값이 유일한 기준점입니다 — 비교할 별도의 직접 시장이 없습니다.
Finexly는 크로스 환율을 자동으로 계산하나요?
네. 어떤 기준 통화든 어떤 대상 통화 목록이든 요청하면, API가 일관된 미드마켓 크로스 환율을 돌려줍니다. 직접 계산하거나 뒤집을 필요가 없습니다.
Finexly로 시작하기
애플리케이션에서 실시간 크로스 환율을 사용할 준비가 되셨나요? Finexly 무료 API 키 받기 — 신용카드는 필요 없습니다. 무료 플랜에서 월 1,000회 요청을 제공하며, 트래픽이 늘어나면 요금제로 확장할 수 있습니다. API는 170개 이상의 통화를 지원하고 어떤 통화쌍에 대해서도 크로스 환율을 매끄럽게 계산하므로, FX 수학이 아닌 제품에 집중할 수 있습니다.
Explore More
Vlado Grigirov
Senior Currency Markets Analyst & Financial Strategist
Vlado Grigirov is a senior currency markets analyst and financial strategist with over 14 years of experience in foreign exchange markets, cross-border finance, and currency risk management. He has wo...
View full profile →