Bot トレードロジック

仮想通貨botの開発記録#88(2024/8/1)「発展的な取引ロジックの雛形まとめ③」

2024年8月1日

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

Yodaka

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

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

1.最適スケジューリング

Yodaka

売買のタイミングをスケジュール最適化するタイプのbotです。

最適スケジューリング戦略は、取引のタイミングを最適化して市場での影響を最小限に抑え、取引コストを削減することを目指します。以下のPythonコードは、機械学習モデルを使用して市場のボラティリティパターンを分析し、その情報を基に売買の最適なタイミングを決定する方法を示します。

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

import numpy as np
import pandas as pd
from sklearn.ensemble import RandomForestRegressor
from sklearn.model_selection import train_test_split
import matplotlib.pyplot as plt

データの取得と前処理

この例では、架空の株価データを生成していますが、実際には市場データを使用します。

# ダミーデータの生成
np.random.seed(0)
dates = pd.date_range(start="2020-01-01", periods=180)
prices = np.random.normal(loc=100, scale=20, size=(180,)) + np.linspace(90, 110, 180)
data = pd.DataFrame(data={'price': prices}, index=dates)

# 特徴量とターゲットの生成
data['previous_price'] = data['price'].shift(1)
data['next_price'] = data['price'].shift(-1)
data.dropna(inplace=True)

機械学習モデルのトレーニング

def train_model(data):
    X = data[['price', 'previous_price']]
    y = data['next_price']
    X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, random_state=42)

    model = RandomForestRegressor(n_estimators=100, random_state=42)
    model.fit(X_train, y_train)
    print("Model training completed.")
    return model, X_test, y_test

model, X_test, y_test = train_model(data)

売買のタイミングの決定

def determine_optimal_schedule(model, X_test, y_test):
    predictions = model.predict(X_test)
    results = pd.DataFrame({'actual': y_test, 'predicted': predictions}, index=y_test.index)
    results['decision'] = np.where(results['predicted'] > results['actual'], "Buy", "Sell")
    return results

optimal_schedule = determine_optimal_schedule(model, X_test, y_test)
print(optimal_schedule.head())

結果の視覚化

plt.figure(figsize=(10, 5))
plt.plot(data['price'], label='Actual Prices')
plt.scatter(optimal_schedule.index, optimal_schedule['actual'], color='red', label='Sell', marker='v')
plt.scatter(optimal_schedule.index, optimal_schedule['actual'], color='green', label='Buy', marker='^')
plt.title('Optimal Trading Schedule')
plt.xlabel('Date')
plt.ylabel('Price')
plt.legend()
plt.show()

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

  • 市場の流動性: 売買のスケジュールを設定する際、市場の流動性を考慮することが重要です。
  • モデルの再訓練: 市場の状況が変わるとモデルの性能が落ちるため、定期的に再訓練が必要です。
  • 実際の取引コスト: 取引の実際のコスト(手数料、スリッページなど)も考慮に入れる必要があります。
  • モデルの選択: ランダムフォレストは一例です。市場データや取引戦略に応じて、他のモデルを検討することが望ましいです。

このコードは、機械学習を利用して取引のタイミングを最適化する方法を提供しますが、実際の運用ではさらに多くの調整やテストが必要です。

2.ダークプール活用

Yodaka

ダークプールの流動性を利用した売買を行うタイプのbotです。

注意

ダークプールは公開市場と異なり、取引が非表示で行われるため、市場への影響を最小限に抑えつつ大量の注文を実行することが可能です。この特性を利用した取引戦略は、特に大口の機関投資家にとって有益です。ただし、ダークプール取引は公開市場の取引と異なる規制と運用が存在し、一般的にはAPIを通じてダイレクトにアクセスすることは難しいかもしれません。

以下は、ダークプールの流動性を模擬的に利用した売買戦略をPythonで実装する方法の一例です。実際のダークプールのAPIへのアクセス方法や詳細は、各ダークプールの提供者によって異なるため、具体的な実装は提供者のドキュメントに従ってください。

