0. はじめに
本記事では、Pythonを用いて本格的なバックテスト環境を構築する方法を解説します。Walk-Forward Analysis、Optunaによる最適化、さらに自動売買までを一貫して扱います。再現性のあるバックテスト環境を作ることで、戦略の信頼性を高め、実運用に耐えられるロジックを設計できます。
目次
- バックテスト基盤の設計方針
- Walk-Forward Analysisの実装
- Optunaを用いたハイパーパラメータ最適化
- 売買戦略の実装例(Python)
- 自動売買システムへの接続
- まとめ
1. バックテスト基盤の設計方針
バックテスト環境は以下の3要素を満たす構成が望ましいです。
- ① 再現性:いつ走らせても同じ結果が得られる
- ② 拡張性:複数の戦略・銘柄で使い回せる
- ③ 自動化:Walk-Forward や最適化を自動で回せる
次のような構成が一般的です。
data/
└─ asset.csv
modules/
├─ backtester.py
├─ strategy.py
└─ optimizer.py
app.py
2. Walk-Forward Analysisの実装
Walk-Forward Analysis(WFA)は、次の手順で進みます。
- 過去データを複数の期間(ウィンドウ)に分割します
- 各期間ごとに最適化 → その直後の期間で検証します
- これを繰り返してロールフォワードします
実装例(Python)
import pandas as pd
def walk_forward(data, train_size=0.7, step=50, strategy_class=None):
results = []
for start in range(0, len(data) - step, step):
train = data.iloc[start:start + int(step * train_size)]
test = data.iloc[start + int(step * train_size):start + step]
model = strategy_class()
model.fit(train)
perf = model.evaluate(test)
results.append(perf)
return results
3. Optunaを用いたハイパーパラメータ最適化
Optunaは強力なハイパーパラメータ最適化フレームワークです。トレード戦略においては、以下のような値を最適化できます。
- EMA・SMA の期間
- ATR 係数
- エントリー閾値
- 利確・損切り幅
Optuna最小構成コード
import optuna
def objective(trial):
ema_k = trial.suggest_int("ema_k", 5, 50)
atr_k = trial.suggest_int("atr_k", 5, 30)
strategy = MyStrategy(ema_k=ema_k, atr_k=atr_k)
result = backtest(strategy)
return result["profit_factor"]
study = optuna.create_study(direction="maximize")
study.optimize(objective, n_trials=50)
print(study.best_params)
4. 売買戦略の実装例(Python)
今回はシンプルなEMAクロスのエントリー戦略の例を紹介します。
import numpy as np
class MyStrategy:
def __init__(self, ema_k=20, atr_k=14):
self.ema_k = ema_k
self.atr_k = atr_k
def fit(self, df):
df["EMA"] = df["Close"].ewm(span=self.ema_k).mean()
df["ATR"] = (df["High"] - df["Low"]).rolling(self.atr_k).mean()
self.df = df
def evaluate(self, test_df):
test_df = test_df.copy()
test_df["EMA"] = test_df["Close"].ewm(span=self.ema_k).mean()
test_df["signal"] = test_df["Close"] > test_df["EMA"]
# profit計算(簡易版)
test_df["ret"] = np.where(test_df["signal"], test_df["Close"].pct_change(), 0)
pf = test_df["ret"].sum() / abs(test_df["ret"][test_df["ret"] < 0].sum() + 1e-9)
return {"profit_factor": pf}
5. 自動売買システムへの接続
最終的に自動売買へ接続するには、次のステップを踏みます。
- バックテスト → 最適化 → Walk-Forward の自動化
- 最適パラメータでリアルタイム実行
- ブローカーAPI(MT5 / Oanda / Binance など)へ注文送信
MT5注文送信のPython例
import MetaTrader5 as mt5
mt5.initialize()
def send_order(symbol, lot, order_type):
request = {
"action": mt5.TRADE_ACTION_DEAL,
"symbol": symbol,
"volume": lot,
"type": order_type,
"magic": 1001,
}
return mt5.order_send(request)
6. まとめ
本記事では、Pythonで本格的なバックテスト環境を構築するための技術を体系的に紹介しました。
- Walk-Forward Analysis により過剰最適化を防ぎます
- Optuna によるハイパーパラメータ最適化で戦略を強化できます
- 自動売買へ接続することで実運用に活かせます
本構成を基盤として、より高度なAI戦略(LSTM, Transformer, PPOなど)も統合可能です。