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)

よくある差異の原因

  • タイムスタンプのタイムゾーン処理の違い
  • データの取得タイミングの違い
  • 浮動小数点演算の誤差
  • 実装時のロジックの誤り