ダミーデータを使用したシミュレーション

import numpy as np
import pandas as pd

# ダークプールでの価格データをシミュレート
np.random.seed(42)
dates = pd.date_range(start="2021-01-01", periods=100)
prices = np.random.normal(100, 0.5, size=100)
volumes = np.random.randint(100, 500, size=100)

dark_pool_data = pd.DataFrame({
    'Date': dates,
    'Price': prices,
    'Volume': volumes
})

# ダークプールの流動性を確認し、取引機会を識別
def analyze_dark_pool_liquidity(data):
    # 高流動性の日(取引量が平均以上)と低価格(価格が中央値以下)を探す
    high_liquidity_days = data[data['Volume'] > data['Volume'].mean()]
    low_price_high_volume = high_liquidity_days[high_liquidity_days['Price'] <= high_liquidity_days['Price'].median()]
    return low_price_high_volume

# 取引機会を識別
trading_opportunities = analyze_dark_pool_liquidity(dark_pool_data)
print("Trading opportunities in the dark pool:")
print(trading_opportunities)

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

  • 規制と法律: ダークプールは特定の規制の下で運用されています。取引前には必ず適切な法律や規制を理解し、遵守してください。
  • 市場の影響: ダークプール取引が市場価格に与える影響は限定的ですが、大規模な取引が市場に知られると価格に影響を与える可能性があります。
  • 情報の非公開性: ダークプールの情報は非公開であるため、市場全体の流動性や価格動向の視点からは見えにくい部分があります。

このコードはダークプール取引の基本的な戦略とシミュレーションを示していますが、実際のダークプール取引には専門的なプラットフォームや内部のネットワーク接続が必要です。また、この戦略の運用にあたっては、専門家の助言や適切なリスク管理戦略が求められます。

3.マルチスプレッド

Yodaka

複数のスプレッドを同時に最適化して売買するタイプのbotです。

マルチスプレッド戦略は、複数の資産のスプレッド(価格差)を同時に最適化し、これを利用して同時に複数のポジションを取ることで利益を得る戦略です。通常、この戦略は裁定取引や相関取引に利用されます。以下のコードは、異なる通貨ペアのスプレッドを分析し、それに基づいて取引を行う例を示しています。

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

import numpy as np
import pandas as pd

ダミーデータの生成

ここでは、異なる通貨ペアの価格データを生成しています。実際の適用には市場データを用いる必要があります。

# ダミーデータ生成
np.random.seed(42)
dates = pd.date_range(start="2021-01-01", periods=100)
prices_a = np.random.normal(100, 1, size=100)  # 通貨ペアAの価格
prices_b = prices_a * np.random.normal(1.02, 0.005, size=100)  # 通貨ペアBの価格
prices_c = prices_a * np.random.normal(0.98, 0.005, size=100)  # 通貨ペアCの価格

data = pd.DataFrame({
    'Pair_A': prices_a,
    'Pair_B': prices_b,
    'Pair_C': prices_c
}, index=dates)

スプレッドの計算と取引シグナルの生成

def calculate_spreads(data):
    # スプレッド計算
    data['Spread_AB'] = data['Pair_A'] - data['Pair_B']
    data['Spread_AC'] = data['Pair_A'] - data['Pair_C']
    return data

def generate_signals(data, threshold=2.0):
    # スプレッドに基づいたシグナル生成
    data['Signal_AB'] = np.where(data['Spread_AB'] > threshold, 'Buy A Sell B', 
                                np.where(data['Spread_AB'] < -threshold, 'Sell A Buy B', 'Hold'))
    data['Signal_AC'] = np.where(data['Spread_AC'] > threshold, 'Buy A Sell C', 
                                np.where(data['Spread_AC'] < -threshold, 'Sell A Buy C', 'Hold'))
    return data

