Forward Sim(フォワードシム)入門:何をして、どう評価するのか(非専門家向け)¶
このページは、AEGIS や オプション取引の前提知識がない人でも、Forward Sim が
- どんなパラメータを
- どういう「分布」から作って
- どう動かして
- どう評価・比較して
- 最終的に何を「良い候補」として残すのか
を追えるように、図を中心に説明します。
0. まず結論:Forward Sim は「パラメータ自動チューニング装置」¶
Forward Sim はざっくり言うと、
- 「取引ルールのつまみ(パラメータ)」をたくさん作る
- それぞれをシミュレーションで走らせる
- 儲かりやすさ(Return)と事故りにくさ(最大DD)で採点する
- 良いもの同士を“掛け合わせて”次世代の候補を作る
- これを繰り返して 「良さそうな候補群(Pareto)」を残す
という仕組みです。
ポイント
「最強の1つ」を決めるのではなく、儲かりやすさと安全性のトレードオフを尊重して、複数候補(Pareto)を残します。
1. そもそも「パラメータ」って何?¶
取引戦略には、だいたい以下の“つまみ”があります。
- 利確(Profit Take): ある程度利益が出たら閉じる
- 損切り(Stop Loss): 大きく損が出る前に閉じる
- ポジションサイズ(Position sizing): どれくらいの大きさで建てるか
- フィルタ(Entry filters): どんな銘柄だけをエントリー対象にするか(例: IV Rankが高いときだけ)
Forward Sim はこれらのつまみを 多数パターン生成→評価します。
2. 用語(超・最小セット)¶
2.1 オプション(超ざっくり)¶
オプションは「将来、ある価格で買う/売る権利」。価格が動くと価値が変わります。
2.2 IV / IV Rank(ざっくり)¶
- IV(Implied Volatility): 市場が想定している“将来の動きやすさ”の目安
- IV Rank: 「今のIVが、過去と比べて高いか低いか」を 0〜1(または0〜100%)で表すような指標
Forward Sim では「IV Rankがある範囲にあるときだけエントリー」などに使います。
2.3 Return / Drawdown(DD)¶
- Return: 期間トータルの成績(増えた/減った)
- 最大ドローダウン(Max Drawdown, MaxDD): いちばん落ちた局面の最大下げ幅(痛さ)
「儲かるけど暴れる」か「儲けは控えめだけど安定」か、というトレードオフが出ます。
3. Forward Sim の全体像(入力→評価→出力)¶
flowchart TD
User[ユーザー] -->|期間・探索設定| GA[GA_NSGA2]
GA -->|候補パラメータ生成| Candidate[IndividualParams]
Candidate --> Eval[評価_SubprocessBT]
Eval --> Metrics[指標_Return_MaxDD]
Metrics --> GA
GA -->|世代ごとに保存| Artifacts[成果物_CSV_JSON_ログ]
Artifacts --> Review[比較_選定_人が判断]
ここでのポイントは2つです。
- 候補パラメータの作り方が「分布+進化」になっている
- 評価は サブプロセスで回して、評価同士が汚染しないようにする(安全設計)
4. パラメータは「どう分布させて」作るのか¶
4.1 個体(IndividualParams)とは¶
Forward Sim の最小単位は「個体」です。個体は「パラメータセット」を意味します。
例(概念):
- 利確:
profit_take_pct - 損切り:
stop_loss_pct - サイズ:
position_size_mult - 1ポジ最大枚数:
max_contracts_per_position - IV Rankフィルタ:
iv_rank_min_for_beat/iv_rank_max_for_spear
4.2 初期個体の生成 = 「範囲(bounds)からランダム」¶
GAは、まず 初期集団(初期世代)を作ります。
このとき各パラメータは「現実的な範囲」を決めて、その範囲からランダムに引きます。
図にするとこうです。
flowchart LR
Bounds[各パラメータの範囲_bounds] --> Sampling[乱数でサンプリング]
Sampling --> Constraints[簡易制約で補正]
Constraints --> Individual[個体_パラメータセット]
「分布」について
現時点の生成は主に 一様乱数(uniform) と 整数乱数(例: max_contracts)です。
ただし 制約(例: ivr_max >= ivr_min + α)で“ありえない組み合わせ”を減らしています。
4.3 進化(次世代の作り方)= 「交叉+変異」¶
良い個体同士を混ぜたり、少しだけランダムに揺らすことで、次世代の候補を作ります。
flowchart TD
Parents[良さそうな親個体たち] --> Crossover[交叉_親Aと親Bを混ぜる]
Crossover --> Mutation[変異_少しだけランダムに揺らす]
Mutation --> Children[子個体_新しい候補]
5. NSGA-II(多目的GA)は何をしている?¶
NSGA-II は「儲け(Return)」と「最大DD(痛さ)」の 2つを同時に扱うGAです。
5.1 「1つに決めない」理由¶
Returnを上げるとDDも大きくなりやすい、というトレードオフがあるため、単一スコアで潰すと「偏った最適化」になりがちです。
5.2 Pareto(パレート)とは¶
ある候補Aが候補Bより Returnが高く、なおかつ DDが小さいなら、AはBより“完全に良い”です。
そうでない場合(ReturnはAが高いけどDDも大きい等)、優劣は一概に決められません。
「他より完全に負けていない候補群」を Paretoフロントと呼びます。
flowchart LR
A[候補A] --> Check{Return↑かつDD↓で\n他より完全に優れる}
B[候補B] --> Check
Check -->|Yes| Dominates[支配_dominates]
Check -->|No| Tradeoff[トレードオフ_Pareto候補]
5.3 NSGA-II ループ(全体)¶
flowchart TD
Init[初期集団を生成] --> Eval[各個体を評価_Return_DD]
Eval --> Rank[Paretoランク付け]
Rank --> Select[選択_多様性も維持]
Select --> Reproduce[交叉_変異で子を生成]
Reproduce --> Eval2[子を評価]
Eval2 --> Next[親+子から次世代を選ぶ]
Next --> Rank
6. Forward Sim は「どう動作して」評価される?¶
6.1 評価の単位は「サブプロセスでBTを実行」¶
各個体の評価は、サブプロセスでバックテストを回し、結果JSONを読み取ります。
flowchart TD
GA[GA評価ループ] --> Env[環境変数にパラメータを書き込む]
Env --> Subprocess[run_bt_parameterized.py を起動]
Subprocess --> Result[bt_result_*.json を出力]
Result --> Parse[JSONを読み取り]
Parse --> Fitness[Return_MaxDD をfitnessとして返す]
6.2 日次バッチ(概念)¶
Forward Sim の“時間の進め方”は、概念上は「1日ずつ」進みます。
flowchart LR
DayStart[DayStart_state読込] --> DataFetch[DataFetch_市場データ取得]
DataFetch --> Exit[ExitCheck_決済判定]
Exit --> Entry[EntryScan_新規判定]
Entry --> Record[Record_ログ取引記録]
Record --> DayEnd[DayEnd_指標更新]
7. 何を見れば「評価」できる?¶
7.1 まず見る指標(最低限)¶
現時点のGAは、基本的に 2つを見ます。
- Return(%): 大きいほど良い
- Max Drawdown(%): 小さいほど良い(痛さが小さい)
7.2 どうやって選ぶ?(実務の見方)¶
Paretoフロントに残った候補は「どれも一長一短」です。
そこで、例えば次の観点で“運用に合う”ものを選びます。
- 安全重視: DDが小さい候補を優先
- 攻め重視: Returnが高い候補を優先
- 現実性: 取引回数やコスト、流動性など(将来的に目的/制約に追加しやすい)
8. 成果物(出力)はどこにあり、何が入っている?¶
GA実行後、run_idごとに成果物が保存されます。
flowchart TD
RunDir["runs_runId"] --> PopCSV["population_genNNN.csv"]
RunDir --> ParetoCSV["pareto_front_genNNN.csv"]
RunDir --> Best["best_candidates.json"]
RunDir --> Summary["run_summary.json"]
PopCSV --> Review[比較_分析]
ParetoCSV --> Review
Best --> Review
Summary --> Review
9. 注意点(誤解しやすいところ)¶
9.1 シミュレーションは現実そのものではない¶
Forward Sim は「現実の市場データを使う」一方で、約定・スリッページ・発注制限などは単純化され得ます。
よって候補が良く見えても 本番運用前に追加検証が必要です。
9.2 データ取得には制限がある(レート制限/BAN)¶
複数プロセスが同じAPIキーを使うとBANや429のリスクがあります。
このため API予算(token bucket)で全体のアクセス量を抑えます。