Bot

仮想通貨botの開発記録#75(2024/5/19)「高頻度Bot開発:マーケットメイカーの振る舞い」

2024年5月19日

前回の記事に引き続き、今回も仮想通貨botの開発状況をまとめていきます。

Yodaka

高頻度Bot開発のロジック案をもとに様々なBot開発を試しています。

今回は「マーケットメイカー同士のイキ酔い」を前提にして高頻度取引Botを開発する方法を考えてみました。

MM同士のイキ酔い

マーケットメイカーとは、買い注文と売り注文の両方を出して、売買スプレッド(買値と売値の差)から利益を得る業者のこと。

通常、マーケットメイカーは適正なスプレッドを維持しようとするが、時として熱くなり過ぎて、無駄に買値や売値を改訂し合う「イキ酔い」状態に陥ることがある。

この「イキ酔い」状態になると、マーケットメイカー同士の買値と売値の間に一時的に大きな価格ギャップが生じる可能性がある。

このギャップを高頻度で検知し、安値で買って高値で売る、というアービトラージの機会が生まれる。つまり、マーケットメイカー同士のイキ酔いによる一時的な無裁定の状態を高速な売買で利益に転化することができる。

ただし、このようなイキ酔いの機会は一時的なものなので、瞬時に検知して売買できるシステムが必要。高頻度取引の技術が不可欠。

関連記事
仮想通貨botの開発を本格的に始めてみる#39(2023/12/20)「MMBotの開発④MMBotとは?/マーケットメイキング(MM)戦略のコスト分析」

続きを見る

マーケットメイカー同士のイキ酔い

Yodaka

マーケットメイカー同士のイキ酔い(競争や協調などのシグナル)を検知する方法はいくつかあります。以下に主要な方法を列挙します。

1. 注文フローの分析

  • 注文のパターンの検出: 特定のマーケットメイカーからの注文のタイミング、頻度、サイズの変化を監視します。特定のパターン(例えば、大量の注文が短期間で発生する場合など)が見られた場合、マーケットメイカー同士の競争や協調のシグナルと見なされることがあります。

2. スプレッドの変動

  • ビッド・アスクスプレッドの変動: マーケットメイカーが競争している場合、ビッド・アスクスプレッドが急激に縮小することがあります。逆に、協調している場合はスプレッドが安定または拡大することがあります。

3. 約定価格の分析

  • 約定価格の異常なパターン: 約定価格が特定のレンジ内で頻繁に発生する場合、マーケットメイカー同士の協調の可能性があります。一方、価格が急激に変動する場合は、競争が激化している可能性があります。

4. 市場デプス(深さ)の分析

  • オーダーブックの構造変化: オーダーブックの特定のレベルでの注文量の急激な増減を監視します。これはマーケットメイカー同士の動向を示すシグナルとなることがあります。

5. 高頻度取引の監視

  • 高頻度取引(HFT)のパターン: HFT戦略を使用するマーケットメイカーの注文パターンや取引速度を監視することで、マーケットメイカー同士の競争や協調のシグナルを検知します。

6. 視覚的ツールとアルゴリズム

  • ヒートマップやチャート: 注文フローやスプレッドの変動を視覚化するツールを使用して、マーケットメイカー同士の動向を視覚的に把握します。
  • 機械学習アルゴリズム: 過去のデータを使用してマーケットメイカーの行動パターンを学習し、リアルタイムで異常なパターンを検知します。

7. 取引量の異常検出

  • 取引量の急激な増減: 特定の銘柄や時間帯における取引量の急激な変化を監視します。これはマーケットメイカー同士の競争や協調のシグナルとなることがあります。

8. 取引所データの利用

  • 取引所の公表データ: 一部の取引所では、マーケットメイカーの活動に関するデータを公表していることがあります。このデータを分析することで、マーケットメイカー同士の動向を把握します。
Yodaka

これらの方法を組み合わせることで、マーケットメイカー同士のイキ酔いのシグナルを効果的に検知することができます。特に、リアルタイムでの監視高度な分析ツールを活用することが重要です。

実用的な戦略

マーケットメイカー同士のイキ酔いのシグナルを検知するために、以下の方法を組み合わせる案を述べます。