# スプレッド計算とシグナル生成
data = calculate_spreads(data)
signals = generate_signals(data)

print(signals[['Signal_AB', 'Signal_AC']])

取引の実行

実際の取引を行う場合、以下のようなロジックを使用しますが、実際のAPI呼び出しや取引所の条件に応じて調整する必要があります。

def execute_trades(signals):
    for date, row in signals.iterrows():
        if row['Signal_AB'] != 'Hold':
            print(f"{date}: Execute trade on Pair A and Pair B: {row['Signal_AB']}")
        if row['Signal_AC'] != 'Hold':
            print(f"{date}: Execute trade on Pair A and Pair C: {row['Signal_AC']}")

# 取引の実行
execute_trades(signals)

注意点

  • 市場影響と流動性: 複数の資産を同時に取引する場合、市場への影響と流動性の確保が重要です。
  • 取引コスト: 複数の取引を同時に実行することで発生する取引コストも考慮に入れる必要があります。
  • スプレッドの変動: スプレッドは市場条件によって変動するため、リアルタイムでの監視と適応が必要です。

このコードはマルチスプレッド戦略の基本的なフレームワークを提供していますが、実際の市場環境での使用にはさらに詳細なテストと調整が必要です。

4.取引所間アービトラージ

Yodaka

同一通貨ペアの取引所間の価格差を利用するタイプのbotです。

取引所間アービトラージは、同一通貨ペアの異なる取引所間での価格差を利用して利益を得る戦略です。以下のPythonコードは、二つの取引所で同じ通貨ペアの価格を監視し、価格差が特定の閾値を超えた場合にアービトラージ取引を実行する例を示します。

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

import ccxt
import time

取引所の設定と初期化

# 二つの異なる取引所のAPIキーとシークレットキーを設定する
binance = ccxt.binance({
    'apiKey': 'YOUR_BINANCE_API_KEY',
    'secret': 'YOUR_BINANCE_SECRET_KEY'
})

kraken = ccxt.kraken({
    'apiKey': 'YOUR_KRAKEN_API_KEY',
    'secret': 'YOUR_KRAKEN_SECRET_KEY'
})

symbol = 'BTC/USD'  # 取引する通貨ペア
threshold = 50  # アービトラージ取引を開始する価格差の閾値
amount = 0.01  # 取引するビットコインの量

アービトラージ取引のロジック

def arbitrage_opportunity(exchange1, exchange2, symbol, threshold, amount):
    """
    二つの取引所間で価格を比較し、指定された閾値を超える価格差があれば取引を行う
    """
    # 各取引所から価格情報を取得
    ticker1 = exchange1.fetch_ticker(symbol)
    ticker2 = exchange2.fetch_ticker(symbol)

    sell_price = ticker1['ask']  # 例えばBinanceで売る
    buy_price = ticker2['bid']   # 例えばKrakenで買う

    # 価格差を計算
    price_diff = sell_price - buy_price

    # 価格差が閾値以上なら取引を実行
    if price_diff > threshold:
        print(f"Arbitrage opportunity! Buy on {exchange2.id} at ${buy_price} and sell on {exchange1.id} at ${sell_price}")
        # 実際に取引を行う場合
        # exchange2.create_limit_buy_order(symbol, amount, buy_price)
        # exchange1.create_limit_sell_order(symbol, amount, sell_price)
    else:
        print(f"No arbitrage opportunity. Price difference is ${price_diff}, threshold is ${threshold}")

def main():
    while True:
        arbitrage_opportunity(binance, kraken, symbol, threshold, amount)
        time.sleep(10)  # チェック間隔(秒)

if __name__ == '__main__':
    main()

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

  • APIレートリミット: 各取引所のAPIレートリミットに注意してください。頻繁なリクエストによってAPIがブロックされないように適切な間隔でリクエストを送信します。
  • 取引手数料とスリッページ: 実際の利益を計算する際には、取引手数料とスリッページを考慮に入れる必要があります。これらが利益を食いつぶさないようにします。
  • 資金の移動: 異なる取引所間での資金移動には時間とコストがかかる場合があります。特に大量の資金を移動させる際には注意が必要です。

