Bot

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

2025年3月25日

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

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

パフォーマンス評価とパラメータ調整

次のステップでは、バックテストの結果を分析し、最適なパラメータを見つけるための評価システムを構築します。
具体的には、以下の内容を実装します:


1. 評価とパラメータ調整のアプローチ

🔎 評価指標の選定

以下の評価指標を基に、最適な取引戦略のパラメータを調整します。

勝率 (Win Rate):全トレードのうち、勝ちトレードの割合
損益 (PnL: Profit and Loss):最終的な利益と損失
最大ドローダウン (Max Drawdown):過去最高残高からの最大下落率
リスク・リワード比率 (Risk-Reward Ratio):1回のトレードでのリスクと利益のバランス
シャープレシオ (Sharpe Ratio):リスク調整後のリターン評価


⚙️ パラメータの最適化対象

以下の3つのパラメータを最適化します。

STOP_LOSS_PERCENT (損切り幅)
TAKE_PROFIT_PERCENT (利益確定幅)
TRADE_AMOUNT (1回のトレード額)


2. コード実装 (parameter_optimizer.py)

import pandas as pd
import numpy as np
from scipy.optimize import minimize
import matplotlib.pyplot as plt
from backtest_engine import backtest, evaluate_performance, load_data  # 既存のバックテスト関数を活用

# ==============================
# 評価指標の定義
# ==============================
def calculate_sharpe_ratio(pnl_series, risk_free_rate=0.01):
    daily_return = pnl_series.pct_change().dropna()
    excess_return = daily_return - risk_free_rate / 252
    sharpe_ratio = np.mean(excess_return) / np.std(excess_return)
    return sharpe_ratio

# ==============================
# 最適化関数
# ==============================
def optimize_parameters(df, pnd_events):
    def objective(params):
        stop_loss, take_profit, trade_amount = params
        trades_df, final_balance = backtest(df, pnd_events, 
                                            stop_loss=stop_loss, 
                                            take_profit=take_profit, 
                                            trade_amount=trade_amount)
        
        # シャープレシオを最大化
        sharpe_ratio = calculate_sharpe_ratio(trades_df['PnL'].cumsum())
        return -sharpe_ratio  # minimize()を使用するため符号を反転

    # パラメータの初期値と範囲
    initial_params = [0.03, 0.05, 100]  # [STOP_LOSS, TAKE_PROFIT, TRADE_AMOUNT]
    bounds = [(0.01, 0.1), (0.03, 0.1), (50, 500)]

    result = minimize(objective, initial_params, bounds=bounds, method='L-BFGS-B')

    return result.x  # 最適なパラメータを返却

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

    # 最適化
    best_params = optimize_parameters(df, pnd_events)
    stop_loss, take_profit, trade_amount = best_params

    print("\n=== 最適パラメータ ===")
    print(f"損切り (STOP LOSS): {stop_loss:.2%}")
    print(f"利益確定 (TAKE PROFIT): {take_profit:.2%}")
    print(f"1回のトレード額 (TRADE AMOUNT): ${trade_amount:.2f}")

    # 最適パラメータでの再評価
    trades_df, final_balance = backtest(df, pnd_events,
                                        stop_loss=stop_loss,
                                        take_profit=take_profit,
                                        trade_amount=trade_amount)
    
    evaluate_performance(trades_df, 10000)  # 初期残高 = 10000ドル

if __name__ == "__main__":
    main()

3. 実行方法

1.scipyのインストール

pip install scipy

2.スクリプトの実行

python parameter_optimizer.py

4. 出力結果の例

=== 最適パラメータ ===
損切り (STOP LOSS): 4.20%
利益確定 (TAKE PROFIT): 6.80%
1回のトレード額 (TRADE AMOUNT): $150.00

=== バックテスト結果 ===
総トレード数: 30
勝率: 65.00%
最終残高: $12800.00
最大ドローダウン: 6.00%
総損益 (PnL): $2800.00

5. 機能のポイント

自動パラメータ最適化scipyminimize()を活用し、シャープレシオを最大化
複数の評価指標:PnL、勝率、ドローダウン、シャープレシオを併用
柔軟なパラメータ範囲設定:リスクとリターンのバランス調整が可能
再評価シミュレーション:最適化されたパラメータで再度バックテストを実行


6. 次のステップ

次は、リアルタイム運用時の監視システム設計を行います。具体的には、以下の機能を実装予定です。

リアルタイム価格監視
P&Dイベントの即時通知 (Slack / Telegram 連携)
トレード状況のダッシュボード可視化

Yodaka

次回の記事では、リアルタイム監視システムを構築と実装についてまとめます。

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

続きを見る

-Bot