货币对详解:主要、次要和外来货币对(开发者指南)
只要你在构建任何涉及国际资金的产品——结账系统、金融科技仪表板、交易机器人、资金管理工具,甚至最简单的货币转换器——你都会在工作的第一个小时内遇到货币对这个概念。货币对是外汇(FX)市场的计量单位:单一货币本身没有价格,只有相对于另一种货币才有价值。理解货币对如何分类、报价以及在代码中如何处理,是你构建任何外汇功能的基础。
本指南从开发者视角解释主要、次要和外来货币对。我们将介绍每个类别的含义、读写货币对字符串时必须遵守的惯例,以及通过 Finexly API 文档获取、规范化和计算货币对的实用模式。读完后,你将了解应该优先支持哪些货币对,如何处理边缘情况,以及如何用几行代码拉取实时汇率。
什么是货币对?
货币对是一种用一种货币表达另一种货币价格的报价。它总是以两个 ISO 4217 代码书写——例如 EUR/USD 或 EURUSD——加上一个十进制价格。
货币对中的第一种货币是基础货币,第二种是报价货币(有时称为对手货币)。价格告诉你需要多少单位的报价货币才能买入一单位基础货币。
因此,EUR/USD = 1.0850 表示一欧元价值 1.0850 美元。如果报价上升到 1.0900,欧元相对美元走强。如果跌到 1.0800,欧元走弱。基础货币是"被定价的对象",报价货币是"用来支付的钱"。
这是个简单惯例,却几乎让每个开发者至少踩过一次坑。如果你在存储汇率时没有持续地区分哪一边是基础货币、哪一边是报价货币,你迟早会把数字反过来,悄悄地多收或少收用户的钱。我们将在下面的代码部分介绍如何避免这种情况。如果想深入了解价格本身是如何形成的,请参考我们的汇率运作原理指南。
根据国际清算银行的三年期调查,全球外汇市场每日交易量约为 7.5 万亿美元,是世界上最大的金融市场。但流动性并未平均分布在各货币对上——绝大部分集中在被称为"主要货币对"的一小群货币对中。
主要货币对
主要货币对是世界上交易最活跃的货币对。市场没有单一官方定义,但实际上每个主要货币对都具备两个属性:一边是美元(USD),另一边是来自一个庞大、稳定、发达经济体的货币。
业界几乎一致认可的主要货币对有七个:
EUR/USD— 欧元 / 美元USD/JPY— 美元 / 日元GBP/USD— 英镑 / 美元USD/CHF— 美元 / 瑞士法郎AUD/USD— 澳元 / 美元USD/CAD— 美元 / 加元NZD/USD— 新西兰元 / 美元
主要货币对合计约占全球外汇交易量的 75%,其中仅 EUR/USD 一对就贡献约四分之一。这种集中度对你构建的任何产品都有直接影响:
- 最窄的点差。 买价(买方愿意付的)和卖价(卖方索要的)之间的差距在主要货币对上最小。如果你向终端用户展示汇率,这意味着中间市场汇率与他们实际收到的差距最小。
- 更高的更新频率。 主要货币对的逐笔行情数据在交易时段每秒可达多次。次要和外来货币对更新更稀疏。
- 最可靠的历史数据。 如果你做回测、分析或绘图,主要货币对的历史会最干净、最长、几乎无缺口。
- 每次有效响应的 API 成本最低。 由于一个主要货币对常作为构建数十个其他汇率的基石(通过交叉计算),你可以激进缓存主要货币对,再派生其他货币对,从而服务一个全球产品。
下面是用单次请求从 Finexly 拉取全部七个主要货币对的最小示例:
// Fetch all major pairs vs USD in a single call
const symbols = ['EUR', 'JPY', 'GBP', 'CHF', 'AUD', 'CAD', 'NZD'];
const response = await fetch(
`https://api.finexly.com/v1/latest?base=USD&symbols=${symbols.join(',')}`,
{ headers: { 'Authorization': 'Bearer YOUR_API_KEY' } }
);
const data = await response.json();
console.log(data.rates);
// { EUR: 0.9217, JPY: 154.32, GBP: 0.7891, CHF: 0.8843, ... }注意我们请求的是 base=USD,并以 USD 为基准返回每个符号的汇率。要得到惯例方向(例如 EUR/USD 而不是 USD/EUR),可能需要做一次倒数处理。我们会在下面的代码部分介绍这个模式。
次要(交叉)货币对
次要货币对也叫交叉货币对或交叉盘,由两种主要货币组成且不包含美元。"交叉"一词源于历史上这些货币对必须通过"交叉"两个 USD 货币对来计算——例如,从 EUR/USD 和 GBP/USD 推导出 EUR/GBP。如今大多数 API 和经纪商直接报价,但理解底层数学依然有用。
常见次要货币对包括:
EUR/GBP— 欧元 / 英镑EUR/JPY— 欧元 / 日元EUR/CHF— 欧元 / 瑞士法郎GBP/JPY— 英镑 / 日元AUD/JPY— 澳元 / 日元CHF/JPY— 瑞士法郎 / 日元EUR/AUD— 欧元 / 澳元GBP/CAD— 英镑 / 加元
交叉盘的流动性依然不错——尤其是欧元和日元的交叉盘——但点差通常比七个主要货币对更宽,盘中波动也更大。例如 GBP/JPY 在交易者中以剧烈波动闻名,因此有时被称为"恶兽"。
对开发者而言,实际意义是:不要假设所有非美元货币对都需要外来盘级别的加价或外来盘级别的更新频率。交叉盘介于两者之间:足以服务几乎任何 B2C 或 B2B 产品的流动性,但点差不及 EUR/USD 那般紧。
如果你的供应商不直接报价某个交叉盘,你总是可以用两条 USD 边来派生它:
# Derive EUR/GBP from EUR/USD and GBP/USD
eur_usd = 1.0850 # 1 EUR = 1.0850 USD
gbp_usd = 1.2680 # 1 GBP = 1.2680 USD
# 1 EUR = (eur_usd / gbp_usd) GBP
eur_gbp = eur_usd / gbp_usd
print(f"EUR/GBP = {eur_gbp:.4f}") # EUR/GBP = 0.8557这正是大多数汇率引擎在幕后所做的事情。Finexly 通过货币转换接口直接返回交叉盘,但把这点数学装在脑子里是好事:它能让你随手核对任何汇率,并在某个货币对从 feed 中缺失时优雅降级。
外来货币对
外来货币对将一种主要货币(通常是 USD 或 EUR)与较小的、新兴的或流动性较弱的经济体的货币组合在一起。例子包括:
USD/TRY— 美元 / 土耳其里拉USD/MXN— 美元 / 墨西哥比索USD/ZAR— 美元 / 南非兰特USD/BRL— 美元 / 巴西雷亚尔USD/INR— 美元 / 印度卢比USD/THB— 美元 / 泰铢EUR/PLN— 欧元 / 波兰兹罗提EUR/HUF— 欧元 / 匈牙利福林USD/SGD— 美元 / 新加坡元USD/HKD— 美元 / 港元
"次要"和"外来"之间的界线是模糊的——USD/SGD 和 USD/HKD 因其经济体高度发达,有时被归为次要;而 USD/CNH(离岸人民币)因贸易量大,有时被归为主要。类别本身不那么重要,影响你代码的是其特征:
- 更宽的点差。 买卖价差可能比主要货币对宽 5–20 倍。
- 非交易时段流动性更低。 许多外来货币对在当地市场营业时间之外交易稀薄,因此周末或夜间汇率可能陈旧或跳动。
- 对头条事件更敏感。 外来货币对当地政治新闻、央行决议和资本管制公告剧烈反应。详见我们的深入分析:地缘政治事件如何影响货币汇率。
- 更频繁的汇率跳空。 像
USD/TRY这样的货币对在一个周末或一次利率决议后,可能跳几个百分点。如果你的开票或定价逻辑没有处理这种情况,你可能在大幅波动后向用户展示一个小时的陈旧汇率。 - 联系汇率或受管理的货币。 一些"外来"货币对几乎不动,因为央行进行干预——
USD/HKD是经典例子,被维持在窄幅区间内。你的图表会几乎是平的,这是正确的,不是数据 bug。
如果你的产品服务新兴市场,不要把外来货币对当成脚注——这往往是最痛的定价问题所在。我们另有一篇关于2026 年应对货币波动的深入指南,详述运营层面的模式。
直接、间接与反向报价
除了主要 / 次要 / 外来之外,每个开发者还需要掌握另一个词汇:直接报价和间接报价的区别。
直接报价用本币单位表达外币。从美国视角看,USD/EUR = 0.92 是直接报价——它告诉美国用户一美元买 0.92 欧元。间接报价则相反:EUR/USD = 1.0850 从欧洲视角看是直接报价,从美国视角看就是间接报价。
外汇市场惯例的报价方向遵循历史上的"等级"规则,而非用户视角:
EUR与任何货币配对时永远作为基础货币。GBP除了与EUR配对外都是基础货币。AUD和NZD在与大多数货币配对时是基础货币,除了EUR和GBP之外。USD在与大多数货币配对时是基础货币,除了上述四种之外。JPY几乎总是作为报价货币。
所以 EUR/USD、GBP/USD、AUD/USD、USD/JPY、USD/CHF 才是惯例方向——绝不会写成 USD/EUR。如果你的供应商返回 USD/EUR,那是它把所有汇率都以 USD 为基准返回的标志,由你负责在向期待惯例方向的交易员或金融专业用户展示时翻转货币对。
翻转就是简单的数学,但很容易出错:
// Convert USD-based rate to conventional pair direction
function toConventionalQuote(base: string, quote: string, rate: number) {
const usdBaseFirst = ['EUR', 'GBP', 'AUD', 'NZD'];
// If the quote currency is "stronger" by convention, flip
if (usdBaseFirst.includes(quote)) {
return { pair: `${quote}/${base}`, rate: 1 / rate };
}
return { pair: `${base}/${quote}`, rate };
}
toConventionalQuote('USD', 'EUR', 0.9217);
// → { pair: 'EUR/USD', rate: 1.0850 }如果你只向终端用户展示价格,他们并不在意市场惯例,那你可以完全跳过这一步,全部以本币报价。但如果你服务的是专业用户——交易员、司库、会计——把方向写对就是可信度的标志。
如何在代码中处理货币对
这里是大多数开发者 bug 的栖身之地。下面是我们推荐的模式,提炼自数千次 API 集成经验。
1. 内部始终使用 ISO 4217 代码
切勿把货币标识符存为符号($、€、¥)或名称("美元")。把它们存为三字母 ISO 4217 代码:USD、EUR、JPY。符号有歧义($ 被 20 多种货币使用),名称会本地化。ISO 代码无歧义且语言中立。
2. 在边界规范化货币对字符串
你会看到货币对被写成 EURUSD、EUR/USD、EUR-USD、EUR_USD、eur/usd 等多种形式。选一种内部表示,并在系统边界统一规范化:
function normalizePair(input) {
const cleaned = input.toUpperCase().replace(/[^A-Z]/g, '');
if (cleaned.length !== 6) {
throw new Error(`Invalid pair: ${input}`);
}
return {
base: cleaned.slice(0, 3),
quote: cleaned.slice(3, 6),
canonical: `${cleaned.slice(0, 3)}/${cleaned.slice(3, 6)}`,
};
}
normalizePair('eur-usd');
// → { base: 'EUR', quote: 'USD', canonical: 'EUR/USD' }在内部,优先使用结构化形式({ base, quote })而非字符串。字符串用于日志和 API;结构化数据用于代码。
3. 通过中转货币在任意两种货币间转换
如果你以单一基准(按惯例是 USD)缓存汇率,就可以即时计算任何货币对:
def convert(amount, source, target, rates_in_usd):
"""
rates_in_usd: dict like {'EUR': 0.9217, 'GBP': 0.7891, ...}
Each value is "1 USD = X units of currency"
"""
if source == target:
return amount
if source == 'USD':
return amount * rates_in_usd[target]
if target == 'USD':
return amount / rates_in_usd[source]
# Pivot through USD
amount_in_usd = amount / rates_in_usd[source]
return amount_in_usd * rates_in_usd[target]
# Convert 100 EUR to JPY using USD-based rates
rates = {'EUR': 0.9217, 'JPY': 154.32}
print(convert(100, 'EUR', 'JPY', rates)) # 16,743.31这种模式让你只需一份"USD 兑所有货币"的热缓存就能支持 170+ 种货币。Finexly 的 /v1/latest?base=USD 接口正是返回这种形状。
4. 正确处理小数精度
货币对的惯例精度各不相同:大多数主要货币对报价到 4 或 5 位小数(1.08503),而 JPY 货币对报价到 2 或 3 位(154.32)。像越南盾这样的货币没有辅币单位。在计算涉及用户余额的金额时,始终把汇率存为 Decimal / BigDecimal 类型——绝不要用浮点。我们的 Python 货币 API 教程详细讲解了相关坑。
5. 聪明地缓存,而非粗暴地缓存
主要货币对在平静市场中每秒之间几乎不动,因此你可以把它们缓存 30–60 秒而无人察觉。外来货币对在计划新闻附近可能需要更短的 TTL。我们的缓存与错误处理指南介绍了一种适用于两者的分层缓存策略。
常见错误及避坑指南
一些让真实团队栽跟头的事情:
- 只存储汇率而不存储货币对方向。 "1.0850"在没说是
EUR/USD还是USD/EUR时毫无意义。 - 在同一个 UI 中混用用户视角和市场视角的报价。 选一种并清楚地标注。
- 把周末汇率当成实时。 外汇市场从周五美东时间下午 5 点关到周日下午 5 点。你周六上午提供的汇率是周五的收盘价——对大多数应用没问题,但对任何执行场景都很危险。参见外汇市场交易时间。
- 硬编码"支持的货币对"列表。 用 API 的
symbols接口作为事实来源。新货币会出现(也很少消失)。 - 过早四舍五入。 在显示时四舍五入,而非在计算中。一个四位小数的中间市场汇率乘以一个小金额,如果在管线中途取整,可能丢失有意义的精度。
常见问题
总共有多少种货币对? 全球约有 180 种活跃交易的国家货币,理论上独特货币对的数量约为 16,000(180 × 179 / 2)。实际上只有几百对具有有意义的流动性,大多数 API(包括 Finexly)公开 170+ 种货币,可派生约 14,000 个货币对。大多数产品在 UI 中只需支持 20–50 个。
世界上交易量最大的货币对是哪个?
EUR/USD 是交易量最大的货币对,约占外汇日交易量的 22–24%。USD/JPY 和 GBP/USD 紧随其后。
USD/EUR 和 EUR/USD 是一回事吗?
不是。两者数值上互为倒数(USD/EUR = 1 / EUR/USD),但是不同的报价。市场惯例是 EUR/USD。如果你向金融专业人士展示 USD/EUR,他们会以为出错了。
为什么外来货币对风险更高? 外来货币对建立在流动性较低的市场上,意味着更宽的点差、消息后更大的跳空、对当地政治事件更敏感,有时还有资本管制或央行干预。这些都不会让它们不可用——只是意味着你的代码不能像对待主要货币对那样假设"小点差、平滑的 tick 流"。
外来货币对需要不同的 API 套餐吗? Finexly 不需要。所有 170+ 货币——主要、次要和外来——在每个套餐(包括免费档)中都可用。套餐间的差异是调用量、刷新频率和历史数据深度,而不是货币对覆盖。详细对比请见价格方案页面。
应该多久刷新一次汇率? 对于大多数用例(电商展示、开票、报表):每 5–15 分钟足够。对于活跃交易或对冲:每几秒,或订阅一个 feed。对于会计期末结账:当日一次结算快照即可。
开始使用实时货币对数据
货币对是外汇的语言。一旦你对主要 / 次要 / 外来有了清晰的心智模型,并在代码中准备了一组整洁的规范化助手,你今后构建的任何外汇功能——转换器、多币种结账、SaaS 计费、报表——都会变得容易得多。
准备好把实时汇率接入你的项目了吗?免费注册,一分钟内拿到 Finexly API key,无需信用卡。你将获得每月 1,000 次免费请求,所有 170+ 货币的访问权,以及和专业金融科技产品同源的中间市场汇率。当你需要超出免费档时,我们的付费方案从适合独立项目的价格起,可扩展到企业级用量。
如果想先比较不同选择,请看我们的 2026 年最佳货币转换 API 解析。
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 →