Bot

開発記録#143(2025/3/25)「論文ベースのbot開発フローpart.5」

2025年3月25日

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

本記事では「暗号通貨のパンプ&ダンプスキームの検出」に関する論文をベースにbot開発の過程をまとめていきます。

🚀 取引執行ロジックの実装

次のステップとして、P&Dイベント検出後に自動でトレードを実行する取引執行ロジックを設計・実装します。


1. 取引戦略の方針

📋 取引方針

本システムでは、2つのモードでの取引を実装します。

リスク回避モード(デフォルト)

  • P&Dイベント検出時に保有ポジションの自動クローズ
  • 直後の市場の急変動リスクを回避

逆張りモード(オプション)

  • P&Dイベント検出後に、価格のリバウンドを狙って自動エントリー
  • ダンプ後の価格回復を利用して利益を狙う

2. 実装方針

🔎 Bybit API を活用した取引処理

  • ccxtライブラリを使用してBybit APIと連携し、次の機能を実装します。
    • ポジション確認
    • ポジションのクローズ
    • 逆張りエントリー
    • 損切り (Stop Loss) / 利益確定 (Take Profit)

3. コード実装 (trade_executor.py)

import ccxt
import pandas as pd
import json
from datetime import datetime

# 設定ファイルの読み込み
with open("config.json", "r") as file:
    config = json.load(file)

API_KEY = config["bybit_api_key"]
API_SECRET = config["bybit_api_secret"]

# Bybit API認証
exchange = ccxt.bybit({
    'apiKey': API_KEY,
    'secret': API_SECRET,
    'enableRateLimit': True
})

# 取引設定
RISK_AVOIDANCE_MODE = True  # デフォルトはリスク回避モード
REVERSE_TRADE_MODE = False  # 逆張りモードはオプション
STOP_LOSS_PERCENT = 0.03    # 3%の損切りライン
TAKE_PROFIT_PERCENT = 0.05  # 5%の利益確定ライン

# ポジション確認
def get_position(symbol):
    positions = exchange.fetch_positions()
    for position in positions:
        if position['symbol'] == symbol:
            return position
    return None

# ポジションのクローズ
def close_position(symbol):
    position = get_position(symbol)
    if position:
        exchange.create_order(symbol, 'market', 'sell', position['size'])
        print(f"✅ Position closed for {symbol}")

# 逆張りエントリー (Buy)
def place_reverse_trade(symbol, entry_price):
    # エントリー価格、損切り、利益確定の計算
    stop_loss_price = entry_price * (1 - STOP_LOSS_PERCENT)
    take_profit_price = entry_price * (1 + TAKE_PROFIT_PERCENT)

    # 成行注文の実行
    exchange.create_order(symbol, 'market', 'buy', 0.01)
    print(f"📈 Reverse trade executed for {symbol}")

    # 損切り注文の設定
    exchange.create_order(symbol, 'stop', 'sell', 0.01, stop_loss_price)
    print(f"⛔ Stop loss set at {stop_loss_price}")

    # 利益確定注文の設定
    exchange.create_order(symbol, 'limit', 'sell', 0.01, take_profit_price)
    print(f"🎯 Take profit set at {take_profit_price}")

# P&Dイベントに応じたアクション
def handle_pnd_event(row):
    symbol = row['symbol']
    pump_price = row['pump_price']
    
    if RISK_AVOIDANCE_MODE:
        close_position(symbol)

    if REVERSE_TRADE_MODE:
        place_reverse_trade(symbol, pump_price)

# メイン処理
def main():
    pnd_events = pd.read_csv('./data/pnd_events.csv')

    for _, row in pnd_events.iterrows():
        print(f"🚨 Handling P&D event for {row['symbol']} at {row['timestamp']}")
        handle_pnd_event(row)

if __name__ == "__main__":
    main()

Yodaka

このコードは、仮想通貨の取引を自動化するプログラムで、特に価格急騰(Pump and Dump、以下P&D)イベントに対応しています。それでは、コードの各部分を解説していきますね。

まず、外部ライブラリccxtを使って仮想通貨取引所との接続を行います。pandasはデータ処理に、jsonは設定ファイルの読み込みに使用されています。

設定ファイルの読み込み

プログラムの始めにconfig.jsonという設定ファイルを開いて、そこに保存されているBybitのAPIキーとシークレットを読み込みます。これにより、後のAPI認証に必要な情報を取得します。

Bybit API認証

ccxtライブラリを使用して、取得したAPIキーとシークレットを使いBybitとの接続を確立します。この時、リクエストの頻度制限を有効にすることでAPIの規約に適合させています。

取引設定

取引のパラメータを設定します。リスク回避モードや逆張りモードの有効/無効、損切りや利益確定のパーセンテージなどを定義しています。

ポジションの取得とクローズ

get_position関数は指定した通貨ペアの現在のポジション(保持している仮想通貨の量や状態)を取得します。close_position関数はそのポジションを市場価格で売却して、ポジションを閉じます。

逆張りトレードの実行

