ブラジル・レアルからインド・ルピーへ、ノルウェー・クローネからシンガポール・ドルへ、あるいは米ドルがどちらにも入っていない通貨ペアの換算をアプリケーションで行う必要があるなら、これから扱うのはクロスレートの計算です。多くの通貨 API や FX 取引所はドル建てで何千ものペアを建値していますが、米ドルを介さず 2 つの非 USD 通貨間で直接取引されるペアはごく一部に過ぎません。それ以外のすべて——いわゆるロングテール——はクロスレートとして計算されます。
このガイドでは、クロスレートとは何か、3 つのパターンに分かれる公式、電卓で検算できる計算例、そして JavaScript、Python、PHP、cURL の本番品質のコードを紹介します。さらに、実システムで 1% 単位のズレを引き起こす落とし穴——丸め、ビッド・アスクスプレッド、古いレート、反転ミス——も取り上げます。
クロスレートとは何か
クロスレートとは、元の建値において現地通貨や基準通貨ではない 2 通貨間の交換レートのことです。実務上は、ほぼ常に「米ドルを含まない通貨ペア」を、それぞれ米ドルを含む 2 つのペアから導いたものを指します。
たとえば EUR/JPY のレートは、技術的にはクロスレートです。EUR/JPY は世界でも有数の高流動ペアで、独自の建値市場を持っていますが、根底のロジックは変わりません。「EUR/USD を取り、USD/JPY を取り、掛け算する」と、東京の銀行が提示するのと同じ値が得られます。市場建値と計算上のクロスレートは、裁定取引(アービトラージ)によって相互に固定されており、もし乖離すればトレーダーが介入して再び一致するまで取引します。
ナイジェリア・ナイラ対フィリピン・ペソ(NGN/PHP)のように、流動的な直接市場が存在しない通貨ペアは、クロスレートとしてのみ存在します。NGN/PHP の市場は実質的に存在しません。このペアを建値する側は、NGN/USD と USD/PHP から計算しているのです。
技術的な定義で違いがより明確になります。
- 直接レート(ダイレクトレート)は、市場や集約フィードで実際に建値されているレートです。
- クロスレートは、共通の基準通貨(通常は USD)を共有する 2 つ以上の直接レートから計算されたレートです。
Finexly を含む多くの API プロバイダーは、クロスレートをシームレスに提供します。任意のペアをリクエストすれば、エンジン側が裏側で計算を処理します。それでも内部の数学を理解しておくことは重要です。精度、スプレッド、エッジケースの扱いに直結するからです。
クロスレートが開発者にとって重要な理由
クロスレートは主に 3 つの種類のアプリケーションで登場します。
国境を越えた送金・支払い。 ブラジルのクライアントに請求書を出すフィリピン人フリーランサーは、PHP 建ての料金が何 BRL になるかを知りたい。BRL/PHP の直接市場はないため、プラットフォームは USD を経由して計算します。
マルチカレンシー EC。 ノルウェーの店舗がシンガポールの顧客に価格を表示する場合、NOK/SGD が必要になります。Stripe、Adyen をはじめとする決済プロセッサは、このクロスを内部で計算し、その上に自社の FX マージンを乗せます。
金融分析・トレーディング。 クオンツシステムは、複数通貨建てのポートフォリオのエクスポージャーをヘッジします。EUR 建ての純エクスポージャーを把握するためには、MXN、INR、ZAR、BRL のポジションを EUR に換算する必要があり、すべてクロスレート計算です。
いずれの場合も、クロスレートの品質は背後にある 2 つの USD ペアの品質と鮮度に完全に依存します。2 秒前の EUR/USD と 60 秒前の USD/JPY を組み合わせると、その間に JPY が動いた分だけ誤差を含んだクロスが出来上がります。レートのソースと更新の仕組みについては、為替レートの仕組みガイド を参照してください。
クロスレートの公式
ソースとなる 2 つのペアの建値方法によって、3 つのケースに分かれます。一般原則はシンプルです。レートを分数として書いたとき、共通通貨が約分されなければなりません。
ケース 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 NZ ドルに相当します。
例 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 インド・ルピーに相当します。
ここで使われている標準 3 文字コードについては、ISO 4217 通貨コードガイド を参照してください。
逆数レートとペアの反転
データフィードが USD/EUR を返しているのに EUR/USD が必要、というケースがあります。逆数は次のとおりです:
EUR/USD = 1 / (USD/EUR)USD/EUR = 0.9217 なら、EUR/USD = 1 / 0.9217 = 1.0850。
逆数について実務的なポイントが 2 つあります。
第 1 に、丸めが累積すること。レートを 4 桁に丸めてから逆数を取り、さらに丸めると、0.01% 以上の誤差が混入することがあります。高精度が必要な場面では、表示の最終ステップまで逆数を浮動小数点フル精度で保持してください。精度戦略については 通貨 API のキャッシュとエラー処理のベストプラクティス で詳述しています。
第 2 に、逆数を取るとビッドとアスクが入れ替わること。GBP/USD のビッドが 1.2618、アスクが 1.2622 なら、USD/GBP のビッドは 1/1.2622 = 0.7923、アスクは 1/1.2618 = 0.7925 です。一方のペアのビッドは、もう一方のペアのアスクの逆数であり、ビッドの逆数ではありません。
クロスレートにおけるビッド・アスクスプレッド
2 つの基礎ペアからクロスレートを組み立てると、スプレッドは重ね合わさります。
例えば:
- EUR/USD のビッドが 1.0848、アスクが 1.0852(4 pips のスプレッド)
- USD/JPY のビッドが 152.27、アスクが 152.33(6 pips のスプレッド)
このとき暗黙の EUR/JPY クロスは:
Bid = 1.0848 × 152.27 = 165.183
Ask = 1.0852 × 152.33 = 165.309クロスレート上で 12.6 pips のスプレッドとなり、いずれの基礎ペアよりも広くなります。実際には、直接建値されている EUR/JPY 市場のスプレッドはこの計算値より狭くなります。流動性の高いクロスペアには独自のマーケットメーカーがいるからです。
開発者にとっての示唆は、2 つの USD ペアから計算したミッドマーケット・クロスレートは、真の直接市場の推定値だということです。チェックアウトの価格表示には十分、分析にも問題なし、しかし銀行やブローカーが実際に約定させてくれる値ではありません。ミッドマーケットとディーラーレートの違いについては ミッドマーケットレート解説 を参照してください。
Finexly API でクロスレートを計算する方法
通常はクロスレートを手計算する必要はありません。Finexly API は任意のベース通貨と任意のターゲット通貨リストを受け取り、内部で一貫した精度のクロスレートを返します。代表的な 4 つのスタックでの使い方は次の通りです。
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";4 つの例すべてで、API がクロスレートの計算を肩代わりし、精度の高いミッドマーケット値を返します。ベースは対応している 170+ 通貨のいずれかに変更でき、1 回の呼び出しで任意の数のターゲットをリクエストできます。言語別のさらに詳しいパターンは、Python チュートリアル、Node.js 統合ガイド、PHP ガイド を参照してください。
クロスレートを自前で計算すべきとき
良い API があっても、API から取得するのではなく自前データで計算する場面が 3 つあります。
過去戦略のバックテスト。 自社サーバー上に何年分もの EUR/USD と USD/JPY の Tick データがあるなら、外部 API を何百万回も叩かずに EUR/JPY をローカルで計算するほうが効率的です。ヒストリカル為替レートのエンドポイント でデータをシードし、バックテストエンジン内でクロスを導出します。
レイテンシー重視のアプリ。 アルゴリズム取引システムは、ネットワークラウンドトリップ 1 回でも惜しいので、メモリ上で USD ペアからクロスを事前計算することがよくあります。トレードオフは、同期と鮮度の責任を自分が負うことです。
カスタムのブレンドレート。 一部のプラットフォームは複数のソースを混ぜたり、マージンを乗せた内部レートを建値します。クロス計算を自社で行えば、顧客にレートを提示する前にビジネスロジックを適用できます。
これらに当てはまらない用途——チェックアウトページ、請求ツール、社内ダッシュボードなど——なら、API に直接クロスを返してもらうほうが、より正確で、保守も容易で、実装も速く済みます。
クロスレート計算でよくある落とし穴
開発者のコードレビューで、私たちが最も頻繁に遭遇するミスです。
反転するペアを間違える。 2 つのソースペアが逆方向に建値されている場合(一方が USD ベース、他方が USD クォート)、本来は反転して割るべきところで掛けてしまいやすい。常にレートを分数として書き、共通通貨が確かに約分されることを確認してください。
早すぎる丸め。 典型的なバグです——各ソースレートを 4 桁に丸めてから掛ける。複合丸めにより 0.01〜0.1% の誤差が出ることがあります。金融計算では満精度のまま保持し、表示時にだけ丸めましょう。
古いレートを使う。 2 つのソースレートが 30 秒のラグで取得された場合、それで作ったクロスは内部的に整合していません。両方を 1 回の API 呼び出しで取得(Finexly API では ?symbols=A,B,C がそれです)して、タイムスタンプを揃えましょう。
平日と週末のデータの混在。 FX 市場は週末は閉まります。スケジュールジョブが金曜の EST 17:01 に EUR/USD、金曜の EST 16:59 に USD/JPY を取得していると、ライブと固まったデータが混在しているかもしれません。すべてのレート取得を、単一の市場タイムスタンプを基準に統一しましょう。詳しくは FX 市場時間ガイド を参照。
取引用途でスプレッドを無視する。 ミッドマーケット・ソースから計算したクロスレートは表示には十分ですが、実際の資金が動く場面ではトレード方向に応じてビッドかアスクが必要です。ミッドだけに頼らず、コードに明示的にスプレッドモデリングを組み込みましょう。
よくある質問
シンプルに言うと、クロスレートとは何ですか?
2 つの通貨間の交換レートで、それぞれの通貨と第 3 の共通通貨(通常は米ドル)に対するレートを使って算出されたものです。たとえば EUR/JPY のレートは EUR/USD と USD/JPY から導出されます。
EUR/JPY や GBP/JPY はクロスレートに含まれますか?
技術的にはイエスです。米ドルを含まないため、厳密な定義ではクロスです。ただしこの 2 ペアはどちらも直接の取引が非常に多く、独自の建値市場を持ち、実務上はメジャーペアのように振る舞います。
クロスレートはなぜ重要ですか?
クロスレートのおかげで、互いの間に流動的な直接市場を持たない通貨——つまり世界の多くのペア——でも価格付けと取引が可能になります。国境を越えた支払い、マルチカレンシー商取引、グローバルな金融分析に不可欠です。
米ドルをブリッジに使わずにクロスレートを計算できますか?
できます。任意の共通通貨をブリッジにできます。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 →