前回の記事に引き続き、今回も仮想通貨botの開発状況をまとめていきます。
本記事では「暗号通貨のパンプ&ダンプスキームの検出」に関する論文をベースにbot開発の過程をまとめていきます。
Detecting Crypto Pump-and-Dump Schemes: A Thresholding-Based Approach to Handling Market Noisehttps://t.co/ctCJEV1MBs
— よだか(夜鷹/yodaka) (@yodakablog) March 22, 2025
パフォーマンス評価とパラメータ調整
次のステップでは、バックテストの結果を分析し、最適なパラメータを見つけるための評価システムを構築します。
具体的には、以下の内容を実装します:
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. 機能のポイント
✅ 自動パラメータ最適化:scipy
のminimize()
を活用し、シャープレシオを最大化
✅ 複数の評価指標:PnL、勝率、ドローダウン、シャープレシオを併用
✅ 柔軟なパラメータ範囲設定:リスクとリターンのバランス調整が可能
✅ 再評価シミュレーション:最適化されたパラメータで再度バックテストを実行
6. 次のステップ
次は、リアルタイム運用時の監視システム設計を行います。具体的には、以下の機能を実装予定です。
✅ リアルタイム価格監視
✅ P&Dイベントの即時通知 (Slack / Telegram 連携)
✅ トレード状況のダッシュボード可視化

次回の記事では、リアルタイム監視システムを構築と実装についてまとめます。
-
-
開発記録#146(2025/3/25)「論文ベースのbot開発フローpart.8」
続きを見る