暗号資産のマーケットは、価格も仕様も API も“昨日の正解”がすぐ陳腐化する世界です。
一人開発で勝ち続けるには 「戦略を量産しては捨てる」 を苦なく回せる土台──すなわち 堅実だが可塑性の高い基盤 が欠かせません。本稿では Mac mini でのローカル開発からクラウド移行、そしてコンテナ分離・プラグイン設計まで、実践で得た教訓を 設計・運用・スケール の3軸で整理します。
設計や運用思想のような"振る舞い及び考え方の軸"が定まっていると下流のことはほぼ作業になるので、色々と楽。
私は後々ラクしたいという気持ちが強いけど、同時に今この瞬間も楽しみたいという気持ちもあるので、その両方を丁度良い感じのバランスで満たしてくれるbotterというポジションが好き。— よだか(夜鷹/yodaka) (@yodakablog) July 10, 2025
1. 序章:なぜ“あとから外せる”構造が必須なのか
市場の変化速度と戦略寿命
- スプレッド縮小・取引所仕様変更・競合 Bot の増加──アルファは短命。
- 「ダメだ」と分かった戦略を秒速で剝がせる体制が、次の実験コストを劇的に下げる。
500 行警告フックに学ぶ“早期分割”の心得
- 1 ファイル 500 行超で pre-commit が warning → “規模が臭う”タイミングを可視化。(理想は300行以内)
- 小さく切るほど単体テストが速く、ロールバックも最小 diff
- 実装→検証→撤去を 1 日サイクルで回すには、リファクタ容易性が最優先。
アルファ探索フロー
flowchart LR
    idea([アイデア]) --> rec[Recorder<br>データ蓄積]
    rec --> eda[EDA & Backtest]
    eda -->|勝てる| deploy[Feature Flag ON<br>本番へ]
    eda -->|勝てない| trash[Git tag<br>戦略墓場]
    deploy --> monitor[Real-time Monitor]
    monitor -->|劣化| trash
    style trash fill:#ffdcdc,stroke:#ff8080
2. 三層アーキテクチャの基礎
2-1. ロジック層/I-O 層/設定層とは何か
| レイヤ | 主な責務 | 具体例(Bot 開発) | 
|---|---|---|
| ロジック層 | 戦略・リスク管理・PnL 計算 | エントリ判定、連続失敗時停止、ポジション制御 | 
| I-O 層 | 外部システムとの通信・永続化 | REST/WS クライアント、DB/Cache、Slack 通知 | 
| 設定層 | 変わり得る値を集約し Read-Only 提供 | .env,settings.yaml, Secrets Manager | 
2-2. 追加で意識すべき Service 層・Interface 層
| レイヤ | 役割 | 
|---|---|
| Service 層 | 戦略や I-O の呼び出し順序・状態遷移を調停 | 
| Interface(=CLI/API) | ユーザ入力・外部システムとサービス層を接続 | 
2-3. DTO&依存方向ルールで守るモジュール境界
- DTO (Data Transfer Object) を dataclass化し層間通信を固定
- 依存矢印は 上 → 下 の一方通行。下位層が上位層を import しない
- 抽象(Protocol / Interface)で注入し、テスト時はスタブで差し替え
層構造の全体像
graph TD
    ui["Interface<br>(CLI / REST)"]
    svc["Service / Orchestrator"]
    logic["Business Logic<br>(Strategy)"]
    infra["Infrastructure<br>(Exchange, DB)"]
    ext[(取引所 API<br>DB, Slack)]
    config[("Settings / Secrets")]
    ui --> svc
    svc --> logic
    logic --> infra
    infra --> ext
    logic -->|Read-only| config
    svc -->|Read-only| config
