Bot

開発記録#154(2025/3/25)「論文ベースのbot開発フローpart.16 運用初日チェック」

2025年3月25日

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

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

🟢 運用開始後の初日チェック

次のステップでは、運用開始直後の初日チェックを実施し、システムの安定性と正常稼働を確認します。


1. 初日チェックの目的

✅ 稼働状況のリアルタイム確認
✅ 主要コンポーネントの異常検出
✅ Slack通知や監視システムの動作確認
✅ トレードの正確性とログの記録状況の確認

📝 解説:

初日はシステムが安定して動いているかを確認する、とても大事なタイミングです。
ここでは、Botがしっかり起動しているか(稼働状況)、異常が出ていないか(ログやSlack通知)、
実際の注文が正しく動いているか(トレード精度)、
それらをリアルタイムで確認するためのチェック項目をリストアップしています。

Bot開発では「動いたら終わり」ではなく、「動いてからが本番」。
特に初日は想定外のトラブルが起こりやすいため、この確認作業をスクリプト化しておくことが後々の安心感につながります


2. 初日チェックのチェックリスト

チェック項目チェック内容コマンド / 手順
Podの状態Botが全コンポーネントで稼働中か確認kubectl get pods
データ収集状況Bybit APIからデータが正確に取得されているかkubectl logs <data_collector_pod>
P&D検出精度実際の市場データと比較し、誤検出がないかGrafanaのダッシュボード確認
取引状況Botの注文が期待通りに動作しているかSlack通知と注文履歴の確認
APIエラー確認APIタイムアウトや認証エラーの有無kubectl logs <trade_executor_pod>
Slack通知確認エラーや異常検出時に通知が届くかSlackチャネル確認
PrometheusのメトリクスCPU/メモリ使用率、トラフィック状況確認kubectl top pods / Grafana確認

📝 解説:

ここでは、Bot運用初日に確認すべき具体的なチェック項目を一覧にまとめています。
「どこを、どうやって、何で確認するのか」が明確になっていることで、人為的な見落としを防ぎ、トラブルへの初動を早くすることができます。

たとえば:

  • kubectl get pods でBotの各コンポーネントが稼働しているかを確認
  • kubectl logs を使って、データ収集や注文処理のエラーログを取得
  • Slack通知やGrafanaのダッシュボードで、異常検出やリソース状況をリアルタイム監視

このように、KubernetesとSlack、Grafanaといったツールを連携させることで、手動確認を減らしながら精度の高い運用監視が実現できます

Botのトラブルは“気づくのが遅れる”ほど損失が大きくなります。
そのためにも、こうした明確なチェックリストをルーティン化することが重要です。


3. 初日チェック用スクリプト (first_day_check.py)

以下のスクリプトでは、各コンポーネントの状態を自動で確認し、Slack通知の送信とログファイルへの保存を行います。

import subprocess
import requests
import time
from datetime import datetime

# Slack通知設定
SLACK_WEBHOOK_URL = "https://hooks.slack.com/services/YOUR_WEBHOOK_URL"

# ログファイル設定
LOG_FILE = "./first_day_check.log"

# ログ出力関数
def log_message(message):
    timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
    log_entry = f"[{timestamp}] {message}\n"
    with open(LOG_FILE, "a") as file:
        file.write(log_entry)
    print(log_entry)

# Slack通知送信
def send_slack_alert(message):
    payload = {"text": f"🚨 {message}"}
    requests.post(SLACK_WEBHOOK_URL, json=payload)

# Podの状態確認
def check_pod_status():
    result = subprocess.getoutput("kubectl get pods")
    if "Running" in result:
        log_message("✅ Pod稼働状態確認 - 正常")
    else:
        log_message("❌ Pod稼働状態確認 - 異常検出")
        send_slack_alert("❌ Pod稼働状態に異常があります")

