Bot トレードロジック

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

2024年7月30日

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

Yodaka

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

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

1.サーキットブレーカー狙い

Yodaka

値幅制限の上限・下限に張り付いた際の価格反転を狙うタイプのbotです。

サーキットブレーカー戦略は、市場での価格の急激な変動が生じた際に自動的にトレーディングを停止させるメカニズム(サーキットブレーカー)を利用して、価格の反転を狙うトレーディング手法です。市場が再開された際に価格が反転することを期待して取引を行います。以下のPythonコードは、この戦略を実装する一例です。

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

import ccxt
import time

取引所の設定と初期化

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

サーキットブレーカーの条件を満たした際のトレードロジック

def trade_on_circuit_breaker(exchange, symbol):
    """サーキットブレーカー発動時のトレードロジック"""
    # 最新の価格データを取得
    ticker = exchange.fetch_ticker(symbol)
    last_price = ticker['last']
    high_price = ticker['high']
    low_price = ticker['low']

    # サーキットブレーカーの発動条件(仮の例として、日の最高値または最低値に近い場合を設定)
    if last_price >= 0.99 * high_price:
        # 最高値近くでの取引:売り
        print(f"Selling at {last_price} near the high of the day {high_price}")
        # exchange.create_market_sell_order(symbol, amount)
    elif last_price <= 1.01 * low_price:
        # 最低値近くでの取引:買い
        print(f"Buying at {last_price} near the low of the day {low_price}")
        # exchange.create_market_buy_order(symbol, amount)

def main():
    while True:
        trade_on_circuit_breaker(exchange, symbol)
        time.sleep(60)  # 1分ごとにチェック

if __name__ == '__main__':
    main()

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

  • 市場の状態: サーキットブレーカーが実際に発動する条件は市場や取引所によって異なります。このコードでは、価格が日の高値または低値の近くに達したときにトレードを行うことを想定していますが、実際にはサーキットブレーカーの具体的な発動条件を取引所の規定や市場ニュースから得る必要があります。
  • トレード量と注文タイプ: 実際の注文を出す際には、取引量や注文のタイプ(成行注文、指値注文など)を適切に設定する必要があります。また、市場が非常に不安定な状態であるため、スリッページや注文の執行リスクを考慮することが重要です。
  • リアルタイム監視: この戦略は市場の急変に即座に反応する必要があるため、リアルタイムでの市場データの監視と迅速なトレード実行が求められます。

このスクリプトは基本的な枠組みを提供していますが、実際の取引ではさらに多くの詳細な分析と高度な実装が必要です。また、高いリスクを伴う可能性があるため、実際に適用する前に十分なバックテストとリスク評価を行うことをお勧めします。

2.ボラティリティ売買

Yodaka

変動の大きい銘柄を短期的に売買し、スプレッドを狙うタイプのbotです。

ボラティリティ売買戦略は、市場の価格変動が大きい時に、その動きを利用して利益を得る手法です。以下はPythonを使用してこの戦略を実装する基本的なコードの例です。このコードでは、価格の標準偏差を用いてボラティリティを測定し、特定のボラティリティレベルが達成された場合に売買を行います。

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

import ccxt
import numpy as np
import pandas as pd
import time

取引所の設定と初期化

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

過去データの取得とボラティリティの計算

def fetch_price_data(exchange, symbol, timeframe='5m', limit=100):
    """指定されたシンボルの価格データを取得"""
    candles = exchange.fetch_ohlcv(symbol, timeframe=timeframe, limit=limit)
    df = pd.DataFrame(candles, columns=['timestamp', 'open', 'high', 'low', 'close', 'volume'])
    df['timestamp'] = pd.to_datetime(df['timestamp'], unit='ms')
    return df

def calculate_volatility(prices):
    """価格データからボラティリティ(標準偏差)を計算"""
    return np.std(prices)

def trade_on_volatility(exchange, symbol, volatility_threshold):
    """ボラティリティに基づいて取引"""
    df = fetch_price_data(exchange, symbol)
    current_volatility = calculate_volatility(df['close'])

    print(f"Current Volatility: {current_volatility}")

    if current_volatility > volatility_threshold:
        # ボラティリティが閾値を超えた場合の取引
        print("High volatility detected, executing trades.")
        last_price = df.iloc[-1]['close']
        # 買い注文
        print(f"Buying at {last_price}")
        # exchange.create_limit_buy_order(symbol, amount, last_price)
        # 売り注文
        print(f"Selling at {last_price}")
        # exchange.create_limit_sell_order(symbol, amount, last_price)
    else:
        print("Volatility below threshold, no trade executed.")

def main():
    while True:
        trade_on_volatility(exchange, symbol, volatility_threshold=50)
        time.sleep(300)  # 5分ごとにデータを更新