2-4. Bot 開発のチェックポイント&ヒント
【bot開発のチェックポイント&ヒント】
☑️ロジック層から外部ライブラリ import が無いか確認 →分離の漏れが見える☑️DTO や dataclass で層間のやり取りを固定する
→将来の変更が局所化☑️依存方向は“上→下”のみ(上位層が下位層の抽象に依存)。逆依存を検出する CI ルールを入れると安全
— よだか(夜鷹/yodaka) (@yodakablog) July 9, 2025
| ✅ チェック項目 | なぜ効くか | 実践例 | 
|---|---|---|
| ロジック層から外部ライブラリ import が無いか | I/O や UI の実装が紛れ込むと層の境界が崩れ、テスト困難&再利用不能に。 | `grep -R "from aiohttp" src/mmbot/core | 
| DTO / dataclass で層間を固定 | 将来の変更が 型エラー として顕在化し、影響範囲を局所化できる。 | python\n@dataclass\nclass OrderReq:\n side: str\n price: Decimal\n qty: Decimal\n | 
| 依存方向は“上→下”のみ | 下位層が上位層を import すると循環依存や神クラス化を招く。 | `pydeps src/mmbot --no-show-deps | 
# .github/workflows/static-check.yml 例
- name: Detect upward dependencies
  run: |
    pip install pydeps
    pydeps src/mmbot --no-show-deps | grep "↖" && exit 1 || echo "No upward deps"
Tip: ここでエラーが出たら “どの import が越境したか” を grep で探し、
① DTO を追加 → ② 依存を下層に寄せる → ③ Facade を削除、の順で修正すると安全です。
 
		
	次章以降では Recorder ファーストの検証フロー、戦略プラグイン化とフィーチャーフラグ、Mac mini 省リソース術 など、具体的な実装&運用テクニックを掘り下げていきます。
3. Recorder ファースト:アルファ検証のワークフロー
3-1. データ取り → EDA → Go/No-Go 判定の高速ループ
sequenceDiagram
    participant R as Recorder
    participant DB as Data Lake
    participant NB as Notebook / EDA
    participant JR as Jenkins / CI
    participant BT as Backtester
    participant Ops as Ops Flag
    R->>DB: ① Raw Tick / Funding / Depth<br>Parquet or Kafka
    NB-->>DB: ② SQL / pandas で探索
    NB->>JR: ③ 仮説パラメータを commit
    JR->>BT: ④ 自動 Backtest Matrix
    BT-->>JR: ⑤ Metrics (PnL, DD, Sharpe…)
    JR->>Ops: ⑥ 成績閾値を満たす?<br>Yes → feature_flag ON<br>No  → tag as trash
- Recorder
- Exchange REST/WS → Kafka or Parquet。
- シンボル・頻度は最小構成(例:BTCUSDT, 1 m)。
 
- EDA (Exploratory Data Analysis)
- Jupyter/Polars/Pandas で Hypothesis-Driven に可視化。
 
- Backtest 自動化
- GitHub Actions などで パラメータ行列を全パターン回す。
 
- Go/No-Go 判定
- 指標テンプレ:Win% ≥ 55 && MaxDD ≤ 5%。
- 通過したら Feature Flag を ON し本番で 1 % サイズから試す。
- 落ちたら git tag failed/2025-07-10-α1→ 墓場フォルダへ移動。
 
- 指標テンプレ:
3-2. スキーマ統一と欠損ガードのチェックリスト
| チェック項目 | “PASS” 基準 | 実装ヒント | 
|---|---|---|
| 型統一 | ts: int64,price: decimal128,size: float64 | pyarrow.schemaに宣言して書込前に validate | 
| タイムゾーン | 最新レコード − 最古レコード ≒ 取得範囲 | ts % 1000 == 0で ms→秒の混入を検知 | 
| 欠損 | price欠損率 < 0.01 % | SELECT symbol, COUNT(*) WHERE price IS NULL | 
| 異常値 | Z-score ±8 以内 | scipy.stats.zscoreで自動除外 | 
| メタ列 | exchange,symbol,envを必須 | SQL PK を (ts, exchange, symbol)に固定 | 
3-3. TTL 設定とコスト最適化の考え方
| データレイヤ | 保持期間 (TTL) | 圧縮 / パーティション | コスト削減策 | 
|---|---|---|---|
| Raw Tick | 30–60 日 | /year=2025/month=07/day=10/ | S3 Infrequent Access + ZSTD | 
| Aggregated (1 m, 1 h) | 1 年 | DeltaLake + VACUUM | Athena / BigQuery on demand | 
| Feature Store | 永続 | symbol/feature.parquet | フィールド選択を最小限 | 
4. 戦略プラグイン化とフィーチャーフラグ
4-1. BaseStrategy インタフェース設計
# core/strategy/base.py
from dataclasses import dataclass
from abc import ABC, abstractmethod
from decimal import Decimal
from typing import Iterable, Dict
@dataclass
class MarketSnapshot:
    ts: int
    bid: Decimal
    ask: Decimal
    position: Decimal
