2026/03/08
MMBotの基本戦略
MMBotの基本戦略についてまとめます。
MMBotの基本
MMBot(Market Maker Bot)とは、その名の通り両指値注文を繰り返し、Makerとしての約定を目指すBotのことです。
利益の源泉としては、
- 両指値が約定した場合のスプレッド
- Maker約定時のマイナス手数料(一部取引所のみ)
が主なものとなります。
板情報を元に細かく指値を調整する必要があるため、短時間で注文・キャンセルを繰り返すHFT〜スキャルピング寄りの戦略になります。
具体的なイメージ
まずはMMBotの理想的な挙動から見ていきます。
以下のような指値注文の板があるとします。
最良のbid(買い注文)は98円、最良のask(売り注文)は102円、仲値(最良bid/askの平均値)は100円です。
この状態で成行注文が飛んできた場合、買い注文であれば最良askの102円の板と約定し、売り注文であれば最良bidの98円の板と約定します。
このとき、Botが最良bid/askの少しだけ内側に同サイズの指値注文を出すとします。(下の図の斜線部分)
そうすると、成行注文に対し最初に約定するのは自分の注文となり、それらが両方約定するとポジションを持つことなく101 - 99 = 2円分の利益が得られます。
これがMMBotの基本です。
次に、応用形を考えてみましょう。
上で述べたような理想的な挙動が実現するためには少なくとも
- スプレッド(最良ask - 最良bid)がある程度開いている
- 板情報を取得してからBotが指値注文を取引所に反映するまで、板の状態が変化しない
- 売りと買いの両方向の成行注文が十分な量到来する
といった前提が満たされている必要があります。
3が満たされるような流動性の高い取引所では、板情報も1秒間に何回も更新されます。
すると、Botがその瞬間の最良bid/askでAPI経由で発注しても、それが受理されるまでのレイテンシーで板が変化し、注文が通る頃にはその価格は最良ではないということが起こります。
すなわち、成行が来ても即時約定しない可能性が高く、MMBotの基本原理が崩れてしまいます。
そこで、もう少し柔軟に考え、無理に最良bid/askへの指値を狙うのではなく、数秒〜数十秒以内に約定するであろう価格に指値を置くようにしてみます。
例えば、103円/97円まで成行注文が届くと仮定しそこに指値を置きます。
予想通りに両方約定すれば 103 - 97 = 6円分の利益が得られます。
ロジックのポイント
さて、このあたりでMMBot構築においてポイントとなる点が見えてきます。
① 指値を置く位置
スプレッドを広く取ると、両方約定した際の利益は大きくなりますが、約定する確率は下がります。 逆にスプレッドを狭くとると、約定する確率は上がりますが、あまり利益を得られません。
二つはトレードオフの関係にあります。
② 片側約定の際の在庫解消
一定時間内に約定するラインを正確に予想することは困難です。
そのため、両方約定しなかった、あるいは片方しか約定しなかったケースを考える必要があります。
両方約定しなければ何もトレードしていないのと同じなので、機会損失だけですみます。 一方、片方の注文のみ約定した場合、在庫を抱えることになるため、ポジションの解消方法を考えなければなりません。
在庫を抱えた状態というのは、逆方向に価格が動いて損するリスクを常に負うため、MMBotにおいて一刻も早く解消したい状態です。
③ 逆選択リスクへの対応
上記の片側約定が起こるケースとして、単に約定する範囲の予測が片方だけ外れただけなら良いですが、情報を持った成行注文が増え、片側の板が食い破られているケースには注意が必要です。
ここでいう情報とは、市場に影響するようなニュースだったり、他大手取引所の価格変動だったり、色々です。
この場合、自分の指値が約定したあとも反発せずそのまま突き抜けていくので、即含み損を抱えることになります。
しかも、その状況下では成行注文の量も偏っているため、在庫解消方向の指値もなかなか約定せず、傷を広げることになりがちです。
これがいわゆる逆選択リスクと呼ばれるもので、MMBotにおける最大の脅威です。
ここからは、上で紹介した各ポイントについて、実際にどのようなロジックが考えられるのか、例を見ていきます。
最適スプレッドの決定
A&Sモデル
Avellaneda & StoikovによるHigh-frequency trading in a limit order bookという論文にて紹介されている、MMBotのリファレンスとして最も有名なモデルです。
約定イベントを、仲値からの価格差 の関数 を強度とするポアソン過程としてモデル化した上で、在庫を考慮して最適な納得価格およびスプレッドを数理的に計算します。
最終的に以下の式で決まります。
各変数の意味は以下。
: 納得価格(予約価格とも)
: スプレッド(ask/bid)
: 仲値 (Mid-price)
: 在庫量
: リスク回避度 (Inventory risk aversion)
: 価格のボラティリティ
: 取引終了までの残り時間
: 市場の注文強度の減衰率 (Limit order book parameter)
これだけ見てもわかりづらいと思うので噛み砕いて説明すると、買いポジションを持っているとき(=在庫量が正)は仲値から少し下げた価格を基準に両指値を出して、買い約定より売り約定をしやすくする、逆に売りポジションを持っている時はその逆を行うことで、在庫を抱えづらいように制御しています。
スプレッドの式は第1項が に比例し、ボラティリティの推定誤差が二乗で影響して不安定になりがちなので、実応用上は の線形倍のスプレッドを利用することもあります。(第2項は定数項なので近似的に省略される)
板情報ベース
magitoさんのnoteでも触れられているようなロジックです。
板情報を元に、最良価格から X BTC 積み上がる価格を求め、そこに指値を置きます。
例:X = 0.1の場合。買い板は最良価格付近の板が厚いためスプレッドが小さくなる
在庫解消
在庫解消のための制御としては
Phase1: 在庫を持っているときの基準価格を、仲値から在庫を解消する側の注文が約定しやすくなる方向にオフセットを持たせる
↓
Phase2: オフセットを大きくしていく
↓
Phase3: 最終的に成行注文で即時在庫解消する
という流れが基本になります。
オフセットをどれくらい取るかのロジックは色々考えられます。例えばA&Sモデルでは納得価格 の式からわかるように在庫 および が大きくなるほど仲値からの距離も大きくなります。
在庫上限を決めておきそれ以上は積み増さないようにする、損失額やポジション保持期間が閾値を超えたら成行で損切りをするといった、ルールベースのロジックを組み合わせて使うこともあります。
逆選択リスクへの対応
1つ前で述べたように、片側約定した際の在庫解消を手早く行うというのがまず重要です。
その上で、「逆選択リスクを負うような相場では注文回避する」というロジック(トレンドフィルター)も有用となります。
トレンドフィルターとして使えそうな指標は色々あります。以下に例をあげておきます。
- 注文の偏りを示す指標
- OFI(Order Flow Imbalance)
- OBI(Order Book Imbalance)
- ボラティリティを表す指標
- ATR
- トレンドの方向を表す指標
- EMA
- MACD
- トレンドの強さを表す指標
- ADX
インフラ
これまでロジックについて述べてきましたが、最後にBotの実装や動作環境についても簡単に述べておきます。
MMBotはHFT寄りのロジックのため、発注やキャンセルをいかに遅延なく取引所に反映できるかが重要です。
最低でも
- websocketを利用した板情報の取得
- ボトルネックとなりうる重い処理を避ける
- 取引所に近いregionのクラウドでBotを動かす
などは考慮した方が良さそうです。
その上で、大手のHFT業者は
- コロケーション:取引所サーバーに物理的に近いサーバーでBotを動かす
- ハードウェアレベルの高速化:FPGA / ASICの利用
などを行い極限までレイテンシーを切り詰めているため、個人勢のBotterが単純な速さで勝負するのは厳しい、というのが現状の仮想通貨市場だと思います。
まとめ
MMBotの基本的な戦略について、理論的な話を中心にまとめました。
自分も今回の内容を踏まえて作ったMMBotを少しだけ動かしてみたのですが、シンプルなロジックのみでは逆選択の動きに負けて利益が出せなさそうというのが率直な感想でした。
そのあたりの話も、機会があればまた書こうと思います。