←Academyに戻る
STEP 4
バックテスト通りの実装
設計したバックテストのロジックを実運用用コードに忠実に実装し、同一条件で動作比較します。
1. コードの移植
バックテスト用売買ロジック・損益計算処理を実装用コードへ正確に移植します。
# バックテストコードから実装コードへ
# 1. シグナル生成ロジックをそのまま移植
def generate_signal(price_data):
sma_short = price_data.rolling(window=10).mean()
sma_long = price_data.rolling(window=30).mean()
signal = 0
if sma_short > sma_long:
signal = 1
elif sma_short < sma_long:
signal = -1
return signal
移植のポイント
- バックテストと実装で同じロジックを使用
- パラメータ(移動平均の期間など)を一致させる
- 手数料・スリッページの計算も同じにする
2. 動作確認
本番環境またはテストネット上でシグナル・損益推移が一致するか確認します。
# 実装コードのテスト
# 1. テストネットで動作確認
test_results = run_backtest_on_testnet()
backtest_results = run_original_backtest()
# 2. 結果の比較
compare_results(test_results, backtest_results)
確認項目
- シグナルのタイミングが一致しているか
- エントリー・エグジット価格が一致しているか
- 損益計算が正確か
- 手数料・スリッページが正しく反映されているか
3. デバッグと修正
差異があればログや可視化等で原因を検証し、実装を修正します。
# ログ出力でデバッグ
import logging
logging.basicConfig(level=logging.DEBUG)
# 各ステップでログを出力
logger.debug(f"Signal: {signal}, Price: {price}")
logger.debug(f"Entry: {entry_price}, Exit: {exit_price}")
# 可視化で差異を確認
plot_comparison(backtest_pnl, live_pnl)
よくある差異の原因
- タイムスタンプのタイムゾーン処理の違い
- データの取得タイミングの違い
- 浮動小数点演算の誤差
- 実装時のロジックの誤り