class BaseStrategy(ABC):
    id: str                     # 'mm_v1', 'arb_cex', ...
    version: str                # git sha / semver
    @abstractmethod
    async def warmup(self, snapshots: Iterable[MarketSnapshot]) -> None: ...
    @abstractmethod
    async def generate_signals(
        self, snapshot: MarketSnapshot
    ) -> Dict[str, Decimal]:  # {'buy': qty, 'sell': qty}
        ...
ポイント
- I/O 依存ゼロ → ユニットテストは DTO を流すだけ。
- id,- versionを必ず返し ログ & メトリクスにラベル付け。
4-2. entry_points / importlib でホットプラグ
# pyproject.toml [project.entry-points."mmbot_strategies"] mm_v1 = "mm_v1.strategy:MMV1" arb_magic = "arb_magic.strategy:ArbMagic"
# service/loader.py
import importlib.metadata as md
from core.strategy.base import BaseStrategy
def discover(enabled_ids: set[str]) -> list[type[BaseStrategy]]:
    for epi in md.entry_points(group="mmbot_strategies"):
        if epi.name in enabled_ids:
            yield epi.load()
- pip install -e . でロード完了。
- bot 再起動せず --enable-strategy arb_magicで即テスト。
4-3. ON/OFF 切替を 1 行にする Feature Flag パターン
# config/flags.yaml  (Central Repo)
enabled_strategies:
  - mm_v1
  - arb_magic
risk_limits:
  mm_v1: {maxPos: 1000}
  arb_magic: {maxPos: 200}
# service/runner.py
import yaml, watchdog.events
class FlagWatcher(watchdog.events.FileSystemEventHandler):
    def on_modified(self, _):
        Runner.reload_flags()
class Runner:
    @classmethod
    def reload_flags(cls):
        flags = yaml.safe_load(open("/mnt/config/flags.yaml"))
        cls.active_ids = set(flags["enabled_strategies"])
- K8s ConfigMap or Docker bind-mount 更新 → watch → 自動リロード。
- 緊急停止は vim flags.yaml→ save で完了。
フラグ適用フロー
flowchart LR
    ops["Ops<br/>edit flags.yaml"] --> cm["ConfigMap<br/>reload"]
    cm -- inotify --> runner["Runner<br/>reload_flags()"]
    runner --> loader["StrategyLoader"]
    loader -- "Δ enabled_ids" --> orchestrator["Orchestrator"]
 
		
	次章では コンテナ分離 & リソース制御、Mac mini 省エネ運用術、クラウド移行の IaC 手順 を解説し、一人開発でも“壊さず速く”成長できる体制を仕上げます。
5. コンテナ分離の実践
5-1. 戦略ごとに分けるメリット & デメリット
| 観点 | メリット | デメリット / 対策 | 
|---|---|---|
| 障害隔離 | 1 Bot が OOM しても他 Bot が生き残る。 | ログとアラートが散逸 → 共通 Loki ↔ Grafana で統合。 | 
| 依存衝突回避 | 取引所 SDK のバージョン違い・Rust-Python 混在を吸収。 | ベース OS がバラける → 共通 base image へ揃える。 | 
| CI/CD 柔軟 | Bot 単位でビルド&ロールバック。 | Pipeline が乱立 → モノレポ + build-arg STRATEGY で集約も可。 | 
| リソース制御 | limits:で CPU / Mem を明確に。 | 未使用時も重複メモリを喰う → K8s VPA で自動縮退。 | 
| セキュリティ境界 | API キーを Bot 内 Secret に閉じ込め。 | Secret スプロール → Central Vault + sidecar injector に。 | 
5-2. 「3 Bot + Recorder」構成図
graph TD
    subgraph namespace[ ]
        recorder[Recorder<br>Market Stream]
        mm[FRMM Bot]
        arb[Arb Bot]
        liq[Liquidation Snipe Bot]
        nats[NATS / JetStream]
        psql[(TimescaleDB)]
        vault[HashiCorp Vault]
    end
    recorder -->|Tick| nats
    mm -->|Subscribe| nats
    arb -->|Subscribe| nats
    liq -->|Subscribe| nats
    mm --> psql
    arb --> psql
    liq --> psql
    recorder --> psql
    vault --> mm
    vault --> arb
    vault --> liq
