如果你的应用程序需要将巴西雷亚尔换算成印度卢比、挪威克朗换算成新加坡元,或者任何美元都不出现在两侧的货币对,那么你即将进行交叉汇率计算。大多数货币 API 和外汇市场都会针对美元报价数千个货币对,但只有少数货币对会在两种非美元货币之间直接交易。其他所有的——也就是所谓的长尾——都是作为交叉汇率计算出来的。
本指南将解释什么是交叉汇率、公式的三种形式、可以用计算器验证的实例,以及生产级别的 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 以及大多数支付处理商在内部计算这个交叉汇率,然后再加上他们的外汇加价。
金融分析和交易。 量化系统会对以多种货币计价的投资组合进行风险对冲。要知道你在 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 一边是基础,一边是计价(混合)
这是最常见的情况,也是最容易出错的地方。假设你有:
- 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 点价差)
- USD/JPY 买价 152.27,卖价 152.33(6 点价差)
隐含的 EUR/JPY 交叉汇率是:
Bid = 1.0848 × 152.27 = 165.183
Ask = 1.0852 × 152.33 = 165.309这是交叉汇率上 12.6 点的价差——比任一源货币对都要宽。在实践中,直接报价的 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+ 货币中的任意一种,并在一次调用中请求任意数量的目标货币。如需更多语言特定的模式,请参阅我们的 货币 API Python 教程、Node.js 集成指南 和 PHP 指南。
什么时候应该自己计算交叉汇率
即使有一个好用的 API,仍有三种情况你会在自己的数据上计算交叉汇率,而不是直接获取:
回测历史策略。 如果你在自己的服务器上有多年 EUR/USD 和 USD/JPY 的 tick 数据,本地计算 EUR/JPY 可以避免把外部 API 调用数百万次。使用 历史汇率端点 来填充数据,然后在你的回测引擎中推导交叉汇率。
对延迟敏感的应用。 算法交易系统经常在内存中预计算来自底层 USD 货币对的交叉汇率,因为节省一次网络往返非常重要。代价是你需要自己负责同步和新鲜度。
自定义混合汇率。 一些平台报价的内部汇率会混合多个数据源或加上加价。在内部做交叉汇率计算可以让你在向客户展示之前应用自己的业务逻辑。
如果你的用例不属于以上任何一种——结账页面、开票工具、内部仪表板——就让 API 直接提供交叉汇率。这样会更准确、更易于维护,也更快实现。
计算交叉汇率时的常见陷阱
这些是我们在审查开发者代码时最常见的错误。
反转错了货币对。 当两个源货币对的报价方向相反时(一个是 USD 为基础,一个是 USD 为计价),很容易在应该反转再相除的时候做了乘法。始终把汇率写成分数,确认共同货币能够约掉。
过早四舍五入。 一个常见 bug:把每个源汇率四舍五入到四位小数,再相乘。复合的四舍五入会产生 0.01% 到 0.1% 的误差。对于金融计算,保持完整精度,只在显示时四舍五入。
使用过期汇率。 如果你的两个源汇率是相隔 30 秒获取的,由它们构建的交叉汇率内部就不一致了。在一次 API 调用中获取两者(这正是 Finexly API 中 ?symbols=A,B,C 所做的),让它们的时间戳一致。
混合工作日和周末数据。 外汇市场周末休市。如果你的定时任务在周五东部时间下午 5:01 拉取了 EUR/USD,在周五东部时间下午 4:59 拉取了 USD/JPY,你就可能在混合实时数据和过期数据。把所有汇率获取都标准化到一个市场时间戳上。我们在 外汇市场时段指南 中详细讨论了这一点。
对交易性使用忽略价差。 从中间市场源计算的交叉汇率适合显示,但如果有真实资金流动,你需要根据交易方向使用买价或卖价。明确地在代码中建模价差,而不是依赖中间价。
常见问题
用简单的话说,什么是交叉汇率?
它是两种货币之间的汇率,使用每种货币对第三种共同货币(通常是美元)的汇率计算得出。例如,EUR/JPY 汇率是从 EUR/USD 和 USD/JPY 推导出来的。
EUR/JPY 和 GBP/JPY 算交叉汇率吗?
技术上算。它们不包括美元,所以按严格定义就是交叉汇率。然而这两个货币对都被广泛地直接交易,拥有自己独立的报价市场,在实践中表现得像主要货币对。
为什么交叉汇率重要?
交叉汇率使得对那些彼此之间没有流动性直接市场的货币——也就是世界上大多数货币对——进行报价和交易成为可能。它们对跨境支付、多币种商务和全球金融分析都至关重要。
我可以不用美元作为桥梁来计算交叉汇率吗?
可以。任何共同货币都可以作为桥梁。在以欧洲为中心的计算中有时使用 EUR,在某些亚洲市场使用 JPY。USD 是默认选项,因为更多货币对针对它报价,数据质量更好。
计算出的交叉汇率与直接市场报价相比有多准确?
对于像 EUR/JPY 或 GBP/CHF 这样的流动交叉汇率,由于套利的存在,计算值和直接报价几乎相同。对于像 NGN/PHP 这样的非流动交叉汇率,计算值是唯一可用的参考点——没有单独的直接市场可以比较。
Finexly 会自动计算交叉汇率吗?
是的。你请求任意基础货币和任意目标货币列表,API 就会提供一致的中间市场交叉汇率。你不需要自己计算或反转任何东西。
开始使用 Finexly
准备好在你的应用中使用实时交叉汇率了吗?免费获取你的 Finexly API Key——无需信用卡。免费方案每月给你 1,000 次请求,你可以随着流量增长通过我们的 价格方案 进行扩展。API 支持 170+ 货币,并且能无缝地为任意货币对计算交叉汇率,让你专注于产品而不是外汇数学。
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 →