## 概要
検証#1-9の全成果を1枚の自己完結HTMLダッシュボードに可視化。Chart.js(CDN)で4ビュー。**Tailscale内部に常設(PM2 trade-dashboard)**。

## アクセス(常設・Tailscale接続端末から)
**http://100.115.94.5:8400/dashboard.html**
- PM2: `trade-dashboard` (id:17, port 8400, Tailscale IP bind)
- ルート `/` は dashboard.html に302リダイレクト

## ファイル構成(/home/ubuntu/workspace/trade-backtest/)
| ファイル | 役割 |
|---------|------|
| dashboard.html | 配信HTML(データ埋込済み・21KB) |
| serve_dashboard.py | 配信サーバー(Tailscale IP:8400にbind) |
| run_dashboard.sh | PM2用bashラッパー(後述の罠回避) |
| gen_dashboard_data.py | バックテスト→dashboard_data.json生成 |
| build_dashboard.py | dashboard_data.json→dashboard.html組立 |

## データ更新手順(市場/戦略を追加したとき)
```bash
cd /home/ubuntu/workspace/trade-backtest
./venv/bin/python gen_dashboard_data.py # 最新データ取得→JSON再生成
./venv/bin/python build_dashboard.py # HTML再組立
# PM2は静的配信なので再起動不要(ブラウザ再読込でOK)
```

## PM2起動の罠(重要・instinct)
- **PM2でPythonスクリプトを直接 `--interpreter python` 起動すると、bunのフォークコンテナ(ProcessContainerForkBun.js)がPythonをJSとしてパースし `SyntaxError: unterminated string literal` で起動失敗ループ**(restarts激増・errored)
- 回避策: **bashラッパー(run_dashboard.sh)を作り `pm2 start run_dashboard.sh --interpreter bash` で起動**。bashが素直にvenv pythonを呼ぶので干渉しない
- 既存instinct「PM2でbunスクリプト起動前にinterpreter衝突確認」と同根

## 4ビュー
1. 市場×戦略ヒートマップ(9市場×4戦略の期待値%・緑赤グラデ)
2. RRプラトー曲線(AAPL/金/原油/USDJPY)
3. 資産曲線(9市場の累計リターン%)
4. 検証#1-9サマリー表

## 検証
Playwrightで実ブラウザ動作確認済み(Chart.js 2インスタンス・資産曲線canvas幅1190px×9系列・JS実行エラー0件)。Tailscale経由 HTTP 200・正常HTML配信を確認。

## 関連
- LLM Wiki id=447(USDJPY発見), id=448(多市場確定), id=430-446(検証#1-5)