5-3. Helm/Compose 最小サンプル
docker-compose.yml(抜粋)
version: "3.9"
services:
  nats:
    image: nats:2.10
    command: ["-js", "-sd", "/data"]
    ports: ["4222:4222"]
    volumes: ["./data/nats:/data"]
  recorder:
    build: ./recorder
    env_file: .env.recorder
    deploy:
      resources:
        limits: {cpus: "1.0", memory: "512M"}
    depends_on: [nats]
  frmmbot:
    build: ./frmmbot
    env_file: .env.frmm
    deploy:
      resources:
        limits: {cpus: "1.5", memory: "1G"}
    depends_on: [nats]
  arbbot:
    build: ./arbbot
    env_file: .env.arb
    deploy:
      resources:
        limits: {cpus: "1.0", memory: "1G"}
    depends_on: [nats]
  snipebot:
    build: ./liqbot
    env_file: .env.liq
    deploy:
      resources:
        limits: {cpus: "1.0", memory: "1G"}
    depends_on: [nats]
Helm values.yaml
global:
  imagePullPolicy: IfNotPresent
  vaultAddr: "http://vault.vault:8200"
recorder:
  resources:
    limits:
      cpu: 500m
      memory: 512Mi
  env:
    NATS_URL: "nats://nats:4222"
strategies:
  - name: frmm
    replicas: 1
    resources:
      limits: {cpu: "1", memory: "1Gi"}
    env:
      STRATEGY_ID: "frmm_v1"
  - name: arb
    replicas: 1
    resources:
      limits: {cpu: "1", memory: "1Gi"}
    env:
      STRATEGY_ID: "arb_cex"
  - name: liq
    replicas: 1
    resources:
      limits: {cpu: "1", memory: "1Gi"}
    env:
      STRATEGY_ID: "hyperliq_snipe"
5-4. Secrets / 資金 / API レートリミットの中央ガード
| トピック | 実装アイディア | 
|---|---|
| Secrets | Vault → AppRole + sidecar で Pod 起動時に /vault/secrets/api_keyへマウント。 | 
| 資金管理 | 取引所サブアカ or 内製 Balance-Guard Service。Bot は reserve(amount)API 経由でしか資金確保不可。 | 
| Rate-Limit | Envoy Proxy or nginx lua で token-bucket。コンテナからは localhost:8080 → Proxy → Exchange。 | 
6. Mac mini 開発環境を守る 6 つの Tips
| # | テクニック | コマンド / ツール | 効果 | 
|---|---|---|---|
| 1 | Docker CPU / Mem Cap | Docker Desktop → Settings > Resources cpus: 6,memory: 8 GB | ホスト OS が奪われず VS Code が落ちない | 
| 2 | 軽量イメージ + multi-stage | python:3.12-alpine→ final サイズ <200 MB | Pull / Build / RAM 使用を 40-60 % 削減 | 
| 3 | Swap 圧縮 & purge | sudo launchctl limit maxfiles 10240 10240sudo purgeを cron.daily | スワップ膨張で Beachball…を防ぐ | 
| 4 | バインドマウント最適化 | :delegatedオプション ordocker sync | I/O wait を半分以下に | 
| 5 | 温度監視 & ファン強化 | brew install osx-cpu-temp外付けUSB-Cファン+縦置き | 80℃→65℃、クロックダウン回避 | 
| 6 | htop + ctop ダッシュボード | brew install htop ctopF6→MEM% で並替 | メモリ肥大プロセスを即 kill | 
multi-stage Dockerfile 雛形
# builder FROM python:3.12-alpine AS builder WORKDIR /app RUN apk add --no-cache build-base COPY pyproject.toml poetry.lock ./ RUN pip install poetry && poetry export -f requirements.txt --output reqs.txt # runtime FROM python:3.12-alpine WORKDIR /app COPY --from=builder /app/reqs.txt . RUN pip install -r reqs.txt --no-cache-dir COPY src/ ./src ENTRYPOINT ["python", "-m", "src.cli"]
運用ヒント
docker statsで CONTAINER 内MEM%>90 が続けばrestart: on-failure+ back-off を設定。- 冷却ファンは吸気↔排気を意識して配置すると 5 ℃ 以上差が出る。
 
		
	次章は クラウド移行ロードマップ と CI/CD・セキュリティ自動化。これで “小さく作って速く回す” 基盤が完成します。
