←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を別ウィンドウで開く↗