# データ収集状況確認
def check_data_collection():
    result = subprocess.getoutput("kubectl logs <data_collector_pod> | tail -n 10")
    if "data saved" in result:
        log_message("✅ データ収集確認 - 正常")
    else:
        log_message("❌ データ収集確認 - 異常検出")
        send_slack_alert("❌ データ収集に異常があります")

# APIエラー確認
def check_api_errors():
    result = subprocess.getoutput("kubectl logs <trade_executor_pod> | tail -n 10")
    if "API error" in result:
        log_message("❌ APIエラー検出")
        send_slack_alert("❌ APIエラーが発生しました")
    else:
        log_message("✅ APIエラー確認 - 異常なし")

# 初日チェックの実行
def first_day_check():
    log_message("🚀 初日チェックを開始します")
    check_pod_status()
    check_data_collection()
    check_api_errors()
    log_message("✅ 初日チェックが完了しました")

if __name__ == "__main__":
    first_day_check()

📝 解説:

このスクリプト first_day_check.py は、Botの運用初日に行うべき主要な確認作業を自動化するためのものです。
KubernetesコマンドをPythonから実行し、その結果をログファイルに記録すると同時に、異常があればSlackに即時通知を飛ばす構成になっています。


🔧 スクリプトの中身のポイント

  • log_message()
     → 確認結果をログファイル first_day_check.log に記録する関数です。タイムスタンプ付きで残せるため、後からの振り返りに便利です。
  • send_slack_alert()
     → 異常を検知したときに、Slackへ即座に通知を送る関数です。Botが黙って落ちていた…という事態を防げます。
  • check_pod_status()
     → kubectl get pods を使って、各コンポーネントがちゃんと動いているかを確認します。
  • check_data_collection()
     → データ収集用Podのログから、"data saved" というキーワードを探し、実際にデータが保存されているかをチェックします。
  • check_api_errors()
     → 注文実行側のログを見て、"API error" という文字が含まれていないかを検出します。Bybit APIの認証や接続エラーの早期発見に役立ちます。

🚀 なぜ自動化が重要なのか?

Bot運用の初日は、とくにエラーが潜在的に起きやすいタイミングです。
その都度、手動でPodを確認してログを目で追って…というのは、作業者の負担が大きくなりがちです。

このスクリプトのようにチェックを自動化しておけば:

  • ✅ 人的ミスを減らせる
  • ✅ チェック漏れがなくなる
  • ✅ 発見が早まり、損失リスクを最小化できる

という3拍子そろった効果が得られます。


💬 ワンポイント補足:

現在のバージョンでは <data_collector_pod> などが固定値のままなので、実際に使う場合はPod名の取得をラベルベースや動的取得に切り替えるとより安全です。
また、将来的に JSON形式でログを出力 → 分析や可視化にも活用 という拡張も視野に入れておくとよいでしょう。


4. 実行方法

  1. スクリプトの実行
python first_day_check.py
  1. Slack通知の確認
    • Botの状態やエラー発生状況がSlackに通知されることを確認
  2. ログの確認
cat first_day_check.log

📝 解説:

このセクションでは、初日チェック用スクリプトの具体的な使い方をまとめています。

  • python first_day_check.py を実行することで、Botの稼働状況やログを一括チェックできます。
  • 異常が検出されると、自動的にSlackに通知が飛ぶ仕組みになっているため、遠隔でもすぐに状況を把握可能です。
  • 実行後は、cat first_day_check.log コマンドでログファイルを確認し、どのチェックが成功/失敗したかを詳細に見返すことができます。

このように、Slack通知+ログファイルの二重チェック体制を整えておくことで、
万が一のトラブルにもすぐに対応できる、実戦的な運用体制が構築できます。


5. 初日チェック後の対応指針

状況対応策
全システム正常翌日以降のスケジュール通りの運用継続
⚠️ 軽微なエラーSlack通知の確認 → 手動再起動対応
重大エラー (停止/データ欠損)Slack通知 → 詳細ログ調査 → 修正後に再デプロイ

