暗号資産のマーケットは、価格も仕様も 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 > Resourcescpus: 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 オプション or docker 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 開発のチューニングも必ず加速します。