7. クラウド移行ロードマップ
7-1. 最小 VPS スペックと月額試算
| 用途 | 最小スペック (推奨) | 参考サービス & 価格* | 想定 Bot 数 | 
|---|---|---|---|
| Recorder 専用 | 2 vCPU / 4 GB RAM / 80 GB NVMe | Oracle Cloud Ampere A1 (Free) or Hetzner CX22 (€ 4.15/月) | 1 | 
| MM / FR Bot | 4 vCPU / 8 GB RAM / 100 GB NVMe | Hetzner CPX31 (€ 8.30/月) | 1 – 2 | 
| Arb / Liquidation | 4 vCPU / 8 GB RAM / 100 GB NVMe | Vultr High-Freq ($ 10/月) | 2 – 3 | 
| Monitoring / CI | 2 vCPU / 4 GB RAM / 40 GB SSD | Oracle Free / DigitalOcean Basic ($ 6/月) | – | 
*2025-07 時点の税込み目安。円換算 ≒€ 1 = ¥160 / $ 1 = ¥155
7-2. IaC 化(Terraform + Ansible)4ステップ
- 1,Terraform で箱だけ作る
resource "hcloud_server" "mm_main" {
  name        = "mm-main"
  image       = "ubuntu-22.04"
  server_type = "cpx31"
  ssh_keys    = [hcloud_ssh_key.default.id]
}
- 2,Ansible で共通ロール
- roles/docker,- roles/vault_agent,- roles/promtail
- 変数は group_vars/{recorder,bot,infra}.yml
 
- 3,CI で terraform apply→ansible-playbookの2段ジョブ- PR マージで自動デプロイ。
 
- 4,State 管理:Back-end S3 + DynamoDB lock(or Hetzner Storage Box)
7-3. Prometheus + Grafana Cloud で統合監視
flowchart LR
    node_exporter[Node Exporter]
    python_exporter[Python / Custom Metrics]
    promtail[Promtail]
    prometheus[Prometheus<br>Docker]
    loki[Loki<br>Docker]
    grafana[(Grafana Cloud)]
    node_exporter --> prometheus
    python_exporter --> prometheus
    promtail --> loki
    prometheus --> grafana
    loki --> grafana
設定ハイライト
# prometheus.yml
scrape_configs:
  - job_name: 'bots'
    static_configs:
      - targets: ['localhost:9100','localhost:8000']   # Node & Python
remote_write:
  - url: https://prometheus-blocks-prod-us-central1.grafana.net/api/prom/push
    basic_auth:
      username: <instance_id>
      password: <api_key>
7-4. バンド幅・レイテンシチェックの落とし穴
| チェック | 方法 | 罠と対策 | 
|---|---|---|
| Ping → Exchange | mtr -rw bybit.com | 時間帯依存 > 夜間に ±70 ms 変動 | 
| WS リアル RTT | ping ws://...inside bot log | VPS→SGDC 200 ms超であれば MM 戦略アウト | 
| 帯域上限 | Provider spec vs iperf3 | “1 Gbit”表記でも Burst → 継続 200 Mbit | 
8. CI/CD・セキュリティ・運用自動化
8-1. GitHub Actions → self-host runner 連携
name: Build & Deploy
on:
  push:
    branches: [main]
jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - run: docker build -t bot:${{ github.sha }} .
      - run: docker save bot:${{ github.sha }} | gzip > bot.tar.gz
      - uses: actions/upload-artifact@v4
        with: {name: image, path: bot.tar.gz}
  deploy:
    runs-on: self-hosted   # VPS 内に runner
    needs: build
    steps:
      - uses: actions/download-artifact@v4
      - run: gunzip -c image/bot.tar.gz | docker load
      - run: docker compose up -d --no-deps bot
