Forexにおけるpipとは?開発者のためのpip、pipette、FX計算ガイド(2026)
トレーディングボット、ポジションサイズ計算機、リスクダッシュボード、あるいはあらゆるFX対応プロダクトを作っているなら、すぐにこの疑問に突き当たるはずです。Forexのpipとは何で、コード内でどのように値を計算すればいいのか? ここを間違えると、P&Lが狂い、ストップロスが間違ったレベルで発動し、ユーザーは辛抱してくれません。
このガイドでは、開発者の視点からpip、pipette、そして完全なpip価値の公式を、JavaScript、Python、PHP、cURLのコピー可能なコード例と共に解説します。最後には、Finexly APIドキュメントからリアルタイムレートを取得し、教科書では省略されるすべてのエッジケースを処理する動作するpip計算機が手に入ります。
pipとは?素早い定義
pip("percentage in point"または"price interest point"の略)とは、通貨ペアの最小標準化価格刻みです。ほとんどのペアでは小数点以下4桁目 — つまり0.0001の動きです。日本円建てのペアでは小数点以下2桁目 — つまり0.01の動きとなります。
具体例:
- EUR/USDが
1.0850から1.0851に動いた → 1 pip(EURあたり0.0001 USDの変化)。 - GBP/USDが
1.2640から1.2655に動いた → 15 pip。 - USD/JPYが
154.20から154.30に動いた → 10 pip(USDあたり0.10 JPYの変化)。 - AUD/JPYが
99.45から99.40に動いた → −5 pip。
pipは「価格がどれだけ動いたか?」を表すFX市場の普遍的な単位です — 絶対価格水準が大きく異なるペア間で会話を正規化してくれるため、生の小数値よりはるかに有用です。
pip vs pipette vs ポイント
現代のブローカーやデータプロバイダーは、標準pipを超えてもう1桁多く小数を提示します。この余分な桁はpipette、フラクショナルpip、または単にポイントと呼ばれます。1 pipetteは1 pipの10分の1に相当します。
| ペア | pipサイズ | pipetteサイズ | レート例 |
|---|---|---|---|
| EUR/USD | 0.0001 | 0.00001 | 1.08507 |
| GBP/USD | 0.0001 | 0.00001 | 1.26482 |
| USD/JPY | 0.01 | 0.001 | 154.215 |
| EUR/JPY | 0.01 | 0.001 | 167.482 |
1.08507と表示するとき、末尾の7がpipetteで、トレーディングプラットフォーム上では小さく表示されたり上付き文字で描画されたりします。開発者として、この区別は慎重に扱う必要があります。pipetteを含むレートに対して文字列演算で価格差を計算すると、適切にスケーリングしない限り、pipの動きを10分の1に過小報告することになります。安全なルール:常に数値型に正規化し、そのペアのpipサイズ定数で乗算または除算する。
なぜ通貨ペアごとにpipサイズが異なるのか
JPYペアの2小数点pipは恣意的な選択ではありません。日本円はほとんどの準備通貨に対して単位価値が小さく — 2026年で1 USD ≈ 154 JPY程度 — 4小数点で提示すると、見た目に微小な価格変動と読みにくいラダーがトレーディング画面上に発生してしまいます。2小数点で切り詰めることで、価格アクションが他の主要ペアと視覚的に釣り合います。
同じロジックは、他の「単位価値の低い」クォート通貨(韓国ウォン、ハンガリーフォリントなど)の一握りにも適用され — これらはしばしば0.01または1のpipサイズで提示されます。マルチペアシステムを構築する際は、pipサイズ定数として0.0001を決してハードコーディングしないでください。常にペアごとに参照しましょう。
ほとんどのペアで機能する実用的な検出ルール:
function getPipSize(pair) {
// pair example: "EURUSD" or "EUR/USD"
const quote = pair.replace("/", "").slice(3, 6).toUpperCase();
const twoDecimalQuotes = new Set(["JPY", "HUF", "KRW"]);
return twoDecimalQuotes.has(quote) ? 0.01 : 0.0001;
}
console.log(getPipSize("EURUSD")); // 0.0001
console.log(getPipSize("USD/JPY")); // 0.01
console.log(getPipSize("EURHUF")); // 0.01本番システムでは、ISO 4217通貨コードでキー付けされた完全なpipサイズテーブルが必要になります — 完全なリストについてはISO 4217通貨コード完全開発者ガイドを参照してください。
pip価値の公式
あらゆるP&L計算の中心的な質問:ベース通貨のN単位のポジションについて、ペアが1 pip動いたとき口座残高はいくら変動するのか?
一般的な公式:
pip_value_in_quote_currency = pip_size × position_size
pip_value_in_account_currency = pip_value_in_quote_currency × (quote_to_account_rate)口座通貨と取引中のペアの関係に応じて3つのケースに分かれます。
ケース1:口座通貨 = クォート通貨
最もシンプルなケース。USD口座でEUR/USDを取引するなら、各pipは追加の換算なしに固定のドル金額の価値を持ちます。
pip_value = pip_size × position_sizeUSD口座でEUR/USD 100,000単位(1標準ロット)の場合:
0.0001 × 100,000 = 1 pipあたり10 USDこれがあちこちで引用される教科書的な「1標準ロットあたり1 pip 10ドル」 — クォート通貨が口座通貨と一致する場合にのみ成立します。
ケース2:口座通貨 = ベース通貨
USD口座でUSD/CHFを取引する場合、pipの動きはCHF建てとなり、ペアの現在のaskレートを使ってUSDに換算する必要があります。
pip_value_in_quote = pip_size × position_size
pip_value_in_account = pip_value_in_quote / current_rateUSD/CHF = 0.9050のとき、USD/CHF 100,000単位の場合:
0.0001 × 100,000 = 10 CHF
10 CHF / 0.9050 = 1 pipあたり11.05 USDケース3:クロスペア(どちらも口座通貨でない)
最も厄介なケース。USD口座でEUR/JPYを取引する場合。pipの動きはJPYで、USD表現にはJPYとUSDの間の換算レートが必要です。
pip_value_in_quote = pip_size × position_size
pip_value_in_account = pip_value_in_quote × (account_per_quote_rate)USD/JPY = 154.20のとき、EUR/JPY 100,000単位の場合:
0.01 × 100,000 = 1,000 JPY
1,000 JPY / 154.20 = 1 pipあたり6.49 USDEUR/JPYレートではなくUSD/JPYレートを使ったことに注意してください — JPYからUSDへ換算しているのであり、EURから何かへ換算しているのではないからです。
Finexly APIでpip計算機を構築する
上記の公式を本物のライブ為替APIに繋いで、市場が動いても計算機が正確であり続けるようにしましょう。Finexlyに登録して無料APIキーを取得 — 月1,000リクエスト、カード不要、このような計算機には十分です。完全なリクエストリファレンスはFinexly APIドキュメントにあります。
JavaScript (Node.js)
const FINEXLY_API_KEY = process.env.FINEXLY_API_KEY;
const BASE_URL = "https://finexly.com/api";
// Two-decimal-pip currencies. Extend as needed.
const TWO_DECIMAL_PIP_QUOTES = new Set(["JPY", "HUF", "KRW"]);
function pipSize(quoteCcy) {
return TWO_DECIMAL_PIP_QUOTES.has(quoteCcy) ? 0.01 : 0.0001;
}
async function getRate(base, quote) {
const res = await fetch(
`${BASE_URL}/latest?base=${base}&symbols=${quote}&api_key=${FINEXLY_API_KEY}`
);
const json = await res.json();
return json.rates[quote];
}
async function calcPipValue({ pair, positionSize, accountCcy }) {
const base = pair.slice(0, 3).toUpperCase();
const quote = pair.slice(3, 6).toUpperCase();
const pip = pipSize(quote);
const pipValueInQuote = pip * positionSize;
if (accountCcy === quote) {
return pipValueInQuote;
}
if (accountCcy === base) {
const rate = await getRate(base, quote);
return pipValueInQuote / rate;
}
// Cross: convert quote -> account via account/quote rate
const rate = await getRate(accountCcy, quote);
return pipValueInQuote / rate;
}
// Example: 100,000 units of EUR/JPY on a USD account
calcPipValue({
pair: "EURJPY",
positionSize: 100_000,
accountCcy: "USD",
}).then((v) => console.log(`Pip value: ${v.toFixed(2)} USD`));Python
import os
import requests
FINEXLY_API_KEY = os.environ["FINEXLY_API_KEY"]
BASE_URL = "https://finexly.com/api"
TWO_DECIMAL_PIP_QUOTES = {"JPY", "HUF", "KRW"}
def pip_size(quote_ccy: str) -> float:
return 0.01 if quote_ccy in TWO_DECIMAL_PIP_QUOTES else 0.0001
def get_rate(base: str, quote: str) -> float:
r = requests.get(
f"{BASE_URL}/latest",
params={"base": base, "symbols": quote, "api_key": FINEXLY_API_KEY},
timeout=10,
)
r.raise_for_status()
return r.json()["rates"][quote]
def calc_pip_value(pair: str, position_size: float, account_ccy: str) -> float:
base, quote = pair[:3].upper(), pair[3:6].upper()
pip = pip_size(quote)
pip_in_quote = pip * position_size
if account_ccy == quote:
return pip_in_quote
if account_ccy == base:
return pip_in_quote / get_rate(base, quote)
# Cross
return pip_in_quote / get_rate(account_ccy, quote)
if __name__ == "__main__":
value = calc_pip_value("EURJPY", 100_000, "USD")
print(f"Pip value: {value:.2f} USD")PHP
<?php
$apiKey = getenv('FINEXLY_API_KEY');
$baseUrl = 'https://finexly.com/api';
$twoDecimalPipQuotes = ['JPY', 'HUF', 'KRW'];
function pipSize(string $quoteCcy): float {
global $twoDecimalPipQuotes;
return in_array($quoteCcy, $twoDecimalPipQuotes, true) ? 0.01 : 0.0001;
}
function getRate(string $base, string $quote): float {
global $apiKey, $baseUrl;
$url = "$baseUrl/latest?base=$base&symbols=$quote&api_key=$apiKey";
$body = file_get_contents($url);
$data = json_decode($body, true);
return $data['rates'][$quote];
}
function calcPipValue(string $pair, float $positionSize, string $accountCcy): float {
$base = strtoupper(substr($pair, 0, 3));
$quote = strtoupper(substr($pair, 3, 3));
$pipInQuote = pipSize($quote) * $positionSize;
if ($accountCcy === $quote) return $pipInQuote;
if ($accountCcy === $base) return $pipInQuote / getRate($base, $quote);
return $pipInQuote / getRate($accountCcy, $quote);
}
echo number_format(calcPipValue('EURJPY', 100000, 'USD'), 2) . " USD\n";cURL
独自のpip計算に差し込むための生のレートだけが必要な場合:
curl "https://finexly.com/api/latest?base=USD&symbols=JPY&api_key=YOUR_KEY"
# {"base":"USD","rates":{"JPY":154.20},"timestamp":1746...}このレート1つで、上記の公式を使ってJPY pipの動きをUSDに換算するのに十分です。
開発者がはまる一般的なpip計算の落とし穴
pipは単純に見えます。バグは微妙です。注意すべき5つのポイント:
1. pip演算における浮動小数点ドリフト。 JavaScriptで0.1 + 0.2 !== 0.3、同種の問題は多数のトレード間でpip P&Lを合計するときに襲ってきます。本番に到達するもの — 特に金融計算 — については、内部的に整数pipカウンタを使用してください(非JPYペアでは価格を10_000倍、JPYペアでは100倍)、またはdecimal.jsやPythonのdecimal.Decimalのような10進ライブラリを使ってください。
2. pipサイズとして0.0001をハードコーディングする。 これはユーザーがJPYペアを取引した瞬間にすべてのJPYペアを壊します。常にペアごとのテーブルからpipサイズを参照しましょう。
3. 価格比較時にpipとpipetteを混同する。 1.08502のような5小数のEUR/USDレートは1.08501から1.08502 pipの動きに見えますが、実際は1 pipette = 0.1 pipです。floatに正規化してpipサイズで除算してください。
4. ケース3で口座通貨換算に古いレートを使う。 オープンポジションのpip価値計算は、ポジションを開いたときのレートではなく、現在のレートを使うべきです。レートをキャッシュする場合は、換算が正確であり続けるようTTLを十分短く設定してください — 本番テスト済みのパターンについては通貨APIキャッシングとエラーハンドリングのベストプラクティスを参照してください。
5. bid/askの非対称性を忘れる。 ブローカーはロングのクローズにbidを、ショートのクローズにaskを使ってP&Lを換算します。見積もりだけが必要なエンドユーザー向け計算機では、ミッドレートで構いません。執行システムの場合は適切な側を使ってください。
bid/askの分割について深く見るには、スポットレート vs フォワードレートの記事を、クロスペア換算についてはクロス為替レート解説を参照してください。
一目でわかるpip価値:一般的なペア
USD建て口座で1標準ロット(100,000単位)を取引する場合の、2026年5月の参考レートでの典型的なpip価値。これらは健全性チェックとして扱い、絶対視しないでください — 実口座に影響するものについてはFinexly通貨コンバーターまたはAPIからライブレートを取得してください。
| ペア | pipサイズ | pip価値(1ロット、USD口座) |
|---|---|---|
| EUR/USD | 0.0001 | 10.00 USD |
| GBP/USD | 0.0001 | 10.00 USD |
| USD/CHF | 0.0001 | ~11.05 USD |
| USD/JPY | 0.01 | ~6.49 USD |
| EUR/JPY | 0.01 | ~6.49 USD |
| AUD/USD | 0.0001 | 10.00 USD |
| EUR/GBP | 0.0001 | ~12.61 USD |
よくある質問
Forexのpipを簡単に言うと?
pipは通貨ペア価格の最小標準化された動き — ほとんどのペアでは典型的に小数点以下4桁目(0.0001)、円ペアでは小数点以下2桁目(0.01)。価格の動きを測定するためのFX市場の普遍的な単位です。
コードでpip価値をどう計算する? pipサイズとポジションサイズを掛けてクォート通貨でのpip価値を取得し、現在の為替レートで口座通貨に換算します。3つのケース(クォート = 口座、ベース = 口座、クロス)は上記のJavaScript、Python、PHPの例で示されています。
pipとpipetteの違いは?
pipetteはpipの10分の1 — 一部のブローカーやデータフィードがより狭いスプレッドのために追加するフラクショナル桁です。EUR/USDのpipが0.0001なら、pipetteは0.00001です。
なぜEUR/USDで1 pipは約10ドル?
1標準ロットが100,000単位で、非JPYペアのpipサイズが0.0001だからです。100,000 × 0.0001 = 10クォート通貨単位。クォート通貨がUSDなら、それは直接10ドルです。
pip計算機を作るのに有料APIが必要? いいえ。Finexlyの無料プランは月1,000リクエストを提供し、170+通貨をカバー — 個人用pip計算機や低トラフィックのサイドプロジェクトには十分です。より大きなボリュームについては料金プランを参照してください。
仮想通貨ペアではpipサイズが異なる? 仮想通貨ペアは標準FX pip慣習に従いません。BTC/USDはベニューによって2または4小数で提示されることが多く、「1 pip」はベニュー定義です。純粋な仮想通貨P&Lでは、pipではなく絶対価格差で作業してください。
構築する準備はできましたか?
これで公式、3つの動作するコード例、そしてほとんどの人がはまるバグのリストが手に入りました。最後のピースは、計算の途中でドリフトしないリアルタイムレートです。
Finexlyの無料APIキーを取得する — クレジットカード不要。月1,000の無料リクエスト、170+通貨、サブ50ミリ秒のレイテンシで開始し、必要なときだけアップグレードしてください。あなたのpip計算機は、その背後の数学と同じくらい正確なレートに値します。
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 →