📝 解説:

この一覧は、初日チェックの結果に応じて、どう対応すべきかをまとめた行動指針です。
Botは本番環境に出した後こそ、本当の意味での“運用フェーズ”に入ります。
ここで重要なのは、状況に応じて迷わず判断・対応できることです。


  • 全システムが正常であれば、翌日以降も予定どおり運用を継続します。
    ただし油断せず、ログと通知を定期的にモニタリングし続けることが前提です。
  • ⚠️ 軽微なエラー(一時的なAPIタイムアウトなど)が出た場合は、Slack通知を確認し、必要であれば手動でBotの再起動を行います。ここでの“判断スピード”が大事です。
  • 重大エラー(Bot停止やデータの欠損など)が発生した場合は、Slackで即時検知したあと、詳細ログを調査して原因を特定し、修正後に再デプロイします。
    こうした「落ちた後の対応フロー」が整っているかどうかが、Bot運用の信頼性を大きく左右します。

このように、“正常・軽微・重大”という3段階に分けた判断基準を持っておくことで、緊急時にも慌てず対応できるようになります。


6. 次のステップ

次は、以下のタスクに進みます:

初週チェック結果の分析

  • 取引成功率、誤検出の有無、Slack通知の精度確認

結果に基づいたシステムの調整

  • パラメータ最適化、エラーハンドリングの追加、Botの再デプロイ
Yodaka

次の記事では、初週チェック結果の分析を行い、その結果をもとにシステムの最適化を実施します。

関連
開発記録#155(2025/3/25)「論文ベースのbot開発フローpart.17 初週チェック結果の分析」

続きを見る

👇ラジオで話したこと

🎙️ 仮想通貨Bot開発フロー Part.16──運用初日チェック

こんにちは、仮想通貨bot開発ラジオ、よだかです。
今回は、仮想通貨Botを本番環境にデプロイして迎えた初日──その立ち上げ直後のチェックについて、お話ししていきます。

Botのテーマは引き続き、
暗号通貨のパンプ&ダンプスキームの検出」を目的とした検知系の戦略Botです。
今回は、**実際に本番で動き始めたあと、どんなことをチェックするのか?何がポイントなのか?**というところに焦点を当てていきます。


🟢 初日チェックの目的

まず、運用初日で確認したかったことは主に4つ。

  1. システムがちゃんと稼働しているか?
  2. 主要なコンポーネントにエラーが出ていないか?
  3. Slack通知やモニタリングの仕組みが正常に動いているか?
  4. 実際にBotが出した注文が、意図した通りに動いているか?

簡単に言えば、「全部ちゃんと動いてる?」を確かめる日という感じです。


📋 チェックリストとその方法

ここで使ったのは、KubernetesのコマンドSlack通知、そしてGrafanaによる可視化です。
以下が実際のチェック項目です:

チェック項目方法
Podの稼働確認kubectl get pods
データ収集状況kubectl logs <data_collector_pod>
P&D検出の精度Grafanaで可視化された検出ログと比較
注文の挙動Slack通知・Bybitの注文履歴を目視確認
APIエラーの有無kubectl logs <trade_executor_pod>
Slack通知の到達状況Slackチャンネルでのメッセージ確認
リソース使用状況kubectl top pods+GrafanaでCPU/メモリ確認

💻 初日チェック用スクリプトの仕組み

ここからは技術的な話を少し。
今回の初日チェックは、Pythonスクリプト(first_day_check.py)で自動化しています。

このスクリプトでは:

  • Kubernetesコマンドを内部的に叩く
  • 状態をログファイル(first_day_check.log)に記録
  • 異常があった場合はSlackに即通知

という構成になっています。


🔍 具体的な機能はこんな感じ

