前回の記事に引き続き、今回も仮想通貨botの開発状況をまとめていきます。
「備忘録がてら、ほぼリアルタイムで格闘した内容をまとめました。
これから 自作ボットをいじる人の参考になれば嬉しいです。」
本日のゴール
- 約定 DB (
trades
) とログを自動でマージして可視化するスクリプトを完成させる - mainnet/testnet を
.env
切替と Docker プロファイルで即座に起動できるよう構成を整理する
結果から言うと ❶ は達成、❷ は 9 割完了(testnet の自動切替は次回) でした。
1. 解析スクリプト analyze_pnl_vs_log.py
の完成
見どころ | 実装ポイント |
---|---|
DB → PnL 計算 | trades テーブルを 2 行ずつ(Buy→Sell)ペアにして Cycle PnL & 累積 PnL を算出 |
ログ自動マッチング | logs/ と logs_archive/ を再帰検索し、DB の日付と最も近い mm_bot_YYYYMMDD_HHMMSS.log(.zip) を選択└ zip 内はメモリ展開&TextIOWrapper でそのままパース |
タイムゾーン対応 | CLI --tz Asia/Tokyo で JST ⇄ UTC を自由変換(pytz +localize ) |
可視化 | 1. Spread vs Cycle PnL 散布図 2. 累積 PnL 折れ線 |
統計出力 | - 日次 / 時間帯別 PnL 集計 - 勝率・最大 DD - 時間帯フィルタ後の再計測までワンコマンド |
ファイル保存 | - PNG 2 枚 (spread_vs_pnl.png , cum_pnl.png )- CSV 出力も既存スクリプト互換で継続 |
# 使い方(例) python analyze_pnl_vs_log.py \ --db mmtrades_mainnet.db \ --log logs_archive/mm_bot_20250514_061954.log \ --tz Asia/Tokyo
出力イメージ↓
=== PnLとログのマージ結果(直近5件) === ┌─────────────────────┬───────────┬────────┬─────────┐ │ datetime │ cycle_pnl │ spread │ notional│ ├─────────────────────┼───────────┼────────┼─────────┤ │ 2025-05-14 13:18:49 │ 0.0016 │ NaN │ NaN │ └─────────────────────┴───────────┴────────┴─────────┘ ✅ spread_vs_pnl.png / cum_pnl.png を保存 ✅ 勝率 81.97 % / 最大DD -1.66 USDT
2. Bot 環境まわりの整備
2-1. .env
で mainnet / testnet を切り替え
# .env.prod MMBOT_MODE=mainnet # 本番 ⋯ # .env.test MMBOT_MODE=testnet # 検証 BYBIT_KEY_TEST=xxxxx BYBIT_SECRET_TEST=yyyyy SYMBOL=BTCUSDT LOT=0.005 MAX_NOTIONAL_USD=400 ⋯
2-2. config_testnet.tpl
→ config_testnet.json
を envsubst で生成
テンプレ側を 数値はインライン展開 に修正したのがポイント👇
"bot": { "max_notional": ${MAX_NOTIONAL_USD}, // ← 文字列化しない! "lot": ${LOT}, ⋯ }
コマンド:
export $(grep -Ev '^\s*#' .env.test | xargs) envsubst < config_testnet.tpl > config_testnet.json
2-3. Docker プロファイル運用
# testnet で起動 docker compose --profile testnet up -d # mainnet に戻す docker compose stop mmbot docker compose --profile mainnet up -d
本日は mainnet でスプレッド閾値が厳しすぎ → 約定ゼロ を確認
→ testnet へスイッチしてパラメータ緩和 を次回タスクに設定。
3. 明日の TODO
- testnet を低スプレッド・小 LOT で回して約定を発生させる
MMBOT_MODE
が Docker profile に追従するよう Entrypoint を微修正- 解析スクリプトで Spread & PnL の相関を本番データで検証
- Slack WARN / STOP 通知の実地テスト
- (時間があれば)Cursor からのパラメータ Live 書換え機構を PoC
さいごに
- 解析スクリプト完成 で “ボットが何をしているのか” を即座に可視化できるようになった
- 環境切替がシェル 1 行 で済むので、検証→本番のハードルが激減
- 明日は 実際の約定データ取り と リスクガード (DD) の動作確認 に進みます
「やっとスタートラインに立った感…!
引き続き改善していくので、同じくアルゴを育ててる方もお楽しみに! ✌️」