if __name__ == '__main__':
    main()

注意点

  • データの取得と分析: 実際に取引を行う前に、市場の状況を正確に理解するために十分なデータを取得して分析することが重要です。
  • トレードの実行: 実際のトレードを行う場合は、適切な注文数量や価格を設定する必要があります。また、取引所のレートリミットに注意し、APIを適切に利用してください。
  • リスク管理: 任意の取引戦略と同様に、リスク管理措置を施し、資金管理を徹底することが重要です。

このコードはボラティリティが高い場合に自動的に売買を行う基本的なロジックを示していますが、実際の取引にはより多くの詳細な条件と安全なリスク管理策が必要です。

3.スケーリング売買

Yodaka

注文を分割し、順次発注・約定させることで売買するタイプのbotです。

スケーリング売買戦略は、リスクを分散し、市場への影響を最小限に抑えるために大きな注文を複数の小さな注文に分割して執行する方法です。この戦略は特に大口トレーダーに適しており、市場の流動性に影響を与えずにポジションを構築または解消することができます。以下はPythonを使ってこの戦略を実装するコードの例です。

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

import ccxt
import time

取引所の設定と初期化

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

スケーリング売買を実行する関数

def scaling_trade(exchange, symbol, total_amount, order_count, order_interval):
    """
    指定された通貨ペアに対してスケーリング売買を行う。
    
    :param exchange: 取引所のインスタンス
    :param symbol: 取引する通貨ペア
    :param total_amount: トータルで取引する数量
    :param order_count: 注文を分割する数
    :param order_interval: 各注文の間隔(秒)
    """
    order_size = total_amount / order_count  # 各注文のサイズ
    current_price = exchange.fetch_ticker(symbol)['last']  # 現在の市場価格を取得

    for i in range(order_count):
        # 注文価格の計算(市場価格の小さなプレミアムまたはディスカウントを使用)
        order_price = current_price * (1 + 0.0001 * (-1)**i)  # 交互に少し高い/低い価格で注文
        
        print(f"Placing order {i+1}/{order_count}: {order_size} {symbol} at {order_price}")
        # 売買注文のシミュレーション(実際の取引所では以下のコメントを外し実行)
        # if i % 2 == 0:
        #     exchange.create_limit_buy_order(symbol, order_size, order_price)
        # else:
        #     exchange.create_limit_sell_order(symbol, order_size, order_price)
        
        time.sleep(order_interval)  # 次の注文まで待機

def main():
    scaling_trade(exchange, symbol, total_amount=1.0, order_count=10, order_interval=60)

if __name__ == '__main__':
    main()

注意点

  • API制限とネットワーク遅延: 各取引所はAPI呼び出しにレートリミットを設けています。このスクリプトではorder_intervalを用いて注文間隔を管理していますが、実際の使用時には取引所のレートリミットを確認してください。
  • 注文量と価格: スケーリング戦略では、市場の影響を最小限に抑えるために注文量と価格を適切に設定することが重要です。価格変動に基づいて動的に注文価格を調整するロジックを組み込むことも考慮してください。
  • リスク管理: 分割された注文が市場の変動により期待通りの価格で約定しないリスクがあります。この戦略を実行する際は、市場の状況をリアルタイムでモニタリングし、必要に応じて調整を行うことが重要です。

このコードはスケーリング売買戦略の基本的な実装を提供していますが、実際の取引環境で利用するためにはより詳細なロジックやセーフガードが必要です。

4.オプション取引と連動した売買

Yodaka

オプション取引と現物の連動性に着目した売買するタイプのbotです。

オプション取引と現物取引を連動させる戦略は、オプションの価格動向が示唆する市場の期待を活用して、現物市場でのポジションを取ることを意味します。具体的には、オプションのインプライド・ボラティリティ(IV)を用いて市場の予想される動向を分析し、それに基づいて現物の売買を行うことが一般的です。以下は、Pythonを使用してこの戦略を実装するためのコード例です。

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

import ccxt
import datetime
import time

取引所の設定と初期化

exchange = ccxt.binance({
    'apiKey': 'YOUR_API_KEY',
    'secret': 'YOUR_API_SECRET',
    'enableRateLimit': True
})
symbol = 'BTC/USDT'
options_symbol = 'BTC-31DEC2021-40000-C'

オプションのIVと現物価格の取得

def get_option_data(exchange, options_symbol):
    """オプションのデータを取得(仮想関数、実際には取引所からオプションデータを取得)"""
    # インプライド・ボラティリティ、最終取引価格などを取得
    implied_volatility = 0.85  # 85%
    last_price = 2000  # オプションの最終取引価格
    return implied_volatility, last_price