組み合わせの全体戦略

  1. リアルタイムデータ収集: 注文フロー、ビッド・アスクスプレッド、約定価格、オーダーブックのデータをリアルタイムで収集する。
  2. データ統合と視覚化: 収集したデータを統合し、視覚化ツールを使用して異常パターンを迅速に把握する。
  3. アルゴリズム分析: 機械学習アルゴリズムや統計的手法を用いて、データからシグナルを自動検出する。
  4. アラートシステム: 異常検知時にアラートを発信し、迅速な対応を可能にする。

具体的な組み合わせの実施案

1. リアルタイムデータ収集

  • 注文フロー: 高頻度取引プラットフォームを利用して、各マーケットメイカーの注文パターンをリアルタイムで収集。
  • ビッド・アスクスプレッド: スプレッドの変動を記録し、急激な縮小や拡大をモニター。
  • 約定価格: 各取引の約定価格をリアルタイムで収集し、異常な価格変動を検知。

2. データ統合と視覚化

  • 視覚化ツールの活用: ヒートマップやチャートを使用して、注文フローやスプレッドの変動を視覚化。これにより、マーケットメイカー同士の競争や協調のパターンを一目で確認可能。
  • オーダーブックの構造: オーダーブックの深さを表示し、特定の価格レベルでの注文量の急激な変動を視覚的に把握。

3. アルゴリズム分析

  • 機械学習アルゴリズム: 過去のデータを用いて、マーケットメイカーの行動パターンを学習。異常なパターンをリアルタイムで検知するためのモデルを構築。
  • 統計的手法: 相関係数や共分散を計算し、マーケットメイカー同士の相関関係を数値化。異常な値が検出された場合、シグナルとして記録。

4. アラートシステム

  • リアルタイムアラート: 異常なパターンが検知された場合、トレーダーやリスク管理チームに即時にアラートを発信。メール、SMS、ダッシュボード通知などを利用。
  • アラート条件の設定: 異常なスプレッドの変動、取引量の急増、約定価格の異常な変動など、具体的な条件を設定してアラートをトリガー。

実施例

  • 取引所データの活用: 取引所が公表しているマーケットメイカーの活動データを収集し、上述のリアルタイムデータと統合。これにより、マーケットメイカー同士の協調や競争の全体像をより明確に把握。
  • 高頻度取引(HFT)の監視: 高頻度取引を行うマーケットメイカーの活動を特に重点的に監視し、注文パターンや取引速度の異常を検知。

フローの統合

  1. データ収集段階: 各データソースからリアルタイムでデータを収集し、中央データベースに統合。
  2. データ処理と分析: 機械学習モデルや統計的手法を用いてデータを処理し、異常パターンを検出。
  3. 視覚化とモニタリング: ダッシュボードを使用してデータを視覚化し、異常が検出された際にトレーダーやリスク管理チームが即時に対応できるようにする。
  4. アラート発信: 異常が検出された場合、設定された条件に基づき、アラートを発信。
Yodaka

このように、データ収集、分析、視覚化、アラート発信を組み合わせることで、マーケットメイカー同士のイキ酔いのシグナルを効果的に検知するシステムを構築することができます。

サンプルコード

BitflyerFXで取引を行うコードをPythonで書くためには、BitflyerのAPIを利用する必要があります。以下は、上記の案を取り入れて、マーケットメイカー同士のシグナルを検知し、自動取引を行うためのサンプルコードです。

このコードは以下のステップを実行します。

  1. リアルタイムデータ収集
  2. データの統合と分析
  3. アラートシステム
  4. 自動取引の実行

以下にPythonコードを示しますが、APIキーやシークレットはご自身のものに置き換えてください。

注意点

取引の実行にはリスクが伴うため、実運用前にテスト環境で十分に検証してください。

import time
import hmac
import hashlib
import requests
import json
import websocket
import threading
import numpy as np
from datetime import datetime

# APIキーとシークレット
API_KEY = 'YOUR_API_KEY'
API_SECRET = 'YOUR_API_SECRET'