place_reverse_trade関数では、指定した通貨ペアに対して逆張りのポジションを入れます。これには、エントリー価格としてパンプ時の価格を基に、損切りと利益確定の価格を計算して注文を出します。

P&Dイベントの処理

handle_pnd_event関数では、P&Dイベント発生時の行動を定義しています。リスク回避モードがオンの場合はポジションを閉じ、逆張りモードがオンの場合は逆張りトレードを行います。

メイン処理

main関数では、P&Dイベントのデータが保存されているCSVファイルを読み込み、各イベントに対してhandle_pnd_event関数を呼び出して対応します。これにより、イベントごとに適切な取引アクションが自動で実行されます。

以上のように、このプログラムは自動で仮想通貨の取引を行い、P&Dイベントに柔軟に対応できるように設計されています。それぞれの関数が独立しているため、修正や拡張もしやすくなっています。

4. 実行方法

  1. ccxtのインストール
pip install ccxt
  1. APIキーの登録
  • config.jsonに以下の情報を追加
{
    "bybit_api_key": "YOUR_BYBIT_API_KEY",
    "bybit_api_secret": "YOUR_BYBIT_API_SECRET"
}

3.スクリプトの実行

python trade_executor.py

5. 動作の流れ

P&Dイベントの確認 → 自動でポジションのクローズ or 逆張りエントリー
✅ 逆張りモードでは、損切り (Stop Loss)利益確定 (Take Profit) の両方を自動設定
✅ エラーハンドリングにより、API通信エラーや注文失敗時の再試行も考慮


6. テスト戦略

  • バックテスト:過去のP&Dイベントデータを使用し、取引執行のシミュレーション
  • パラメータ調整:損切り幅、利益確定幅の最適化
  • データ分析:P&Dイベント後の価格推移を分析し、より高精度なエントリーポイントの特定

7. 懸念点

このプログラムは一見すると非常に効率的に見えますが、いくつかの懸念点があります。これらをしっかり理解しておくことで、より堅牢な自動取引システムを構築するための手助けになりますよ。

1. エラーハンドリングが不足している

このコードではAPIからの応答が失敗した場合や、想定外のデータが返された場合のエラーハンドリングが見当たりません。仮想通貨市場は非常に変動が激しく、APIが一時的に利用不可になることもあり得ます。そのため、API呼び出しの各ステップで適切なエラーチェックと例外処理を行うことが非常に重要です。

2. 市場の影響を受けやすい

プログラムが市場価格で注文を出しているため、大量の注文が市場に投じられると価格に大きな影響を与える可能性があります。特に小さな取引所や流動性の低い通貨ペアでは、自分の注文が価格を動かす原因となり得ます。より慎重な注文戦略を検討する価値があります。

3. セキュリティ対策の懸念

APIキーやシークレットがコードにハードコードされているわけではなく、外部の設定ファイルから読み込まれていますが、この設定ファイルのセキュリティが非常に重要です。不正アクセスによってこれらの情報が漏洩すると、大きな金銭的損失につながる恐れがあります。

4. パフォーマンスの最適化

現在のコードでは、すべてのP&Dイベントが逐次的に処理されています。市場は非常に速いスピードで動いているため、イベント処理に遅延が生じると、その間に市場状況が大きく変わってしまう可能性があります。並列処理や非同期処理の導入を検討して、レスポンス時間を短縮することが推奨されます。

5. ハードコードされたパラメータ

リスク設定や取引量など、多くのパラメータがコード内にハードコードされています。これらは実際の取引状況に応じて柔軟に変更できるように、外部から設定できる仕組みを作ることが望ましいです。これにより、市場の変動に迅速に対応しやすくなります。

以上の点を考慮し、改善することで、この自動取引プログラムの安全性と効率性をさらに高めることができるでしょう。

8. 今後の改善点

  1. 🚨 リスク管理の高度化
    • ATR (Average True Range) を用いた動的な損切り設定
  2. 🔍 P&D予測モデルの追加
    • 機械学習 (LSTM / DQN) による将来のP&Dイベント予測
  3. 📈 市場センチメント分析
    • SNSデータやニュースデータの活用によるリアルタイム予測の導入

9. 次のステップ

  • 🔍 バックテスト環境の構築
  • 📊 パフォーマンス評価とパラメータ調整
  • 🚨 リアルタイム運用時の監視システム設計
Yodaka

次のステップとして、バックテスト環境の構築に取り組みます。具体的には、以下の内容で進める予定です。

🚀 バックテスト環境の設計

データ読み込み:収集した過去データを用いて、シミュレーション用データセットを作成
シミュレーションエンジン

  • 仮想取引環境でP&Dイベント検出モデルを実行し、取引エントリーポイントと結果をシミュレーション
    評価指標の設計
  • 損益 (PnL)、勝率、最大ドローダウン、シャープレシオなどの評価指標を用いて検証
    結果の可視化
  • MatplotlibやPlotlyを活用して、バックテスト結果のグラフ化
Yodaka

次の記事では、バックテストシステムの実装についてまとめます。

関連
開発記録#144(2025/3/25)「論文ベースのbot開発フローpart.6」

続きを見る

-Bot