Bot トレードロジック

仮想通貨botの開発記録#83(2024/7/30)「基本的な取引ロジックの雛形まとめ ③」

2024年7月30日

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

Yodaka

今回も5種類の基本的な取引ロジックの雛形をまとめました。

実際にbotで取引をしてみたいけれど、どんなコードを書いたら良いのか分からないという方の参考になると思います。

1.ボリューム・ウェイト平均価格の追跡

Yodaka

約定量で重み付けした平均価格の動きに注目し、売買するタイプのbotです。

ボリュームウェイト平均価格(VWAP:Volume Weighted Average Price)は、特定の時間枠での取引量に基づいて計算される重み付け平均価格です。VWAPを追跡して取引する戦略は、市場価格がVWAPを上回る時に売り、下回る時に買いを入れることで利益を狙います。ここでは、Pythonを使用してVWAPを計算し、その情報に基づいて売買を行う戦略のコードを紹介します。

必要なライブラリのインポート

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

データ取得とVWAPの計算

ここではサンプルデータを使用します。実際には市場データAPIから取得したデータを使用します。

# サンプルデータの生成(日付、価格、ボリューム)
data = {
    'timestamp': pd.date_range(start='2020-01-01', periods=100, freq='T'),
    'price': np.random.random(100) * 100 + 100,
    'volume': np.random.randint(1, 10, size=100)
}
df = pd.DataFrame(data)

# VWAPの計算
df['vwap'] = (df['price'] * df['volume']).cumsum() / df['volume'].cumsum()

トレーディングシグナルの生成

市場価格がVWAPより上にある場合は売り、VWAPより下にある場合は買いのシグナルを生成します。

def generate_signals(df):
    """売買シグナルを生成"""
    df['signal'] = 0
    df['signal'][df['price'] > df['vwap']] = -1  # 売りシグナル
    df['signal'][df['price'] < df['vwap']] = 1   # 買いシグナル
    df['positions'] = df['signal'].diff()
    return df

df = generate_signals(df)

取引シグナルの可視化

plt.figure(figsize=(14, 7))
plt.plot(df['timestamp'], df['price'], label='Price')
plt.plot(df['timestamp'], df['vwap'], label='VWAP', color='orange', linestyle='--')
plt.scatter(df['timestamp'][df['positions'] == 1], df['price'][df['positions'] == 1], label='Buy Signal', marker='^', color='green', s=100)
plt.scatter(df['timestamp'][df['positions'] == -1], df['price'][df['positions'] == -1], label='Sell Signal', marker='v', color='red', s=100)
plt.title('VWAP Trading Signals')
plt.xlabel('Timestamp')
plt.ylabel('Price')
plt.legend()
plt.show()

このスクリプトは、与えられたデータに基づいてVWAPを計算し、価格がVWAPを上回ったり下回ったりする点で売買のシグナルを生成します。これは非常にシンプルな例であり、実際のトレーディング環境では、スリッページ、取引手数料、その他の市場要因を考慮する必要があります。また、取引シグナルの生成はリアルタイムデータフィードと統合され、動的に更新されるべきです。

2.オーダーブック形状からの売買

Yodaka

板の売り買い注文の積み上がり方から需給を予測し、売買するタイプのbotです。

オーダーブックの形状から需給を予測し、その情報を基に売買する戦略は、特に市場の流動性が高い環境で有効です。ここでは、Pythonとccxtライブラリを使用して、オーダーブックのデータから売買シグナルを生成する基本的な戦略のコードを紹介します。

必要なライブラリのインポート

import ccxt
import time

取引所の設定と初期化

exchange = ccxt.binance({
    'apiKey': 'YOUR_API_KEY',
    'secret': 'YOUR_API_SECRET',
    'enableRateLimit': True  # レートリミットを遵守するため
})
symbol = 'BTC/USDT'

オーダーブックから需給バランスを分析する関数

def analyze_order_book(exchange, symbol):
    """オーダーブックから需給バランスを分析し、売買シグナルを生成する"""
    order_book = exchange.fetch_order_book(symbol)
    bids = order_book['bids']
    asks = order_book['asks']

    # 買い注文と売り注文の合計量を計算
    total_bid_volume = sum([bid[1] for bid in bids])
    total_ask_volume = sum([ask[1] for ask in asks])

    # 需給バランスの計算
    if total_bid_volume > total_ask_volume:
        return 'buy'
    elif total_ask_volume > total_bid_volume:
        return 'sell'
    else:
        return 'hold'

def execute_trade(signal):
    """トレード信号に基づいて取引を実行する"""
    print(f"Trade Signal: {signal}")
    # ここで実際の取引命令を書く(例:exchange.create_limit_buy_order(symbol, amount, price))

メイン実行関数

def main():
    while True:
        signal = analyze_order_book(exchange, symbol)
        execute_trade(signal)
        time.sleep(10)  # 10秒ごとにオーダーブックを分析

if __name__ == '__main__':
    main()