def check_pod_status():
    result = subprocess.getoutput("kubectl get pods")
    ...
  • subprocess.getoutput() を使って、実際のKubernetesコマンドをPythonから叩いています。
  • if "Running" in result: で稼働状態を確認。
  • 異常があれば、Slackへアラート通知。

Slack通知はこんな風に:

payload = {"text": f"🚨 {message}"}
requests.post(SLACK_WEBHOOK_URL, json=payload)

かなりシンプルですが、運用初日に必要な最低限の可視化と通知が一通り入っている構成です。


🚀 実行方法と運用フロー

スクリプトはこう実行します:

python first_day_check.py

すると:

  • コンポーネントの状態をチェック
  • ログファイルに記録
  • 異常があればSlackへ通知

チェック後は、cat first_day_check.log でログの内容を見返せます。

「ログファイルの中身を確認するときは、cat first_day_check.log と打てばOKです。“キャット”コマンドでログをそのまま画面に出すっていう意味ですね。たとえば、『初日に何が起きたか』『どのタイミングでSlack通知が飛んだか』を一気に振り返ることができます。」

cat は UNIX系コマンドで、

concatenate(連結する) の略。
ただし、実際の用途としては:

ファイルの中身をそのまま画面に表示するコマンド

というのが一般的です。

「UNIX系コマンドっていうのは、LinuxやmacOSのターミナルで使える“作業用の呪文”みたいなものです。たとえば、lsって打てば今のフォルダの中身が見れるし、catでファイルの中身を読めたり。これらはUNIXっていう古くからあるOSの考え方を受け継いだコマンドなんですね。」


✅ 初日の評価と対応の指針

運用中に何か問題が見つかった場合、それが軽微なのか、致命的なのかで対応を分けています:

状況対応策
✅ 全システム正常翌日以降も予定通り運用を継続
⚠️ 軽微なエラー発生Slackで通知確認 → 手動再起動 or 部分再デプロイ
❌ 重大エラー(停止など)Slack通知 → ログ確認 → 修正 → 再デプロイ

この「初日の対応方針テンプレート」があるだけで、心理的な余裕がぜんぜん違います。


🔄 次に進むタスク

初日が終わったら、次にやるのは:

  • 初週チェック結果の分析
    • 取引成功率、誤検出の割合、Slack通知の精度などを見ていきます。
  • それをもとにしたシステムの調整
    • パラメータの最適化、通知フローの改善、Bot再デプロイなど。

🎙️ まとめると──

今回の放送では、Bot運用初日にやるべきチェック項目と、
それをどう自動化し、どう可視化するか、というところを紹介しました。

「とにかく動いた」で終わらせずに、初日のうちにトラブルを炙り出し、次につなげる仕組みを整える
これがBot運用における最初の山場です。

次回は、Botが本番環境で稼働を続ける中で、 「どんなエラーが起きやすいのか?」「リソースは逼迫していないか?」などをチェックする、 “継続的な監視と安定性評価”のフェーズについてお話しします。

🎙️ おまけコーナー:トレーダーとエンジニア、それぞれの目線から見ると…?

さて、ここからはおまけの時間です。
今回の放送では、Botの初日チェックとその自動化スクリプトについてご紹介しましたが、
**実際に現場で動いている“2つの職種”**から見ると、また違った視点やツッコミが生まれてきます。

それが──

  • 📈 システムトレーダー(Bot運用者)
  • 💻 アプリケーション開発者(ソフトウェアエンジニア)

の2つの立場です。


📈 システムトレーダーからの視点

🔍 ツッコミ1:「トレード精度の数値化がない?」

Botが出した注文が**“正確だったかどうか”って、主観じゃなくて数値で出してほしい**。
たとえば:

  • 成行スリッページはどれくらい?
  • 約定までに何秒かかったか?
  • 約定成功率は?

この辺のパフォーマンスログがまだ浅いというツッコミはありそうです。

→ 🧩 補足:「初週チェック」で約定検知やPnLログを追加する話が出てきているので、今後改善予定!


