【解説】三角アービトラージとは?|仕組み・やり方まで説明 では、三角アービトラージの
- 基本的な概念
- 応用方法
- 利益を上げる際に重要な点
を具体的に解説しました。
その際に具体的な計算式に関する説明を入れようかと思っていましたが、
かなり長い + 専門的な内容になってしまい、「読みにくい」というご意見をいただいたので、こちらの個別の記事に分けることにしました。
この記事では、
- 三角アービトラージの、”サヤ” の計算式
- エントリー基準とエグジット基準を表すための計算式
- 各 3つの通貨ペアのロット数はどのように計算するべきなのか
- 具体的な応用方法
を、理由も含めてわかりやすく解説します。
この記事を読めば、三角アービトラージを実行するためのプログラムやEA内で、どのような順番で計算が行われているか、
どういった基準でエントリー・決済しているか、
などが全てわかります。
Contents
1.三角アービトラージとは?
三角アービトラージは以下の図のように簡単に説明できます。
ただ、実際の計算式はもう少し複雑です。
「USDJPY の価格」と言っても、Ask(買値)と Bid(売値) に分かれていて、スプレッドが存在しているためです。
「理論価格」の中にも Ask と Bid があり、計算方法が異なるので注意が必要です。
以下にわかりやすく説明します。
2.三角アビトラは「市場価格」と「理論価格」の “サヤ” を取る手法
三角アービトラージの概要を解説した記事で詳しく解説していますが、
そもそも、「三角アービトラージ」とは
と考えるとわかりやすいです。
ではその “サヤ” はどのように計算すればいいのでしょうか?
3.「サヤ」の計算方法とは
Ask と Bid の違いを考慮した上で、「サヤ」はどのように定義すればいいのでしょうか?
以下に順序立てて説明します。
【注意】Ask は常に Bid より高い価格である
Ask は買うときの価格、Bid は売るときの価格です。
Ask と Bid の間にはスプレッドがあり、常に Ask ≥ Bid (買値の方が売値より高く設定されている)が成立しているので、買ってすぐにそのまま売っても「スプレッド分だけ負ける」ことになります。
これは「理論価格」でも同じで、常に 理論価格_Ask ≥ 理論価格_Bid が成立します。
(※ これ以降、「市場価格」の Ask ・Bid を単に Ask・Bid とし、理論価格の Ask・Bid を 理論価格_Ask・理論価格_Bid と呼びます。)
三角アービトラージにおける「サヤ」の定義
先ほど「サヤ」は「市場価格と理論価格の差」であることは述べました。ではそもそも価格には Ask と Bid があることを考慮するとどのように定義できるでしょうか?
「サヤ」は、
になります。
なぜそうなるかを解説
なぜ上記のようになるのかを解説します。
①( 理論価格_Bid - Ask )および ②( Bid - 理論価格_Ask )はともに Bid から Ask を引いた値であり、
基本的には買値の方が売値より高く設定されているので、ほとんどの時間は 負の値 です。
普段は Ask、Bid、理論価格_Ask、理論価格_Bid の位置関係 は下の画像のようになっています。
ですが、ごくまれにアービトラージが可能な状況になると、買値が売値より安くなる状況が一瞬だけ生まれます。
この場合、”安く買って、高く売る“ ことができ、「儲けることができる」、というロジックなのです。
したがって
であり、
によって計算されます。
4.「理論価格」の計算方法とは?
USDJPY の価格の理論価格は、GBPJPY × 1/GBPUSD で求められることを先ほど説明しました。
ですが実際には、
理論価格には 理論価格_ Ask と 理論価格_Bid があります。
これらはどうやって計算すればいいのでしょうか?
結論から言うと、
- USDJPY の理論価格_Ask = GBPJPY_Ask × 1/GBPUSD_Bid
- USDJPY の理論価格_Bid = GBPJPY_Bid × 1/GBPUSD_Ask
となります。
なぜこうなるかは単純で、
FXは「通貨と通貨の交換をすること」だからです。
つまり、
- USDJPY の Ask(買値)でエントリーする場合 ⇒ USD を買って JPY を売る
- USDJPY の Bid(売値)でエントリーする場合 ⇒ USD を売って JPY を買う
ということです。
したがって、「理論価格」の場合だと
- USDJPY の理論価格_Ask ⇒ GBPJPY_Ask(GBP を買って JPY を売る)と GBPUSD_Bid(GBP を売って USD を買う)を組み合わせる
- USDJPY の理論価格_Bid ⇒ GBPJPY_Bid(GBP を売って JPY を買う)と GBPUSD_Ask(GBP を買って USD を売る)を組み合わせる
という仕組みになっています。したがって
- USDJPY の理論価格_Ask = GBPJPY_Ask × 1/GBPUSD_Bid
- USDJPY の理論価格_Bid = GBPJPY_Bid × 1/GBPUSD_Ask
となります。
ただ、注意しなければいけないことして、
「理論価格」を計算するための式は、三角アービトラージに使う通貨ペアによってそれぞれ異なる点です。
例えば上記の例では、「ドルと円の交換比率」を表す ‘通貨ペア’ の名称が “USDJPY” でなく ”JPYUSD” という順番であった場合、理論価格を表す式は完全に別物になります。
したがって、あらゆる組み合わせの三角アービトラージに対応せさせるには一般化する必要があり、難しくはないですが、単純に少しめんどくさいです。
5.各通貨ペアの “ロット数” を計算する方法
(ここはわかりにくいと思いますので、興味ない場合は飛ばしてください)
三角アービトラージにおける「ヘッジ」は 市場価格 と 理論価格 の両建て によって行うことを述べました。
その際に具体的なロット数がどのように計算されるかを解説します。
ここでは、市場価格 USDJPY の Ask(買値)を、理論価格 USDJPY の Bid(売値)でヘッジする状況を考えます。
“USDJPY の 1 Lot(10万通貨)の買いポジション” を「GBPUSD と GBPJPY でヘッジする」には
GBPUSD と GBPJPY でどのようなポジションを持てばいいでしょうか?
USDJPY = 134 、GBPJPY = 160、GBPUSD = 1.194 と仮定します(簡単のため Ask・Bid を区別せず)。
以下のような流れになります。
1. ‘USDJPY 1Lot の買いポジション’ をヘッジするには、‘理論価格USDJPY 1Lot の売りポジション‘ を持つ必要があります。
2. (上の部分で説明した通り)そのためには GBPJPYを売り (Bidで) 、GBPUSDを買う (Askで) 必要があります。
3. ‘USDJPY 1Lot のポジション’ とは 「USD を10万通貨、 JPY を USDJPY*10万通貨 交換すること」を意味するので、
・USD を 10万通貨分 ⇒ GBPUSD のロット数は(10万 / 1.194*10万 = 0.8375 Lot)
・JPY を134*10万通貨分 ⇒ GBPJPY のロット数は(134*10万 / 160*10万 = 0.8375 Lot)
となります。
4. なお、今回 GBPJPY のロット数を ‘USDJPY 1Lot’ という情報をもとに計算しましたが、実際には ‘GBPUSD 0.8375 Lot’ という情報から求めるほうがいいです。(’GBP’ のエクスポージャーの解消という意味では後者の方が合理的)
以上の通りです。
‘USDJPY 1Lot のポジション’ とは 「USD を10万通貨、 JPY を USDJPY*10万通貨 交換すること」
と述べましたが、この場合
[USD は 10万通貨の固定値]、[JPY は USDJPY*10万通貨 という、変動する値] なので
固定値 に相当する通貨を持つ通貨ペア(今回は GBPUSD)を先に計算する ⇒ 次にエクスポージャーの解消をする(GBPJPY によって GBP のエクスポージャー解消)
という流れにした方が合理的かもしれません。
6.エントリー基準とエグジット基準の決め方
三角アービトラージでは、「市場価格」と「理論価格」の差から利益を生み出す方法です。
本来はこの「差」はほぼ 0 ですが、
大きな差が生じた時に「市場価格」と「理論価格」で両建てを行って、0 に戻ってから両建てを解消すれば、
エントリー時に生じていた「差」がそのまま利益として残ります。
「両建て」とは 一方を「買」って、もう一方を「売る」ことですので、エントリー時の参入価格は
- Ask と 理論価格_Bid (市場価格で買って、理論価格で売る場合)
- 理論価格_Ask と Bid (理論価格で買って、市場価格で売る場合)
の2通りしかありません。
なお、「Ask」でエントリーした場合には、「Bid」でエグジット(その逆も然り)するので、
- (Ask, 理論価格_Bid)でエントリーした場合は エグジット価格は(理論価格_Ask, Bid)
- (理論価格_Ask, Bid)でエントリーした場合は エグジット価格は(Ask, 理論価格_Bid)
となります。
Ask、Bid、理論価格_Ask、理論価格_Bid はすべて時間によって変化するので、「エントリー時の価格」「エグジット時の価格」で分けて考える必要があります。
【はじめに】利益の計算式
上記の「エントリー価格とエグジット価格の組み合わせ」を考えると利益は
- (エントリー時の 理論価格_Bid – Ask) – (エグジット時の Bid – 理論価格_Ask)
- (エントリー時の Bid – 理論価格_Ask) – (エグジット時の 理論価格_Bid – Ask)
の価格差に相当する金額と計算されます。(上記の式は価格差なので、利益額を出すにはロット数を考慮します)
この結果からも、
( 理論価格_Bid - Ask )および( Bid - 理論価格_Ask )を、”サヤ” として扱うのが適切であることが理解できます。
エントリー基準
先ほど説明した通り、エントリーを行う際の基準としては
が適切です。
ただ十分に大きな値でないと、手数料とスリッページを差し引いたあとに利益が残らないので注意しましょう。
エグジット基準
基本的には、“サヤ” が閉じたら、決済すればよいと思います。
すなわち、
- (理論価格_Bid – Ask)基準でエントリーした場合 → Bid – 理論価格_Ask < 0
- (Bid – 理論価格_Ask)基準でエントリーした場合 → 理論価格_Bid – Ask < 0
となります。
7.応用編
上記の例では、「”サヤ” が開いたらエントリー、0 に戻ったらエグジット」する方法を紹介していますが、実際には無数のバリエーションがあり得ます。
例えば、サヤが開いたらエントリー、(さらに逆側のサヤが開くまで待って)エグジットをする、なども考えられます。
ただし、三角アービトラージの場合は価格が変化しすぎると両建てによる「ヘッジ」が成立しなくなってしまうことには注意が必要です。
とてもためになる内容で感謝しています。
かなり以前に同様な三角アービトラージをMQL5で作成して試したことがありましたが、
なかなか裁定機会が出現しないのと、出現してもオーダー成立までのタイムラグで約定価格がずれてしまったりと、
机上ではOKでも実際には・・・という感じであきらめておりました。
今回とある業者にてMQL5ベースでリアルデータをとってみたところ、かなりな頻度で裁定機会が発生しており、
チャンスありかということで改めて記事を参考にEAを作成して試していますが、
決済基準にある「(理論価格_Bid – Ask)基準でエントリーした場合 → Bid – 理論価格_Ask < 0」と
サヤが閉じたタイミングで計算しても、なぜかプラスにならないことがあります。
本文にあるように計算上はプラスになるはずだと思うのですが、あり得ることでしょうか?
取得したリアルデータをもとにExcleベースで確認しているので計算間違いはないと思われます。
コメントありがとうございます。
リアルデータのみの計算で(スリッページと手数料を無視した状態で)利益が残っていないということであれば、
ロット数の計算に間違いがある可能性や、価格の変化に伴って両建てによるヘッジが成立しなくなってしまっている可能性があるかと思われます。
リアルデータで理論上利益が残るシステムができてしまえば、あとは適切なブローカー&通貨の組み合わせを見つけるだけなのでぜひ頑張ってください。
大変勉強になりました。早速作ってみたのですが、最適化やバックテストのやり方がわからなくて立ち止まっています。
ネットを検索してもこの手の情報は出てきません。
どのような設定をすればいいのでしょうか。最適化のページにある項目を色々組み合わせてみましたがうまくいきません。
ヒントだけでもお願い致します。
ちなみに、通貨は固定で、NZDJPY、EURJPY、EURNZDの組み合わせです。
MT5を使えば(Ask・Bid の)リアルデータがFXブローカーのサーバーに保存されておりそのまま使えるので、バックテスト自体はすぐにできるはずです。
最適化に関しては主に「サヤの大きさ」がパラメータになるとは思いますが、それだけだとおそらく利益の残るシステムを作るのは難しいのであとは自分なりに工夫して (三角アービトラージにおいて合理的といえるような) 他の条件を追加していくべきかと思います。