このコードは、指定された通貨ペアのオーダーブックを定期的に取得し、買い注文の総量と売り注文の総量を比較して、需給バランスに基づいた売買シグナルを生成します。需要が供給を上回る場合は買い、供給が需要を上回る場合は売り、バランスが取れている場合は保持のシグナルを出します。

注意点

  • この戦略は非常にシンプルであり、実際のトレーディングにはさらに多くの要因(例えば、注文の価格、市場の流動性、注文の深さなど)を考慮する必要があります。
  • 実際にトレードを実行する場合は、注文の具体的な詳細(数量、価格など)を適切に設定し、注文のスリッページや取引手数料を考慮する必要があります。

3.時間ウェイトによる売買

Yodaka

特定の時間帯における価格の変動パターンを捉え、売買するタイプのbotです。

時間ウェイトによる売買戦略は、市場の特定の時間帯に注目し、その時間に特有の価格変動パターンを利用して取引を行う手法です。この戦略は、市場が開く直後や閉じる前など、特定の時間帯に見られるトレンドや反転を捉えるのに適しています。以下は、Pythonを使用して特定の時間帯でのトレードを実行するコードの例です。

必要なライブラリのインポート

import datetime
import pytz
import ccxt
import time

取引所の設定と初期化

exchange = ccxt.binance({
    'apiKey': 'YOUR_API_KEY',
    'secret': 'YOUR_API_SECRET',
    'enableRateLimit': True
})
symbol = 'BTC/USDT'
timezone = pytz.timezone('UTC')  # 例としてUTCを使用

指定した時間帯に売買する関数

def trade_during_specific_hours(start_hour, end_hour):
    """特定の時間帯に売買を行う関数"""
    now = datetime.datetime.now(timezone)
    if start_hour <= now.hour < end_hour:
        # 指定した時間帯内での取引ロジック
        print(f"Trading allowed. Current hour: {now.hour}")
        # ここに取引ロジックを実装します。
        # 例:価格を取得して特定の条件で売買
        ticker = exchange.fetch_ticker(symbol)
        last_price = ticker['last']
        print(f"Last price: {last_price}")
        # デモ条件:価格が特定のレベル以上なら売買
        if last_price > 50000:
            print("Buy Signal")
            # 実際の購入コマンドはここに: exchange.create_limit_buy_order(symbol, amount, price)
        elif last_price < 30000:
            print("Sell Signal")
            # 実際の売却コマンドはここに: exchange.create_limit_sell_order(symbol, amount, price)
    else:
        print(f"Trading not allowed. Current hour: {now.hour}")

def main():
    while True:
        trade_during_specific_hours(14, 16)  # UTCの14時から16時までの間に取引
        time.sleep(3600)  # 次の時間までスリープ

if __name__ == '__main__':
    main()

このスクリプトは、UTCの14時から16時の間に市場での取引を行います。この時間帯内に価格をチェックし、特定の条件に基づいて売買の判断を行います。実際の取引では、より詳細な分析や複数の条件を設定することが一般的です。

注意点

  • 実際に使用する場合は、取引条件をより詳細に設定する必要があります。
  • sleep 間隔は取引所のAPIレートリミットに基づいて調整する必要があります。
  • このコードはデモンストレーション用です。実際の取引では、取引コスト、スリッページ、その他の市場要因を考慮に入れる必要があります。

4.イベント発生時の売買

Yodaka

重要な経済指標の発表時など、イベントによる価格変動に賭けるタイプのbotです。

イベント発生時の売買戦略は、重要な経済指標やニュースが発表されることで予想される市場の価格変動を利用して利益を得る手法です。このタイプの戦略を自動化するには、リアルタイムのニュースやイベントデータにアクセスする必要がありますが、実際には多くのアルゴリズムトレーダーが利用する専門のニュースフィードサービスを利用することが一般的です。ここでは、仮想のイベントをトリガーとするシンプルな売買戦略をPythonコードで示します。

必要なライブラリのインポート

import datetime
import time
import ccxt

取引所の設定と初期化

exchange = ccxt.binance({
    'apiKey': 'YOUR_API_KEY',
    'secret': 'YOUR_API_SECRET',
    'enableRateLimit': True
})
symbol = 'BTC/USDT'

イベントベースの売買ロジック

def fetch_event_data():
    """イベントデータを取得する仮想関数(実際には外部APIからのフィードを受け取る)"""
    # 例として、ランダムに重要なイベントを発生させる
    import random
    events = ['positive', 'negative', 'neutral']
    return random.choice(events)

def trade_on_event():
    """イベントに基づいてトレードを実行する"""
    event = fetch_event_data()
    print(f"Detected event: {event}")
    ticker = exchange.fetch_ticker(symbol)
    current_price = ticker['last']

    # イベントタイプによる条件分岐
    if event == 'positive':
        # ポジティブなニュースの場合は買い注文
        print(f"Placing buy order at {current_price}")
        # exchange.create_market_buy_order(symbol, amount)
    elif event == 'negative':
        # ネガティブなニュースの場合は売り注文
        print(f"Placing sell order at {current_price}")
        # exchange.create_market_sell_order(symbol, amount)