🔍 ツッコミ2:「検出戦略のアクションが見えない」

P&Dを検出したあと、「で、どう動くの?」って部分がコード上にまだ登場していない
つまり、現段階では「検出→通知」までで止まっていて、「反応してポジションを取る」設計がまだ未実装。

→ 🧩 補足:今は“検出の安定性”に焦点を置いたフェーズ。
次フェーズで「検出結果に基づいたポジション戦略」を組み込む予定。


💻 アプリケーション開発者からの視点

🔍 ツッコミ1:「Pod名ハードコードしてるけど大丈夫?」

たとえばこれ:

kubectl logs <data_collector_pod>

ここって実際には<pod名>を固定で書かないといけないけど、Pod名は毎回ランダムなsuffixがつくことがあるので、
「正しくログ取れてる?」という疑問は出てきます。

→ 🧩 補足:kubectl get pods -l app=data-collector -o name みたいなラベルベースの動的取得に切り替えると堅牢になります。


🔍 ツッコミ2:「ログの構造が生テキストすぎる」

[2025-03-25 10:00:00] ✅ Pod稼働状態確認 - 正常

このログ、人間には読みやすいけど、ツールで処理しにくい形式なんですよね。
開発者視点では「JSONで吐いておいて、後で分析しやすい形にしてくれ〜」という声が出るかもしれません。

→ 🧩 補足:今後、監視ツール連携(例:Loki + Grafana)の導入で、ログを構造化・クエリ化していくのが理想です。


🎙️ 総括:立場が変われば見える景色も変わる

こうして見てみると、トレーダー視点は“マーケットへの反応精度”に敏感で、
エンジニア視点は“システムとしての堅牢性・拡張性”を気にするという傾向があります。

どちらも正しくて、そして両者の間に立つのが「Bot開発者」としての私たち。


📎 今後のテーマとして、たとえば:

  • 「ログをJSONにするだけで、後続の分析コストがどう変わるか?」
  • 「PnLログとGrafanaで“見える化”されたBotの挙動はどこまで信用できるか?」
  • 「システムトレーダーとソフトウェア開発者がうまく共存する開発体制とは?」

…みたいな話題も掘っていきたいと思っています。

それでは、今回のおまけコーナーはこの辺で。
また次回、システムの改善フェーズでお会いしましょう。
よだかでした!

✅ 「cat」って何?

cat は UNIX系コマンドで、

concatenate(連結する) の略。
ただし、実際の用途としては:

ファイルの中身をそのまま画面に表示するコマンド

というのが一般的です。


🗂️ だから、このコマンドの意味は?

cat first_day_check.log

「first_day_check.log」というログファイルの中身をそのまま表示してね
という意味です。

ちなみに cat の出力はすぐに流れちゃうので、
長いファイルの場合は lesstail と組み合わせることも多いです。
たとえば:

tail -n 20 first_day_check.log

で「最後の20行だけ確認」みたいなこともできます。

✅ 「UNIX系コマンド」って何?

一言で言うと:

UNIXというOS(オペレーティングシステム)の設計思想に基づいたコマンド群のことです。

これには、LinuxやmacOSのターミナルで使われる基本的なコマンドたちが含まれます。

たとえば、次のようなコマンドが「UNIX系コマンド」の代表例です:

コマンド読み方役割
lsエルエスファイルやフォルダの一覧を表示
cdシーディーディレクトリ(フォルダ)を移動
catキャットファイルの中身を表示
grepグレップテキストを検索する
tailテイルファイルの末尾を表示
echoエコー文字列を出力

💡 ちなみに「UNIX系」の“系”とは?

macOSやLinux、BSDなど、UNIXにルーツをもつOS(オペレーティングシステム)はたくさんあります。
それらに共通して使えるコマンド群をひっくるめて「UNIX系コマンド」と呼んでいるんですね。

-Bot