8-2. SBOM と脆弱性スキャンを bot 横断で共有
| ツール | 役割 | 実行例 | 
|---|---|---|
| Syft | SBOM 生成 (CycloneDX) | syft . -o cyclonedx-json > sbom.json | 
| Grype | イメージ CVE スキャン | grype podman:bot:${SHA} | 
| Trivy | IaC + Image + Secret scan | trivy fs --scanners config,secret . | 
成果物を GitHub Security タブで集中管理 → 週次 Dependabot レポート。
8-3. Incident Runbook & Slack アラート設計
sequenceDiagram
    Bot ->> Prometheus: metric{position_dd, high_temp}
    Prometheus ->> Alertmanager: firing rule
    Alertmanager ->> Slack: webhook (ops-alerts)
    Slack ->> On-call: mention + runbook link
    On-call ->> Vault: fetch keys
    On-call ->> Bot: manual throttle / restart
| アラート例 | Expr | Threshold | 
|---|---|---|
| Drawdown | pnl_unrealized < -0.05 * account_equity | 5 % | 
| Rate-limit | api_http_429_total > 20(5 m) | 20 req | 
| Temperature | node_hwmon_temp_celsius > 80 | 80 ℃ | 
Runbook checklist
- Slack 通知受信 → 異常メトリクスを Grafana で確認
- kubectl exec -it bot -- python tools/pause.pyで緊急停止
- 原因別フロー:Rate-limit / Liquidity 欠損 / ポジション競合
- Jira ticket 作成 → Post-mortem 24 h 内提出
まとめ
- 最小コスト → 収益拡大に応じてスケールするクラウド設計で、マシン・人・学習コストを最適化。
- IaC, モニタリング, セキュリティを最初から仕組みに落とし、“壊れても 1 コマンドで復旧” を担保。
- Incident Runbook とフィーチャーフラグで トラブルを局所化し、25 分以内に緊急停止を徹底――これが個人でも戦える運用体制の鍵です。
9. 収益とコストのバランスシート
9-1. サーバー費用と期待 PnL シミュレーション表
| フェーズ | 稼働 Bot | 月額インフラ費† | 想定月次 PnL* | キャッシュフロー | コメント | 
|---|---|---|---|---|---|
| P0 : 検証 | Recorder + 1 Bot (低レバ) | ¥0 – ¥1,500 (Oracle Free / Hetzner CX11) | ¥5,000 | +¥3,500 | ローカル中心。実運用は 0.1 – 0.5 BTC 相当で試運転 | 
| P1 : 初期黒字ライン | 2 Bot(MM + Arb) | ¥3,000 | ¥25,000 | +¥22,000 | VPS を 1 台追加。資金 200 k JPY | 
| P2 : スケール | 3 Bot + Recorder 専用 | ¥6,000 | ¥60,000 | +¥54,000 | TimescaleDB 別ノード / Grafana Cloud | 
| P3 : 自走 | 5 Bot + 冗長ノード | ¥15,000 | ¥200,000 | +¥185,000 | K8s クラスタ 3 × CPX31・CI Runner 内蔵 | 
†税込み概算(2025-07 現在)。*PnL はバックテスト中央値 –20 % を安全係数として採用。
9-2. “黒字ライン” に乗るまでのフェーズ分け
flowchart LR
    classDef phase fill:#e0f0ff,stroke:#007acc,stroke-width:1px,rx:6,ry:6
    p0(["Phase 0<br/>検証<br/>2025-07-01 → 07-14"]):::phase
    p1(["Phase 1<br/>初期黒字<br/>after p0 21d"]):::phase
    p2(["Phase 2<br/>スケール<br/>after p1 30d"]):::phase
    p3(["Phase 3<br/>自走<br/>after p2 45d"]):::phase
    p0 --> p1 --> p2 --> p3