def main():
    while True:
        trade_on_event()
        time.sleep(3600)  # 1時間ごとにイベントチェック(実際の頻度はイベントの発生頻度に依存)

if __name__ == '__main__':
    main()

注意点と実装上の考慮事項

  • データソース: 実際の取引戦略では、Bloomberg、Reuters、または専門の経済データサービスからリアルタイムのイベントデータを取得する必要があります。
  • 速度と反応性: イベント発生時の取引では、データ取得と取引の速度が極めて重要です。遅延は取引機会の損失につながる可能性があります。
  • リスク管理: イベントベースの取引は市場が不安定になりやすいため、特にリスク管理が重要です。適切なストップロスやリスク管理戦略が必要です。
  • 法的・規制の考慮: 特定の市場や地域では、市場操作やインサイダー取引に関する規制が厳格に適用されるため、適切なコンプライアンスが必要です。

このコードは、イベントベースの取引戦略を実装するための基本的な枠組みを提供しますが、実際のトレーディング環境で使用するにはさらに多くの詳細と機能が必要です。

5.インテリジェンス・クロス

Yodaka

マーケットメイカー同士のイキ酔いを検知し、アービトラージするタイプのbotです。

「インテリジェンス・クロス」とは、特定の取引所内や異なる取引所間でマーケットメイカー間の競合や価格の非効率を利用する高度なアービトラージ戦略です。この戦略はマーケットメイカーの注文の位置づけや価格設定のミスマッチを利用して、低リスクで利益を得ることを目指します。以下はこの戦略を実装するための基本的なPythonコードの枠組みです。

必要なライブラリのインポート

import ccxt
import time

取引所の設定と初期化

exchange1 = ccxt.binance({
    'apiKey': 'YOUR_API_KEY_1',
    'secret': 'YOUR_API_SECRET_1',
    'enableRateLimit': True
})

exchange2 = ccxt.binance({
    'apiKey': 'YOUR_API_KEY_2',
    'secret': 'YOUR_API_SECRET_2',
    'enableRateLimit': True
})

symbol = 'BTC/USDT'

オーダーブックを分析してアービトラージの機会を探る関数

def find_arbitrage_opportunity(exchange1, exchange2, symbol):
    """オーダーブックを分析し、アービトラージの機会を探る"""
    orderbook1 = exchange1.fetch_order_book(symbol)
    orderbook2 = exchange2.fetch_order_book(symbol)
    
    best_bid1 = orderbook1['bids'][0][0] if orderbook1['bids'] else None
    best_ask1 = orderbook1['asks'][0][0] if orderbook1['asks'] else None
    
    best_bid2 = orderbook2['bids'][0][0] if orderbook2['bids'] else None
    best_ask2 = orderbook2['asks'][0][0] if orderbook2['asks'] else None
    
    # マーケットメイカーの不整合をチェック
    if best_bid1 and best_ask2 and best_bid1 > best_ask2:
        print("Arbitrage Opportunity: Buy on Exchange2 at", best_ask2, "and sell on Exchange1 at", best_bid1)
        # ここに取引実行のコードを挿入
    elif best_bid2 and best_ask1 and best_bid2 > best_ask1:
        print("Arbitrage Opportunity: Buy on Exchange1 at", best_ask1, "and sell on Exchange2 at", best_bid2)
        # ここに取引実行のコードを挿入

メイン実行関数

def main():
    while True:
        find_arbitrage_opportunity(exchange1, exchange2, symbol)
        time.sleep(1)  # APIレート制限を考慮

if __name__ == '__main__':
    main()

注意点と実装上の考慮事項

  • APIレートリミット: ほとんどの取引所はAPIの呼び出しにレートリミットが設けられています。頻繁なアクセスは制限される可能性があるため、適切に間隔を設けてください。
  • 取引手数料とスリッページ: 小さな価格差を利用するアービトラージ戦略では、取引手数料とスリッページが利益に大きく影響します。取引実行前にこれらのコストを計算し、利益が出るかどうかをしっかりと評価する必要があります。
  • 実装: 実際に取引を行う際には、注文のタイプ(成行注文、指値注文など)や数量など、取引条件を具体的に設定する必要があります。

このコードはイベント駆動型のアービトラージ戦略を構築するための基本的な枠組みを提供しますが、実際の市場で利用するには詳細なリスク管理戦略や高度なトレード実行アルゴリズムが必要です。

まとめ

今回も基本的なトレードロジックとbotの雛形をまとめました。

基本的なモデルを組み合わせたりモデルの精度を高めたりしながら強いbot作りに繋げることができます。

Yodaka

今後もこの調子でbot開発の進捗状況をまとめていきます。

-Bot, トレードロジック