はじめての方も読めるよう、専門用語はカンタンな言葉に言い換えながら解説します。「なんとなく聞いたことある」レベルの知識で大丈夫です。
- EA = Expert Advisor。MT4/MT5上で動く自動売買プログラム
- Optuna = パラメータ最適化を自動化するPythonライブラリ
パラメータ最適化 実装
Optuna で EA パラメータ最適化 — 過剰最適化を避ける実装テクニック
最終更新: 2026-05-05
Optuna は強力ですが、使い方を誤ると過剰最適化を加速します。実際の運用で得た「やってよかった3つの実装」と「やめた方がいい1つの落とし穴」を整理します。
過剰最適化が起きるメカニズム
Optuna は目的関数の値を最大化するパラメータを探索します。バックテストPFを目的関数にすると、Optuna は「過去データに最も合うパラメータ」を返してきます。これは未来のデータでは多くの場合、性能が劣化します。
やってよかった実装 1: Walk-Forward を目的関数の中に入れる
単一期間の PF ではなく、3 つに分けた期間それぞれの PF の最小値を目的関数にします:
def objective(trial):
p = {
"atr_sl": trial.suggest_float("atr_sl", 1.5, 4.0),
"atr_tp": trial.suggest_float("atr_tp", 1.5, 5.0),
"rsi_period": trial.suggest_int("rsi_period", 7, 21),
}
pfs = []
for start, end in [(2023, 2024), (2024, 2025), (2025, 2026)]:
df = load_data(start, end)
pf = backtest(df, p)
pfs.append(pf)
return min(pfs) # 最弱期間の値を返す
この変更だけで、本番投入後の劣化幅が体感で約半分になりました。
やってよかった実装 2: パラメータ感度の罰則項
探索結果のパラメータが「微妙に動かすと結果が崩れる」尖ったピークだと、本番では再現しません。目的関数に罰則項を入れます:
def objective(trial):
p = sample_params(trial)
pf = backtest(p)
# ±5% のパラメータでもPFが大きく下がらないか
pf_minus = backtest({k: v*0.95 for k,v in p.items()})
pf_plus = backtest({k: v*1.05 for k,v in p.items()})
sensitivity = max(pf - pf_minus, pf - pf_plus)
return pf - sensitivity * 0.5
やってよかった実装 3: パラメータ数の上限
過剰最適化のリスクは概ね パラメータ数 × 試行回数 に比例します。パラメータは7個以下を上限とし、それ以上必要なら戦略を分けます。経験的にここを超えると本番劣化が顕著です。
やめた方がいい1つの落とし穴: study の使い回し
「前回の study を続きから再開する」は便利ですが、データが変わったときに過去の試行が偏った最適化を強制してきます。データが更新されたら新しい study を切るのが安全です。
実運用での Optuna 設定例
import optuna
study = optuna.create_study(
direction="maximize",
sampler=optuna.samplers.TPESampler(seed=42),
pruner=optuna.pruners.MedianPruner(n_startup_trials=20),
)
study.optimize(objective, n_trials=200, n_jobs=4, show_progress_bar=True)
print("Best:", study.best_params)
print("Value:", study.best_value)
結果の見方 (大事)
Optuna が出してきた「Best」をそのまま使う前に:
- パラメータ重要度 (
optuna.importance.get_param_importances) を可視化、上位2-3個に絞る - plot_contour で「平らで広い高地」を狙う (尖った頂上は避ける)
- OOS でテスト → 劣化が10%超なら採用しない
まとめ
Optuna は「過去に最も合う数字を返す機械」であり、それは本番では不利に働きます。Walk-Forward + 感度罰則 + パラメータ上限 + 新規study の4点セットで、過剰最適化を構造的に減らせます。万能ではないですが、再現性が大きく上がります。
コメントを残す