# BitflyerFXのエンドポイント
API_URL = 'https://api.bitflyer.com'
WS_URL = 'wss://ws.lightstream.bitflyer.com/json-rpc'

# マーケットメイカーのシグナルを検知するためのパラメータ
SPREAD_THRESHOLD = 0.01  # スプレッドの閾値
VOLUME_THRESHOLD = 1.0  # 取引量の閾値

# リアルタイムデータの保持
order_book = {'bids': [], 'asks': []}
trade_data = []

# HMAC署名の生成
def sign(message):
    return hmac.new(API_SECRET.encode(), message.encode(), hashlib.sha256).hexdigest()

# APIリクエストの送信
def send_request(endpoint, method='GET', params=None):
    url = f"{API_URL}{endpoint}"
    headers = {
        'ACCESS-KEY': API_KEY,
        'ACCESS-TIMESTAMP': str(time.time()),
        'Content-Type': 'application/json',
    }
    if params is None:
        params = {}
    body = json.dumps(params)
    headers['ACCESS-SIGN'] = sign(headers['ACCESS-TIMESTAMP'] + method + url + body)
    response = requests.request(method, url, headers=headers, data=body)
    return response.json()

# WebSocketでのリアルタイムデータ取得
def on_message(ws, message):
    global order_book, trade_data
    data = json.loads(message)
    if 'params' in data:
        channel = data['params']['channel']
        if channel == 'lightning_board_FX_BTC_JPY':
            order_book = data['params']['message']
        elif channel == 'lightning_executions_FX_BTC_JPY':
            trade_data.append(data['params']['message'])

def on_open(ws):
    params = {
        'method': 'subscribe',
        'params': {
            'channel': 'lightning_board_FX_BTC_JPY'
        }
    }
    ws.send(json.dumps(params))
    params = {
        'method': 'subscribe',
        'params': {
            'channel': 'lightning_executions_FX_BTC_JPY'
        }
    }
    ws.send(json.dumps(params))

def start_websocket():
    ws = websocket.WebSocketApp(WS_URL, on_message=on_message, on_open=on_open)
    ws.run_forever()

# スプレッドの計算
def calculate_spread():
    global order_book
    if order_book['bids'] and order_book['asks']:
        highest_bid = max(order_book['bids'], key=lambda x: x['price'])
        lowest_ask = min(order_book['asks'], key=lambda x: x['price'])
        return (lowest_ask['price'] - highest_bid['price']) / lowest_ask['price']
    return float('inf')

# 異常検知とアラート
def detect_anomalies():
    while True:
        spread = calculate_spread()
        if spread < SPREAD_THRESHOLD:
            print(f"Spread anomaly detected at {datetime.now()}: {spread}")
            execute_trade()
        time.sleep(1)

# 自動取引の実行
def execute_trade():
    # サンプルの取引実行(ビットコインを1枚購入)
    params = {
        'product_code': 'FX_BTC_JPY',
        'child_order_type': 'MARKET',
        'side': 'BUY',
        'size': 0.01,
    }
    response = send_request('/v1/me/sendchildorder', method='POST', params=params)
    print(f"Trade executed: {response}")

# マルチスレッドでWebSocketと異常検知を実行
if __name__ == "__main__":
    websocket_thread = threading.Thread(target=start_websocket)
    websocket_thread.start()

    anomaly_detection_thread = threading.Thread(target=detect_anomalies)
    anomaly_detection_thread.start()

説明

  1. データ収集:
    • WebSocketを利用してBitflyerからリアルタイムの注文板情報と取引データを取得。
  2. データ統合と視覚化:
    • 注文板情報からスプレッドを計算し、異常を検知。
  3. アラートシステム:
    • スプレッドが設定した閾値を下回った場合、アラートを発し、自動取引を実行。
  4. 自動取引:
    • 異常が検知された場合、サンプルとしてビットコインを購入する取引を実行。
Yodaka

このコードは基礎的なサンプルであり、実運用においてはエラーハンドリングや追加の分析ロジックなどを実装する必要があります。

まとめ

今回は「マーケットメイカーの振る舞い」をもとにした取引戦略のアイデアをBotにしてみました。

Yodaka

今後もこの調子でBot開発のペースを上げていきます。

-Bot