def get_spot_price(exchange, symbol):
    """現物市場の最新価格を取得"""
    ticker = exchange.fetch_ticker(symbol)
    return ticker['last']

def analyze_market(implied_volatility, spot_price):
    """市場分析と取引の決定"""
    print(f"Implied Volatility: {implied_volatility}, Spot Price: {spot_price}")
    if implied_volatility > 1:  # IVが100%を超える場合
        print("High volatility expected, consider buying options")
    elif implied_volatility < 0.5:  # IVが50%未満の場合
        print("Low volatility expected, consider selling options")

def main():
    while True:
        implied_volatility, _ = get_option_data(exchange, options_symbol)
        spot_price = get_spot_price(exchange, symbol)
        analyze_market(implied_volatility, spot_price)
        time.sleep(3600)  # 1時間ごとにデータ更新

if __name__ == '__main__':
    main()

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

  • データソース:上記のコードは、オプションの取引データを取得するためのAPIがBinanceに存在すると仮定していますが、実際には多くの取引所がオプション市場のデータアクセスを提供していません。適切なデータソースを利用する必要があります。
  • APIレートリミット:APIの呼び出し回数にはレートリミットが存在するため、データ取得の間隔を適切に設定する必要があります。
  • リスク管理:オプション取引は高リスクであり、特にIVが高い場合は大きな価格変動が期待されるため、適切なリスク管理措置を施すことが重要です。

このコードはオプションと現物の連動性に基づいた売買戦略を概念的に示していますが、実際の適用にはオプション市場の詳細な分析と、現物市場での取引戦略をさらに精緻化する必要があります。

5.ディープラーニングによる売買シグナル発見

Yodaka

過去のデータからディープラーニングで売買パターンを発見し活用するタイプのbotです。

ディープラーニングを用いて売買シグナルを発見し、活用する戦略を実装するには、過去の市場データを基にモデルを訓練し、そのモデルを用いて実時間のデータに対して予測を行い、取引判断を下すというプロセスが必要です。以下は、Kerasを使用したシンプルなニューラルネットワークモデルを構築し、過去の価格データから売買シグナルを予測するための基本的なコード例です。

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

import numpy as np
import pandas as pd
from keras.models import Sequential
from keras.layers import Dense, LSTM, Dropout
from keras.optimizers import Adam
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split
import matplotlib.pyplot as plt

データの準備

この例では、価格データがCSVファイルに保存されていると仮定しています。データにはタイムスタンプと終値が含まれているとします。

# データの読み込み
df = pd.read_csv('price_data.csv', parse_dates=True, index_col='timestamp')
prices = df['close'].values

# 特徴量とラベルの生成
window_size = 10  # 10日間のデータを入力とする

X = []
y = []

for i in range(len(prices) - window_size):
    X.append(prices[i:i+window_size])
    y.append(prices[i+window_size])

X = np.array(X)
y = np.array(y)

# データの標準化
scaler = StandardScaler()
X = scaler.fit_transform(X)

# データの分割
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

モデルの構築

# モデルの定義
model = Sequential()
model.add(Dense(50, input_dim=window_size, activation='relu'))
model.add(Dropout(0.2))
model.add(Dense(1, activation='linear'))

# モデルのコンパイル
model.compile(optimizer=Adam(lr=0.001), loss='mean_squared_error')

# モデルの訓練
model.fit(X_train, y_train, epochs=50, batch_size=32, verbose=1, validation_data=(X_test, y_test))

予測と評価

# テストデータに対する予測
predicted_prices = model.predict(X_test)

# 結果のプロット
plt.figure(figsize=(10, 5))
plt.plot(y_test, label='Actual Prices')
plt.plot(predicted_prices, label='Predicted Prices')
plt.title('Price Prediction')
plt.xlabel('Time')
plt.ylabel('Price')
plt.legend()
plt.show()

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

  • データの量と質: ディープラーニングモデルの性能は、使用するデータの量と質に大きく依存します。より多くのデータと、より関連性の高い特徴量を用意することが重要です。
  • 過学習のリスク: ディープラーニングモデルは複雑で、過学習に陥りやすいです。適切な正則化技術やデータの分割方法を選ぶ必要があります。
  • リアルタイム性能: 実際の取引環境での使用には、リアルタイムでデータを処理し、予測を行うシステムが必要です。

このコードは、簡単なニューラルネットワークモデルを使用して金融時系列データから売買シグナルを生成するための基本的なフレームワークを提供します。実際の取引に適用する前に、より詳細なモデル評価とリスク管理戦略を行うことが重要です。

まとめ

今回も5種類のbotの雛形をまとめました。

Yodaka

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

-Bot, トレードロジック