Bot

開発記録#168(2025/4/3)「論文ベースのbot開発フローpart.30 Bot運用の自動化と統合」

2025年4月3日

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

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

以下に、自動デプロイ化 / ダッシュボード連携 / 複数戦略統合のための方法を、順に詳しく説明します。


🚀 ① 自動デプロイ化

🔧 方法1:HelmチャートによるBotの一括デプロイ

📁 Helm構成例

helm-bot-chart/
├── templates/
│   ├── deployment.yaml
│   └── configmap.yaml
├── values.yaml

values.yaml(複数通貨ペア定義)

bots:
  - pair: btcusdt
    strategy: breakout
  - pair: ethusdt
    strategy: ml

image:
  repository: yourdocker/crypto-bot
  tag: latest

✅ テンプレート(templates/deployment.yaml

{{- range .Values.bots }}
apiVersion: apps/v1
kind: Deployment
metadata:
  name: bot-{{ .pair }}
spec:
  replicas: 1
  template:
    spec:
      containers:
      - name: bot
        image: "{{ $.Values.image.repository }}:{{ $.Values.image.tag }}"
        args: ["bots/{{ .pair }}/config.yaml"]
        env:
        - name: STRATEGY
          value: "{{ .strategy }}"
{{- end }}

✅ インストール手順

helm install crypto-bots ./helm-bot-chart

→ 新しいペアを追加したら values.yaml に1行追加するだけ!


📊 ② ダッシュボード連携(Prometheus + Grafana)

✅ 必要な構成

  • Prometheus:Botのメトリクスを収集
  • Grafana:可視化(勝率/PnL/エラー数など)
  • Pushgateway:Bot側からメトリクスを手動Push

📤 Prometheusメトリクス送信コード例(Python)

import requests

def push_metrics(pair, pnl, trades):
    data = f"""
# TYPE bot_pnl gauge
bot_pnl{{pair="{pair}"}} {pnl}
# TYPE bot_trades gauge
bot_trades{{pair="{pair}"}} {trades}
"""
    requests.post("http://prometheus-push:9091/metrics/job/crypto_bot", data=data)

📈 Grafanaでのダッシュボード項目例

  • bot_pnl{pair="btcusdt"}
  • rate(bot_trades[1h])
  • kube_pod_container_status_restarts_total

🧠 ③ 複数戦略の統合管理

✅ 戦略選択ロジック(例)

def select_strategy(name):
    if name == "breakout":
        from strategies.breakout import breakout_signal
        return breakout_signal
    elif name == "ml":
        from strategies.ml import ml_predict_signal
        return ml_predict_signal

config.yaml に戦略名を記載し、Botごとに切り替え可能。

symbol: ETHUSDT
strategy: ml

→ 複数Botが同時に異なる戦略を実行可能!


✨ 発展的な構成(全体イメージ)

+---------------------+        +-------------------+
|  BTC Bot (breakout) | --->   |  Pushgateway       |
+---------------------+        +-------------------+
                                   ↓
                          +------------------+
                          |   Prometheus     |
                          +--------+---------+
                                   ↓
                          +------------------+
                          |     Grafana      |
                          +------------------+

✅ 次のステップ候補

フェーズ内容
🔧 Helmの雛形を生成各Botをchart化して一括展開
📈 Grafanaパネルテンプレート作成ペア別勝率・P&Lダッシュボード
🤖 複数戦略を1つのBotで自動切替市況変化に応じてML or ブレイクアウト選択

今後は

  • 🎁 Helmチャート雛形
  • 📊 GrafanaダッシュボードJSONテンプレート
  • 🧠 複数戦略の自動切替ロジック

などのアプローチが考えられます。

Yodaka

このシリーズも30回目となり、キリが良いので一旦ここまでにします。今後も追加・検証等を重ねながら更新していきます。

アーキテクチャ全体像(構成図的イメージ)

📁 Git Repository
├── helm-bot-chart/
│   ├── templates/                 ← Deploymentテンプレート(Bot本体)
│   └── values.yaml               ← ペア/戦略設定一覧(例: BTCUSDT×breakout)
├── bots/
│   ├── btcusdt/                  ← 通貨ペアごとの設定フォルダ
│   │   └── config.yaml           ← 戦略名などBot個別設定
│   └── ethusdt/
│       └── config.yaml
├── strategies/                   ← 戦略別シグナル生成コード
│   ├── breakout.py
│   ├── ml.py
│   └── __init__.py
├── core/                         ← 共通ロジック
│   ├── executor.py               ← シグナルに基づいて発注する
│   ├── detector.py               ← P&D検出など戦略外ロジック
│   ├── scheduler.py              ← 時間帯・モード制御(main/test)
│   └── utils/
├── run_loop.sh                   ← 起動スクリプト
└── Makefile                      ← 開発・テスト切替用ワンコマンド

⬇︎
🔄 Kubernetes クラスタ(1通貨ペア=1Pod)
    ├── Bot Pod 1(BTCUSDT: breakout)
    ├── Bot Pod 2(ETHUSDT: ml)
    └── ...(各設定に応じて自動展開)

⬇︎
📡 メトリクス送信(Pushgateway経由)
    └── Prometheus ← メトリクス収集
        └── Grafana ← ダッシュボードで可視化
              ├── pnlグラフ
              ├── 取引頻度グラフ
              └── 異常再起動アラートなど

⬇︎
🔔 Slack通知
    ├── エラー発生/異常系リトライ失敗
    ├── 運用開始・停止ログ
    └── 手動検知リマインド

⬇︎
🪪 Secrets管理(APIキー)
    ├── dev: `.env.test`(ローカル用/.gitignore済)
    ├── prod: `.env.prod`(本番用)
    └── K8s Secret(本番運用時にマウント or 環境変数)

⬇︎
💾 ログ・モデル保存
    ├── SQLite: `trades.db` にfill記録
    ├── logs/: Loguruで日別保存
    └── S3: 定期バックアップ(monitor.py + cron)

関連
🛠️開発記録#230(2025/5/14)トレードロジック以外の部分🏁セクション9:この構成で何が得られたか、そして次に進むために

続きを見る

👇ラジオで話したこと

開発記録#168|Bot開発フローpart.30「自動デプロイ × ダッシュボード連携 × 戦略統合」

こんにちは、よだかです。
このラジオシリーズ「Bot開発フロー」もついに第30回、今回でひと区切りとなります。

最終回のテーマは、
**「Bot運用の自動化と統合」**です。

今日は、以下の3つをわかりやすく解説していきます:

  • ① Botの自動デプロイ化(Helmチャート)
  • ダッシュボード連携(Prometheus + Grafana)
  • 複数戦略の統合と切替え

① HelmチャートによるBotの自動デプロイ

まずは「Helm(ヘルム)」です。

これは、Kubernetes環境でBotを簡単に・一括で・繰り返し展開するためのツールです。
Docker Compose の Kubernetes版パッケージマネージャと考えるとイメージしやすいです。


🛠️ Helmチャートの構成

helm-bot-chart/
├── templates/
│   ├── deployment.yaml
│   └── configmap.yaml
└── values.yaml
  • templates/ に「Botの設計図」
  • values.yaml に「使いたい通貨ペアや戦略の一覧」を書きます。

例:

bots:
  - pair: btcusdt
    strategy: breakout
  - pair: ethusdt
    strategy: ml

この値をもとに、自動でペアごとのBotがKubernetesに展開されます。


🚀 デプロイはたった1行

helm install crypto-bots ./helm-bot-chart

新しいペアを追加したいときは、values.yamlに1行追加するだけ。
コピー&ペーストの手間はもうありません。


② Prometheus + Grafana で可視化

次に「Botの見える化」です。


🔍 なぜ必要か?

Botが正しく動いているか、損益は出ているか、トレード数はどうか…
感覚や勘ではなく、数字で見るための仕組みが必要になります。


🧰 構成はこの3つ:

  • Prometheus:データを収集する側
  • Pushgateway:BotからPrometheusに値を届ける中継所
  • Grafana:グラフやパネルで可視化するツール

💡 Pythonからメトリクス送信(例)

def push_metrics(pair, pnl, trades):
    data = f'''
bot_pnl{{pair="{pair}"}} {pnl}
bot_trades{{pair="{pair}"}} {trades}
'''
    requests.post("http://prometheus-push:9091/metrics/job/crypto_bot", data=data)

このコードをBotのループの中に入れるだけで、 損益やトレード数のグラフがリアルタイムで反映されるようになります。


📊 Grafanaパネル例:

  • bot_pnl{pair="btcusdt"}:ペアごとの損益
  • rate(bot_trades[1h]):1時間あたりのトレード数
  • kube_pod_container_status_restarts_total:再起動回数の監視

数字が目に見えることで、異常もすぐに発見できます。


③ 複数戦略の統合管理

最後は「Botの戦略切替え」です。


🧠 何をやっているのか?

Botごとに戦略を個別に切り替える仕組みを作っておくと、
1つのコードベースで複数戦略を同時に運用できます。


🔁 実装例(Python)

def select_strategy(name):
    if name == "breakout":
        from strategies.breakout import breakout_signal
        return breakout_signal
    elif name == "ml":
        from strategies.ml import ml_predict_signal
        return ml_predict_signal
  • config.yamlstrategy: ml などと書いておけば、
    起動時にBotがそれに応じた戦略ロジックを自動選択します。

✨ 応用:自動切り替えも視野に

たとえば、

  • 市場のボラティリティが低いとき → 機械学習戦略
  • 急変動しているとき → ブレイクアウト戦略

といったように、Bot自身が戦略を切り替える仕組みも組めます。


⏱️ 運用の次フェーズに向けて

ここまでできれば、個人でも「1人DevOpsチーム」が組める状態です。


✅ これから取り組める拡張案

項目内容
Helmテンプレの再利用通貨ペアを増やしてBotの量産へ
Grafanaのダッシュボード拡張ペア別、戦略別の分析パネルをつくる
複数戦略の自動切替市況ベースで戦略をスイッチング

シリーズを振り返って

ここまでお付き合いいただき、ありがとうございました。
このシリーズは「Botを作りたいけど、どこから手をつけたらいいか分からない」というところからスタートしました。

振り返ると、

  • 論文ベースのP&D検出から始まり
  • .envとMakefileで環境を整備し
  • Kubernetesに載せて運用の自動化へ

一つ一つ、積み上げてきたものが今、ようやく“完成形の手前”にたどり着いた感じです。


これで終わり…ではなく、
ここからは“運用しながら磨いていくフェーズ”に入ります。
Botは、育てるものです。


これまで聞いてくださった皆さん、本当にありがとうございました。
この開発ログシリーズは一旦これで終了しますが、
今後も追加検証やアップデートがあれば、ブログやXでお知らせしていきます。

それでは──
良き開発と、確かな運用を。
よだかでした。

おまけ1:「なぜPushgatewayが必要なのか?」

Prometheusは“Pull型”(定期巡回)なのに、Botは“Pushしたい”から。


🧠 Prometheusの原則:Pull型メトリクス収集

  • Prometheusは基本的に 対象アプリケーションに定期的にアクセスして、
    http://your-app:port/metrics というエンドポイントから**自分で値を取りに行く(Pull)**設計になっています。

⛔ でも、Botのようなアプリはこれに向いていない

理由なぜPullが合わないか?
⏱️ 短命Botが一瞬で起動&終了することがある ⇒ Prometheusが取りに行く前に消えてる
⛳ 居場所が不定複数のPodにまたがっていて名前やポートが動的に変わることがある
🧭 自分のタイミングで出したい取引があった瞬間に「今!」と送りたいのに、Prometheusの巡回待ちがストレスになる

📨 そこで登場:Pushgateway

Pushgatewayの役割ざっくり例えると
一時的な中継所Prometheusが来るまでの“荷物置き場”
Botが POST で直接メトリクスを投げる先「今これ出たよ」と即報告できる
Prometheusがそこから定期的に値をPullBotが消えてもメトリクスは残るので安心

🔁 処理の流れ(例)

  1. Botがトレードしたらすぐにpush_metrics()でPushgatewayに値をPOST
  2. Pushgatewayはそのデータを保持しつづける(消えない)
  3. Prometheusが1分おきなどでPushgatewayを見に来てPull
  4. Grafanaでリアルタイム可視化

✅ まとめ:Pushgatewayは「Pullが難しいアプリの橋渡し役」

Botの性質Pushgatewayの強み
ランダムな起動/停止メトリクス保持が保証される
自分のタイミングで送りたい即座にPOSTできる
Podが動的で多いPrometheusが直接対象を特定しなくて済む

Kubernetes上で短命・疎結合なBotを運用するなら、
Pushgatewayは“Prometheusに届かない声”を拾うマイクだと思ってもらえればOKです!

おまけ2:🎯 Pushgatewayとは?

Prometheus専用の「中継サーバー(アプリケーション)」です。


🔧 つまり、“Prometheusの仲間”であり、別アプリとして動かす必要があるツールです。


📦 イメージで言うと…

  • Prometheus:配達員(値を取りにいく)
  • Botたち:短命で動き回るクライアント(取引したら報告したい)
  • Pushgateway:コンビニの宅配便預かりボックス(Botがメモを置ける場所)

🧠 Pushgatewayの役割(かんたん説明)

機能内容
中継所として常駐自分自身がずっと動き続け、データを一時保管する
BotからPOSTされた値を保持curlやPythonから直接送信できる(=Push型)
PrometheusからのPullに対応PrometheusはあくまでPull型を維持したまま、Pushgatewayを取りに来る

📦 Pushgateway は何でできているの?

  • 公式が公開している独立アプリケーションです(Go言語製)。
  • 公式GitHub からバイナリもDockerイメージも利用可能。
  • KubernetesやDocker ComposeでBotと同じようにサービスとしてデプロイします。

🔁 BotとPushgatewayとPrometheusの関係

cssコピーする編集する[ BOT ]  →  [ Pushgateway ]  ←  [ Prometheus ]
   ↑           ↓    ↑              ↑
  トレードが     保持した          Pull型で
  起きたら       メトリクス        取りに来る
  Pushする      を一時保存        Prometheus本体

✅ よくある誤解の整理

誤解実際は…
PushgatewayはPrometheusに内蔵されている?❌ 別のツールです(別プロセスで動かします)
PushgatewayはPullする側?❌ BotがPushします。PrometheusはPullです
BotはPushgateway無しでPrometheusに直接Pushできる?❌ PrometheusはPushを受け付けません。Pushgatewayが仲介します

🏁 まとめ

  • Pushgatewayは“Prometheus専用の中継アプリ”
  • 短命なBotや非同期なイベントが「今これ起きたよ」と伝えるための一時保管所
  • 自分でサーバーとして立ち上げる必要あり(DockerやK8sで簡単に動かせます)

-Bot