IBKR 移行分析 — Client Portal API + IBeam + AWS 完結アーキテクチャ¶
作成日: 2026-04-12 対象: LT_RC (Saxo LIVE 実資金トレード) のスリッページ検証と移行可否判断 関連: スリッページ検証戦略 / MM 気配の仕組み
1. 背景 — なぜ IBKR を検討するのか¶
LT_RC は 2026-03 末以降、Saxo multileg API で credit spread の combo bid が頻繁に 0 を返し、mid fallback 経路で 46 件試行 / submit 0 / fill 0 の dead-letter 状態に陥った。live_quote_collector で 5,393 件の snapshot を収集した結果:
- Polygon mid vs Saxo combo bid の CR 乖離平均 = 0.269
- Saxo Ticket #16633 は COB routing の質問 (Q3) に未回答のまま Japan 窓口経由で再エスカレーション中 (2026-04-10)
ここで問題を 2 つに切り分ける必要がある:
| 仮説 | 検証に必要なデータ |
|---|---|
| A: Saxo 独自 pricing が NBBO から乖離している (broker 固有問題) | 別 broker の combo quote との比較 |
| B: Credit spread の combo bid は市場全体として薄い (市場構造問題) | NBBO 基準の独立ソース |
どちらであっても、IBKR を参照実装として横に置く ことで決着がつく。
2. IBKR Client Portal Web API の実態¶
2.1 "TWS 不要" は本当、"Java 不要" は嘘¶
| コンポーネント | 必要 | 説明 |
|---|---|---|
| TWS (GUI アプリ) | ❌ | Trader Workstation のデスクトップ取引画面は不要 |
| Client Portal Gateway (JAR) | ✅ | REST エンドポイント localhost:5000/v1/api/ を公開する軽量 Java プロセス |
| Java Runtime | ✅ | Gateway JAR が要求 |
| API クライアント側 | ❌ | Rust / Python / Node 任意 |
つまり TWS/IB Gateway デスクトップアプリが要らない というだけで、Java ランタイム依存は残る。Java を完全に外す唯一の手段は OAuth 1.0a / 2.0 だが、retail 向けには原則降りてこない (third-party vendor approval が必要)。
2.2 IBeam で Java 依存を 1 コンテナに閉じ込める¶
Voyz/ibeam は CP Gateway JAR + Chrome headless + Selenium auto-login を 1 Docker image に包んだ OSS。
- 起動時に IBKR ログインページへ credentials を自動注入
- Session が切れたら自動で再ログイン
- 常駐プロセスとして port 5000 を公開
AEGIS 側の Rust ランタイムは IBeam コンテナに対して REST で叩くだけで済み、Java を意識する必要がゼロになる。
3. AWS 完結アーキテクチャ提案¶
┌─────────────────────────────────────────────────────┐
│ AWS us-east-1 VPC │
│ │
│ ┌──────────────────────┐ Service Discovery │
│ │ aegis-ibkr-gateway │ ibkr-gw.aegis.local │
│ │ (Fargate Service) │──────┐ │
│ │ │ │ │
│ │ IBeam image │ │ │
│ │ ├─ CP Gateway JAR │ ▼ │
│ │ ├─ Chrome headless │ ┌──────────────────┐ │
│ │ └─ Auto re-auth │ │ aegis-lt-runtime │ │
│ │ │ │ (Fargate Task) │ │
│ │ :5000 │◄──│ │ │
│ │ │ │ Rust LT runtime │ │
│ │ always-on (0.25vCPU │ │ EventBridge 起動 │ │
│ │ / 0.5GB, ~$6.5/mo) │ └──────────────────┘ │
│ └──────────────────────┘ │
│ │ │
│ ▼ │
│ ┌──────────────────────┐ │
│ │ Secrets Manager │ │
│ │ ├─ IBKR_USERNAME │ │
│ │ ├─ IBKR_PASSWORD │ │
│ │ └─ IBKR_TOTP_SECRET │ │
│ └──────────────────────┘ │
└─────────────────────────────────────────────────────┘
- aegis-ibkr-gateway: Fargate Service, desired=1, always-on on-demand (Spot 禁止)
- aegis-lt-runtime: EventBridge で市場時間のみ起動される ephemeral task
- Service Discovery: AWS Cloud Map で
ibkr-gw.aegis.localを内部 DNS に - Secrets: KMS 暗号化 + IAM 最小権限。IBKR Pro 口座で TOTP 2FA 必須
4. 現実的な落とし穴 4 つ¶
設計前に認識すべき制約
-
2FA 方式は TOTP 必須 IBKey モバイルプッシュ通知だと毎回スマホ承認が要り、AWS 上の無人運用は破綻する。IBKR 口座設定で TOTP (Google Authenticator 互換) を明示的に有効化しておく必要がある。
-
Session expiry は避けられない CP Gateway は
/tickleで延命しても ~24 時間で強制再認証が入る。IBeam が自動で再ログインするが、その瞬間 API は数秒〜数十秒落ちる。Rust 側の ordering layer は retry / idempotent 前提で設計する必要がある。 -
Fargate platform upgrade / task 入れ替え Spot interruption で session ゼロから復旧する窓が生まれる。On-demand Fargate を採用し Service desired=1 にしておけば自動再起動される。月額 $6.5 の追加コストを払う価値はある。
-
Credentials を平文で Secrets Manager に格納する IBeam の設計上、username / password / TOTP secret をすべて保存する必要がある。KMS + IAM で最小権限化した上で、監査ログを有効化する。IBKR Pro アカウント以外では headless 自動ログインは TOS 上グレー。
5. 資金ゼロで実データを取る 3 つの手段¶
現時点で IBKR 口座に投入可能な資金は限定的なので、「実口座・実 API を使った virtual trading」で slippage 観測データを積む必要がある。
| 手段 | capital 要求 | 得られるデータ | 実装負荷 |
|---|---|---|---|
| whatIf = true | ゼロ | margin impact + expected fill price (注文を投げずに preview) | 小 |
| Paper Trading 口座 | ゼロ | 実市場データ + 仮想フィル、$1M 仮想資金 | 中 |
| Market data snapshot | ゼロ | bid/ask/last/mid のみ (注文概念なし) | 極小 |
推奨: whatIf + Paper 併用
- quote / combo pricing 比較だけなら whatIf + snapshot で十分
- "実際にフィルされた価格" の分布統計 が欲しいなら Paper 口座を並行稼働
- Paper 口座は live 口座保有者に無料発行され、market data subscription も共有される
6. なぜ IBKR の方がスリッページ観測に有利か¶
| 観点 | Saxo (現) | IBKR |
|---|---|---|
| Quote 基準 | 独自 IB pricing (market maker 経由) | NBBO 直参照 (consolidated feed) |
| Combo pricing | multileg API、combo bid 0 頻発 | BAG order + conidex、Smart routing で leg-wise best-ex |
| Order preview | ❌ 実注文しないと価格不明 | ✅ whatIf で margin + fill 推定を事前取得 |
| 公開 execution 統計 | ❌ 非公開 | ✅ SEC Rule 605/606 月次レポートで execution quality を開示 |
| 深さ | L1 相当 | L2 (depth book) 取得可能 |
| Atomic multileg fill | ✅ 保証される | ⚠️ Smart routing では leg 分離の可能性。direct routing (CBOE COB 等) で atomic 可能だが fill rate は落ちる |
IBKR の Smart router は leg ごとに別 exchange (BOX, CBOE, MIAX...) へ振って best-ex を狙う。credit spread の fill 価格は IBKR の方が良いはず — ただし atomic fill と引き換え。LT_RC の銘柄群 (SPY / QQQ / IWM / large cap) なら Smart routing で流動性上の問題はない。
7. 3-Track Shadow 実験設計¶
Polygon provider (reference NBBO mid)
│
┌───────────┼───────────┐
▼ ▼ ▼
┌─────────┐ ┌─────────┐ ┌─────────┐
│ Saxo │ │ IBKR │ │ IBKR │
│ LIVE │ │ whatIf │ │ Paper │
│ (現行) │ │ (新規) │ │ (新規) │
│ │ │ │ │ │
│ 実約定 │ │ preview │ │ 仮想 │
└─────────┘ └─────────┘ └─────────┘
│ │ │
▼ ▼ ▼
quote_samples/live_spread_quotes.jsonl (拡張)
│
▼
diff 分析:
Polygon_mid vs Saxo_combo_bid vs IBKR_combo_bid vs IBKR_paper_fill
5 営業日 parity 観測で 3 つのシナリオを判別可能:
| パターン | 解釈 | アクション |
|---|---|---|
| IBKR ≈ Polygon、Saxo 乖離 30% | Saxo 独自 pricing が原因 | IBKR 本格移行を正当化、Ticket 16633 に決定打データ添付 |
| IBKR ≈ Saxo ≈ Polygon から 30% 乖離 | 市場全体の構造問題 | broker 変えても無駄、execution model calibration で解決 |
| IBKR ≈ Polygon、Paper fill 乖離 | Smart routing は quote 良いが fill 悪い | direct routing (CBOE COB) を試す、broker 選定は慎重に |
8. 意思決定マトリクス¶
| 項目 | Saxo (現行維持) | IBKR + IBeam (移行) | ハイブリッド併走 |
|---|---|---|---|
| Gateway 場所 | Synology (Token Keeper) | AWS Fargate | AWS + Synology |
| 月額運用コスト | 既存インフラ内 | ~$10-15 | ~$15-20 |
| Credit spread 実装 | multileg API (現行悩み中) | BAG order + conidex (未検証) | 両方 |
| Slippage 観測精度 | Polygon 経由の推定のみ | NBBO 直参照 + whatIf | 最高 (比較可能) |
| 切替コスト | ゼロ | broker adapter + IBeam + TOTP 設定 | 同左 |
| Ticket 16633 への影響 | 回答待ち継続 | データ付きで再エスカレ | データ付きで再エスカレ |
| LIVE 口座切替 | 不要 | IBKR 本格運用 (資金移動) | 当面不要 |
推奨: ハイブリッド併走 を 4-6 週間走らせた上で決定する。Saxo LIVE を止めずに IBKR shadow を追加するだけなので、実損ゼロでデータが溜まる。
9. 次のアクション¶
- IBKR 口座で TOTP 2FA 有効化
- IBKR Paper Trading 口座申請 (live 口座保有者は無料、5 分)
- IBeam ローカル Docker 動作確認 (Mac で dry run、Fargate 移行前の sanity check)
-
aegis-ibkr-gatewayECS Task Definition + Fargate Service を IaC 化 - Rust 側に
broker::ibkr::adapterを実装 (BrokerProtocoltrait 準拠、Saxo と同型) -
quote_collectorを IBKR whatIf + snapshot 対応に拡張 - 5 営業日 parity 観測 → Saxo Ticket #16633 再エスカレ材料として活用
- parity 結果次第で Saxo 継続 / IBKR 本格移行 / 併走継続を判断
関連リンク¶
- Voyz/ibeam (GitHub) — IBKR CP Gateway 自動認証ラッパー
- IBKR Client Portal Web API v1.0 Documentation
- Trading Web API — Orders & BAG
- TWS API — Checking Margin Changes (whatIf)
- スリッページ検証戦略 — 既存の検証フレームワーク
- MM 気配の仕組み — Saxo combo bid の構造理解