このコードは取引所間アービトラージの基本的なフレームワークを提供していますが、実際の運用にはさらに多くの調整やリスク管理が必要です。

5.マーケットデータ解析の高度化

Yodaka

オルタナティブデータ等を活用した高度な解析を行うタイプのbotです。

マーケットデータ解析の高度化には、オルタナティブデータの活用が非常に効果的です。オルタナティブデータとは、従来の金融データ(株価、財務報告書など)以外の情報で、ソーシャルメディアの感情分析、衛星画像、消費者取引データなどが含まれます。これらのデータを用いて、市場の動向や投資機会をより深く理解することができます。

以下は、ソーシャルメディアデータを活用して市場の感情を分析し、その情報を基に取引戦略を構築するPythonのコード例です。

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

import pandas as pd
import numpy as np
from textblob import TextBlob  # ソーシャルメディアのテキスト感情分析用
import matplotlib.pyplot as plt

ソーシャルメディアデータのシミュレーション

実際のアプリケーションでは、Twitter(X) APIなどから取得したデータを使用します。

# ダミーデータの生成
data = {
    'date': pd.date_range(start="2021-01-01", periods=100, freq='D'),
    'tweets': [
        "I love this stock so much!",
        "This stock is terrible, worst investment ever",
        "Market is doing great",
        "This new product is going to boost the stock market",
        "I am not sure about the market direction",
        "Investing in this stock was a huge mistake",
        "This is a solid stock",
        "The market is unpredictable",
        "That's a fantastic stock",
        "Market crash coming soon"  # ダミーテキスト, 実際にはTwitter APIから取得する
    ] * 10
}
df = pd.DataFrame(data)

テキストデータからの感情分析

def analyze_sentiment(text):
    # TextBlobを使用してテキストの感情を分析
    return TextBlob(text).sentiment.polarity  # -1(ネガティブ)から1(ポジティブ)

# ツイートの感情スコアを計算
df['sentiment'] = df['tweets'].apply(analyze_sentiment)

感情スコアの集計と市場戦略の決定

# 日付ごとに感情スコアを平均化
sentiment_daily_avg = df.groupby('date')['sentiment'].mean()

# 感情スコアに基づいて取引シグナルを生成(例: ポジティブな感情がある日に購入)
df['signal'] = np.where(sentiment_daily_avg > 0.1, 'Buy', 'Sell')

# 結果の表示
print(df[['date', 'tweets', 'sentiment', 'signal']].head())

# 感情スコアの視覚化
plt.figure(figsize=(10, 5))
plt.plot(sentiment_daily_avg, label='Daily Sentiment Average')
plt.axhline(y=0.1, color='r', linestyle='--', label='Buy Threshold')
plt.axhline(y=-0.1, color='b', linestyle='--', label='Sell Threshold')
plt.legend()
plt.title('Market Sentiment Analysis')
plt.xlabel('Date')
plt.ylabel('Sentiment Score')
plt.show()

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

  1. データの信頼性: オルタナティブデータの信頼性と関連性が戦略の効果を大きく左右します。
  2. API制限: リアルタイムでデータを取得する場合、APIの利用制限に注意する必要があります。
  3. 法的制約: データの収集と使用にはプライバシーや著作権の問題が関連することがあります。
  4. データ処理能力: 大量のデータをリアルタイムに処理するためには、適切な技術基盤と処理能力が必要です。

まとめ

今回も5種類の発展的なロジックの雛形をまとめました。

複数のロジックの組み合わせで有効に機能するbot作りを試すことが大切です。

アイデアをコードに落とし込む過程自体も楽しいですね。

Yodaka

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

-Bot, トレードロジック