10. まとめと次の一手
10-1. 「高速に試し、失敗を安く捨てる」文化
- Recorder ファーストで “市場を観測してから動く”
- プラグイン戦略 + フィーチャーフラグでホットスワップ
- 三層+サービス層でテストと撤去を 1 日以内に
- IaC & 監視の自動化で「壊れても 1 コマンド復旧」
- 収益↔コスト可視化で“黒字ライン”を常に把握
10-2. 今後の拡張ロードマップ
| 新領域 | なぜ効くか | 先行タスク | 
|---|---|---|
| MEV / アトミック arb CEX-DEX | MEV は寡占化が進み “大手 2–3 社集中” 状態。効率的 Gas SDK や Flashbots RPC が整備されつつあり、参入障壁は高いがチャンスは残る。 | Flashbots RPC 対応・カスタム Bundle 生成、Sandwich 防御実装 | 
| NFT ミント Sniper | L2 活性は上昇も NFT 流通は低調。ミントスナイプは ゲーム / 低 Gas L2 に限定した“小口・高速”狙いが現実的。 | ERC-721c 対応、Mint Guard bypass リサーチ、ガス上限最適化 | 
| Liquidation Bot (Hyperliquid) | Hyperliquid は既存オンチェーン清算を改良中。正式 “v3” 発表待ちで要観測。 | Keeper ネットワーク参加、SDK 追随、ドキュメント監視 | 
| ポイントファーミング | 取引・決済・ステーキングが 共通ポイント化する動きが顕著。APR 最適化アルゴに優位性。 | 各取引所 API でポイント残高取得 → ポートフォリオ最適化アルゴ | 
アクションプラン(ざっくり版)
| フェーズ | 期間目安 | 主要テーマ | ゴール/成果物 | 
|---|---|---|---|
| Phase A:情報収集 & ミニ PoC | 1 – 2 週 | - MEV/CEX-DEX 寡占状況の詳細調査 - Hyperliquid 清算 v3 の公式動向ウォッチ - L2 NFT ミント市場のスナップショット取得 | • 主要プロジェクトの API / ドキュメント整理(Notion) • Gas 最適化 SDK/Flashbots RPC のサンプル bundle 送信成功 • 各取引所ポイント API の仕様表 | 
| Phase B:低リスク・低コスト試作 | 2 – 4 週 | - MEV アトミックアービトラージの“ペーパーシミュレーション” - NFT Sniper の L2 限定 prototype(testnet ミント) - Hyperliquid Keeper クライアント stub | • Jupyter notebook で損益計算 + シュミレーション結果 • 失敗時ロールバック用 Feature Flag 用意 • PoC 用 Vault Secret 登録済み | 
| Phase C:小規模本番 & 観測 | 4 – 6 週 | - MEV bot を 0.1 ETH 限度で mainnet dry-run - NFT Sniper を “低 Gas / 限定ペア” で運用 - 清算 bot を testnet Keeper へ登録 | • Prometheus メトリクスラベル: strategy_id,alpha_id• Slack アラート閾値:PnL < −0.01 ETH / 4 h | 
| Phase D:評価 & 拡張判断 | 1 週 | - 週間 PnL / コスト表と比較 - 競合&寡占度モニタリング | • “続行 / 改修 / 廃止” レポート • 続行が決まった bot は Container 化 → IaC へ統合 | 
横断タスク(Phase A–D で逐次実施)
- Secrets 統合 ― Vault に mev_bot,nft_sniper,liq_botの AppRole を発行。
- Rate-limit Guard ― Envoy Lua で token-bucket、上限超過時は自動 back-off。
- Cost Tracker ― Google Sheet 自動更新(Cloud Functions で Prometheus → Sheet)。
- 依存チェック CI ― pydeps逆依存ルールを新 bot にも追加。
次の“一歩”チェックリスト
- Flashbots RPC で自アカウントから 1 件 bundle 成功 → TxHash ログ保存
- ERC-721c ミントコントラクトを Hardhat テストネットでリプレイ・bypass ケース検証
- Hyperliquid Keeper テストジョブを登録し、job_statusPolling が動くことを確認
- ポイント API で Bybit / Backpack のポイント残高取得スクリプトを Cron 登録
原則:「小さく作って速く試す、ダメなら安く捨てる」――このサイクルが維持できるかどうかが、次の拡張フェーズで資金と時間を溶かさない最大の鍵です。
10-3. 今後のアクション:自分の開発フロー点検チェックリスト
- ファイル行数警告フックは設定していますか?
- Recorder → EDA → Go/No-Go のパイプラインは 30 分で回せますか?
- Secrets / Rate-limit を中央で制御できていますか?
- クラウド費用と期待 PnL を Spreadsheet で即更新できる仕組みは?
まずは 1 日で「Recorder 専用 VPS を IaC で立ち上げ、Prometheus にメトリクスが流れる」までをやってみましょう。これが速く出来れば、Bot 開発のチューニングも必ず加速します。
