Academyに戻る
STEP 3

バックテストの作成

集めたデータを使って実際に戦略をバックテスト。損益やリスクを可視化し、アイデアの手応えを確かめます。

1. データの準備

pandas/numpyを使って約定・板データの時系列を整形します。

# 必要なライブラリのインポート
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
# データの読み込み
df = pd.read_csv('trades.csv')
df['timestamp'] = pd.to_datetime(df['timestamp'])
df = df.set_index('timestamp')

ポイント

  • タイムスタンプをdatetime型に変換し、インデックスに設定
  • 欠損値の処理やデータのクリーニングを実施
  • 必要に応じてリサンプリング(例: 1分足、5分足)

2. 戦略の実装

売買ルールを実装して売買タイミングを判定します。

# シンプルな移動平均クロス戦略の例
df['sma_short'] = df['price'].rolling(window=10).mean()
df['sma_long'] = df['price'].rolling(window=30).mean()
df['signal'] = 0
df.loc[df['sma_short'] > df['sma_long'], 'signal'] = 1
df.loc[df['sma_short'] < df['sma_long'], 'signal'] = -1

実装のポイント

  • シグナル生成ロジックを明確に定義
  • ポジションサイズの管理
  • エントリー・エグジット条件の実装

3. 可視化と分析

手数料・スリッページを考慮しながら損益・DDなどをグラフ化(matplotlib/plotly等)します。

# 損益計算(手数料・スリッページ考慮)
fee_rate = 0.001 # 0.1%
slippage = 0.0005 # 0.05%
df['pnl'] = df['signal'].shift(1) * df['price'].diff()
df['pnl'] -= abs(df['signal'].diff()) * df['price'] * (fee_rate + slippage)
df['cumulative_pnl'] = df['pnl'].cumsum()
# 可視化
plt.figure(figsize=(12, 6))
plt.plot(df.index, df['cumulative_pnl'])
plt.title('累積損益')
plt.show()

分析指標

  • 累積損益(PnL)の推移
  • 最大ドローダウン(Max Drawdown)
  • 勝率、平均損益
  • シャープレシオ、ソルティノレシオ

4. インタラクティブ教材

ブラウザ上で直接Pythonコードを実行できる環境です。バックテストのコードを実際に試しながら学習できます。

使い方

  • 上記のエディタでバックテストのコードを直接実行できます
  • pandas、numpy、matplotlibなどの主要ライブラリが利用可能です
  • データの準備から可視化まで、全てのステップを試すことができます
  • 初回ロード時は少し時間がかかることがあります(2回目以降はキャッシュで高速化)

サンプルノートブック

JupyterLiteのファイルブラウザから 03_backtest.ipynb を開くと、バックテストの完全なサンプルコードが含まれています。

このノートブックには以下の内容が含まれています:

  • バックテストAPIから価格データを取得
  • データの準備と整形(pandas)
  • 移動平均クロス戦略の実装
  • 手数料・スリッページを考慮した損益計算
  • matplotlibを使った可視化
  • パフォーマンス指標の計算

サンプルコード:バックテストAPIの呼び出し

以下のコードをJupyterLiteのエディタで実行すると、バックテスト用の価格データを取得できます:

import json
from pyodide.http import pyfetch
url = "/api/backtest/hyperliquid" # 同一オリジンなので相対パス推奨
payload = {
"config": {
"startDate": "2024-01-01T00:00:00Z",
"endDate": "2024-01-31T23:59:59Z",
"timeframe": "1h", # "1h", "4h", "1d" から選択
"symbol": "BTC" # オプション(省略可)
}
}
res = await pyfetch(
url,
method="POST",
headers={"Content-Type": "application/json"},
body=json.dumps(payload),
)
data = await res.json()
data

このAPIは価格データ(priceSeries)を返します。取得したデータを使って、移動平均クロス戦略などのバックテストを実装できます。

上記のエディタが表示されない場合は、以下のリンクから直接開いてください:

JupyterLiteを別ウィンドウで開く