為替レートの Bid・Ask とスプレッドの計算・実装ガイド
FX・外国為替相場における Bid(売値)、Ask(買値)、仲値(Mid)、pips スプレッドの意味と、プログラムで正確に扱う方法を解説します。
要約 · 30秒開発サマリー
Bid はプライス提供者が買う価格、Ask は売る価格であり、Ask から Bid を引いた差がスプレッドです。画面に「現在値」を表示する際は仲値 (Bid + Ask) / 2 を使うか Bid/Ask を明記し、取引コストや約定シミュレーションを行う際は必ず両側の価格を保持します。
01
4つの基本概念
| フィールド | 意味 | プログラムでの主な用途 |
|---|---|---|
Bid | クォート提供側の買値 | ユーザーの成行売り・ポジションクローズ価格の算出 |
Ask | クォート提供側の売値 | ユーザーの成行買い・ポジションクローズ価格の算出 |
| 仲値(Mid) | (Bid + Ask) / 2 | 一覧表示、チャート描画、各種テクニカル指標の計算 |
| スプレッド | Ask − Bid | 流動性モニタリングおよび取引コストの計測 |
02
pips(ピップス)への換算方法
多くの通貨ペアは小数点以下4桁までが標準で 1 pip = 0.0001 ですが、クロス円(USD/JPY など)は小数点以下2桁が標準で 1 pip = 0.01 です。多くのデータ配信ではさらに1桁細かい端数(pipette)が含まれます。一律に 10,000 を掛けるのではなく、通貨ペアの桁数仕様に応じて換算してください。
def pip_size(symbol: str) -> float: return 0.01 if symbol.upper().endswith("JPY") else 0.0001def spread_in_pips(symbol: str, bid: float, ask: float) -> float: return round((ask - bid) / pip_size(symbol), 1)print(spread_in_pips("EURUSD", 1.08512, 1.08525)) # 1.3print(spread_in_pips("USDJPY", 149.812, 149.826)) # 1.403
実装でよくあるミス
- 片側の価格だけを保存してしまい、後からスプレッドや取引コストを再現できなくなる。
- 板情報の最良気配(Bid/Ask)と約定履歴(Trade Tick)を混同する。
- 浮動小数点数を == で直接比較してしまう(Decimal または許容誤差を使うべき)。
- データソースごとのシンボル表記ゆれ(EURUSD と EUR/USD)を正規化せずに扱う。
04
AllTick で為替レートを取得する
AllTick の為替・貴金属・コモディティデータは quote-b-api(REST)と quote-b-ws-api(WebSocket)で提供され、通貨ペアは EURUSD、USDJPY のように区切り文字なしで表記されます。板情報(depth-tick)エンドポイントから Bid / Ask の両方を取得してスプレッドを計算できます。
仕様出典と検証記録 · 2026-10-13
以下の一次資料で関連するエンドポイント、フィールド、取引所規則を確認しました。
Python コードは Python 3.14.0 の ast.parse で構文解析を通過しました。依存関係、実行互換性、ネットワーク応答の検証は含みません。
今回の確認では実際の Token による AllTick 要求や本番エンドツーエンド試験は実行していません。再現時にプラン、ライブラリ版、取引時間、ret/trace、結果を記録してください。
導入前に再現する項目
- 同一更新の bid/ask と十進精度を保持し、欠損、非正価格、ask が bid 未満の場合は計算を止めます。
- 最小変動単位と価格差・pip の区別を確認し、通常時間、ロールオーバー、古い気配を比較します。