コンテンツにスキップ

Forward Sim(フォワードシム)入門:何をして、どう評価するのか(非専門家向け)

このページは、AEGISオプション取引の前提知識がない人でも、Forward Sim が

  • どんなパラメータを
  • どういう「分布」から作って
  • どう動かして
  • どう評価・比較して
  • 最終的に何を「良い候補」として残すのか

を追えるように、図を中心に説明します。


0. まず結論:Forward Sim は「パラメータ自動チューニング装置」

Forward Sim はざっくり言うと、

  1. 「取引ルールのつまみ(パラメータ)」をたくさん作る
  2. それぞれをシミュレーションで走らせる
  3. 儲かりやすさ(Return)事故りにくさ(最大DD)で採点する
  4. 良いもの同士を“掛け合わせて”次世代の候補を作る
  5. これを繰り返して 「良さそうな候補群(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)で全体のアクセス量を抑えます。