はじめに
こんにちは。バックテストサービス Hawk-Backtester を個人で開発している者です。
このサービスは「戦略コードはローカルに留めたまま、ブラウザで分析できる」という設計と、「AI Agent が自律的にバックテストループを回せる」という2つを両立させることを目指して作りました。
前回の記事ではアーキテクチャ(Rust + WASM + WebSocket の構成)について書きましたが、今回は 実際にどう使うのか を、設計意図と合わせて丁寧に解説します。
Hawk-Backtester には 2 つの使い方があります:
- Backtest モード — ブラウザで Setup を組んで、ローカル Python 戦略と接続する手動モード
- with AI Agent モード — API Key を発行して、AI Agent に自律的にループを回させるモード
それぞれ、設計意図 → 使い方 → 見るべきポイント、の順に書きます。
Backtest モード — 1回ずつバックテストを回す手動ワークフロー
設計意図
Backtest モードは「自分で戦略を書き、自分で条件を決め、1回ずつ結果を見ながら育てていく」 クラシックなバックテスト体験 を提供するモードです。
このモードの設計で最も苦心したのは、「ブラウザUIなのに戦略コードが外に出ない」という矛盾をどう見せるか でした。普通のクラウド型バックテスターは「戦略コードをアップロード → サーバーで実行 → 結果表示」の流れですが、Hawk-Backtester はここが違います。
戦略コードは ユーザーのローカル Python プロセスの中だけ に存在し、ブラウザ内で動く WASM シミュレータと WebSocket 経由で通信します。「Connect to Local Strategy」ボタンが、その接続のトリガーです。
Setup 画面の読み方
まず、Backtest ページを開いた直後の画面です。
画面下部の「Setup」セクションで、シミュレーションの条件を設定します。設計上、このパラメータたちは すべて個人トレーダーが「後で検証を再現できる」ように 意識して配置してあります。
Standard(基本設定):
- Data Range(期間):バックテスト対象期間。開始日 〜 終了日
-
Step Interval(ステップ間隔):何ステップごとに戦略の
on_stepを呼ぶか - Leverage(レバレッジ):証拠金倍率
- Commission(手数料):取引コスト
Advanced(高度な設定):
- Max Concurrent Tickets:同時に保有できる最大ポジション数。デフォルト100
- Ticket Limit Margin:証拠金使用率の上限。0.80 なら 80% で新規注文ブロック
-
WebSocket IP / Port:ローカル Python プロセスが待ち受けるアドレス(デフォルト
127.0.0.1:8787) - Log Interval:ログ出力の間隔
- High Precision Mode:より精密な計算を行うモード(メモリ消費増)
右側にはアップロード済みのデータセット一覧があります。今回は Toyota_7203_1d.csv(トヨタの日足、Avg 725.9、24,661 ステップ)を選択しています。
データセットを選ぶと、チャートエリアにローソク足が表示されます。
左下には SMA20 / SMA30 / EMA / MACD / ADX / RSI のインジケータートグルがあります。これは戦略を考えるときの視覚補助で、実際の戦略判断は Python 側で行います。
戦略コードを書く
別ターミナルで hawk-bt をインストールします。
pip install hawk-bt
⚠️ PyPI には似た名前の
hawk-backtesterという別パッケージが存在しますが、当サービスで使うのはhawk-btです。
戦略コードはシンプルな Python クラスで書きます:
from hawk_bt import Strategy, connect
class MyStrategy(Strategy):
def on_step(self, ctx):
# 毎ステップ呼ばれる
# ctx に現時点の価格・ポジション・残高などが入っている
if ctx.close > ctx.ma_20 and ctx.position_size == 0:
return ctx.buy(size=10, sl=ctx.close * 0.98)
elif ctx.close < ctx.ma_20 and ctx.position_size > 0:
return ctx.close_position()
# WebSocket サーバーとして待ち受け
connect(MyStrategy(), host="127.0.0.1", port=8787)
スクリプトを実行すると、ローカルの Python プロセスが 8787 ポートで待機状態になります。
$ python3 my_strategy.py
[hawk_bt.hawk_engine] INFO: Listening on ws://127.0.0.1:8787
[hawk_bt.hawk_engine] INFO: Waiting for browser connection...
接続 → 実行
ブラウザに戻って、画面右下の 「Connect to Local Strategy」 ボタンを押します。
[hawk_bt.hawk_engine] INFO: Browser connected
ログにこう出れば接続成功です。あとはブラウザ側のシミュレーションが自動で進み、結果が表示されます。
結果の読み方:Time Series 分析
結果画面は 3 つのタブに分かれています。まず Time Series。
右側にサマリー数値が並びます。設計上、これらは 「集計指標だけで判断しないでほしい」という意図 を込めてあります。
Outcome(結果):
- Ending Balance / Equity:最終残高
- Total Return (Equity):トータルリターン(Equity ベース)
- Max Drawdown:最大ドローダウン
- Return / MaxDD:リターン対ドローダウン比(高いほど安定)
- vs B&H:Buy & Hold 戦略との差分
Exposure(エクスポージャー):
- Avg / Max Gross %:平均 / 最大の総エクスポージャー
- Avg Net %:平均のネットエクスポージャー(Long - Short)
- Time in Market:ポジション保有時間の割合
- Long / Short 比率
よくある「Total Return 385% すごい!」で終わらず、「Max Drawdown -75% は許容できるのか?」「Max Gross 785% までレバレッジ効かせた瞬間があるが、それはリスク管理として妥当か?」という議論ができるようにしています。
ツールチップで時点を掘る
チャート上にマウスを置くと、その時点の数値がツールチップで出ます。
これは設計時に「月単位の平均値ではなく、任意の時点の状態を詳細に見たい」というニーズから付けた機能です。急落した瞬間の Equity、Drawdown を即座に確認できます。
時系列 4 段構成
Time Series ビューは 4 段のパネルで構成されています。
- Outcome:Equity / Buy & Hold / Drawdown
- Exposure:Net / Gross Exposure / Margin Ratio
- Attribution:Long PnL / Short PnL / Cost PnL
- Action:Ticket / Token カウント
Attribution が特に重要 で、右サマリーに Long PnL / Short PnL / Profit Factor / Win Rate が出ます。「Long で稼いでいるのか、Short で稼いでいるのか、それとも両方から少しずつか」という戦略の稼ぎ頭を特定できる設計です。
Ticket Lifecycle — 個別取引まで可視化
さらにスクロールすると、Ticket Lifecycle が出てきます。
横軸が時間、縦軸が同時保有スロット、個々のバーが個別取引です。これは Hawk-Backtester の特徴機能 で、全取引を時間軸にマッピングして可視化します。
バーにマウスを置くと、個別チケットの詳細が出ます。
Ticket #648 (Short) のように、開始時刻・終了時刻・サイズ・エントリー価格・エグジット価格・PnL がすべて追跡可能です。
この設計の意図は、「集計指標では見えない敗因を探せるようにする」 こと。次の AI Agent モードで真価を発揮します。
Scatter Plot — 統計的に戦略を評価する
「Scatter Plot」タブに切り替えると、4 段の散布図が表示されます。
- Holding Time vs PnL:保有時間と損益の相関
- MAE vs MFE:最大含み損と最大含み益の関係
- Size vs PnL:サイズ別の損益
- Entry Price vs PnL:エントリー価格帯別の損益
右サマリーには Corr(lifetime, pnl)、Win Rate (Top 10%)、Mean MFE (Win) などの統計量が並びます。サイズが大きい取引は勝率が高いのか低いのか、高値圏エントリーと安値圏エントリーでは損益分布が違うのか、といった定量分析ができます。
Exit Analysis — なぜ決済されたかの内訳
最後に「Exit Analysis」。
- Exit Reason Ratio:TP(Take Profit)/ SL(Stop Loss)/ Strategy Close / Force Close の内訳
- TP Reached × SL Reached クロス表:TP と SL の両方に到達した取引の扱い
- P&L by Exit Reason:決済理由別の累積損益
設計上、TP と SL の両方に到達した取引(同じバーの中で両方触った場合)は、時系列で先に触った方で決済する実装にしています。このクロス表で、そういう「際どい取引」が何件あったかも可視化できます。
ここまでが Backtest モードです。ここからが AI Agent モード の話。
with AI Agent モード — Agent API で自律ループを実現する
設計意図
Backtest モードだけでも十分に機能しますが、バックテスト戦略の改善作業は人間がやると非常に時間がかかる という課題があります。
仮説を立てる → コード書く → 実行 → 結果見る → 改善案考える → コード書き直す → 実行 → ...
このループを AI Agent に任せられたら?という発想で作ったのが with AI Agent モード です。
ポイントは、Hawk-Backtester 本体は AI Agent そのものを含まない こと。AI Agent(Claude Code、Cursor、ChatGPT Agents など)は ユーザーが用意する 前提で、サービス側は 「Agent が扱いやすいように API とデータ形式を整備する」 役割に徹しています。
Agent Mode の UI
with AI Agent ページを開くとこの画面になります。
画面上部の 「Agent Mode」トグル を ON にすると、Agent API が有効化されます。
API Key 管理:
-
API Key:にhawk_101da34...のような Bearer トークンが表示 - Copy:クリップボードへコピー
- Regenerate Key:キー再発行(古いキーは失効)
- Revoke:キー無効化
認証は Authorization: Bearer <key> 形式の標準的な Bearer トークン方式です。
Return Trend — ループ全体の推移を見る
画面中段の Return Trend は、これまで実行したすべてのイテレーションの Return を折れ線でプロットしたものです。
画像では 192 sessions と表示されており、192 回ものバックテストが自動で回った ことになります。通常、人間が手動で 192 回バックテストを回すのは現実的ではありません。AI Agent に任せたからこその回数です。
折れ線の色分けで、成功(緑) と 失敗(赤) の分布が一目で分かります。たまに大きくスパイクしているのが「当たりの戦略」で、これを Iteration Timeline で深掘りします。
Iteration Timeline — 個別イテレーションを精査する
下半分の Iteration Timeline テーブルは、個別の実行を時系列で一覧できます。
| # | Strategy Note | Status | Return | Max DD | PF | Win Rate | Time |
|---|---|---|---|---|---|---|---|
| 5 | ep5 NN+MR ds=12 [138936:147636] v5 | succeeded | 0.13% | -1.54% | 1.04 | 47.6% | 22:16 |
| 4 | ep4 NN+MR ds=6 [185456:194156] v5 | succeeded | -0.81% | -6.01% | 0.69 | 9.1% | 22:15 |
| 3 | ep3 NN+MR ds=9 [160368:169068] v5 | succeeded | -1.55% | -5.05% | 0.66 | 47.1% | 22:14 |
| 2 | ep2 NN+MR ds=20 [149413:158113] v5 | succeeded | -0.19% | -2.47% | 0.97 | 54.5% | 22:13 |
| 1 | ep1 NN+MR ds=16 [35731:44431] v5 | succeeded | -0.37% | -2.68% | 0.92 | 51.2% | 22:12 |
| 0 | ep0 MR(explore) ds=11 [72685:81385] v5 | succeeded | 3.01% | -1.74% | 1.39 | 62.5% | 22:11 |
| 0 | ep0 MR(explore) ds=20 [75830:84530] v5 | succeeded | 5.41% | -2.00% | 1.35 | 54.3% | 22:06 |
| 0 | ep0 MR(explore) ds=18 [217228:225928] v5 | succeeded | 13.73% | -5.83% | 1.47 | 52.2% | 22:05 |
Strategy Note は AI Agent が自分で命名したメモで、「どんな仮説で回したか」が後から分かります。NN+MR(Neural Network + Mean Reversion)、ds=12(データセット12番)、[138936:147636](データ範囲)、v5(バージョン5)、といった形。
CSV エクスポート も可能なので、Pandas でさらに分析することもできます。
Agent API の使い方
Agent API は RESTful で、以下の操作ができます(一部例):
# バックテスト結果を保存
curl -s -X POST https://app.hawk-backtester.com/api/results \
-H "Authorization: Bearer hawk_XXXXXXXXXXXXX" \
-H "Content-Type: application/json" \
-d '{...}'
# レスポンス
{"result_id": "28dec200-53e3-4cf8-8558-ab37bf65b5f8"}
詳細は API Manual からドキュメントを参照できますが、ポイントは Agent が result_id を介して過去の結果を参照・比較できる こと。
これにより、AI Agent は:
- 仮説を立てて戦略コードを書く
- ローカルでバックテストを実行
- 結果を Agent API に保存 →
result_idを取得 - 過去の
result_idを取得して結果を比較 - 「iter6 が最良だから、それをベースに次の改善を試す」と自律判断
- 次のイテレーションへ
というループを回せます。
Claude Code による改善ログ
実例として、Claude Code が戦略コードを編集しながらイテレーションしている画面です。
見ての通り、AI Agent は:
-
hawk_auto_tune.pyを編集 - バックテストを実行
- 結果をコメントとして残す(「iter7 より改善(57.9%→61.0%)」)
- 判断を下す(「iter6 が最良なのでそのセッションを保存します」)
-
curlで API を叩いて保存
を完全に自動で実行しています。人間は最初に「このデータで戦略を作って改善してほしい」と指示するだけで、あとは放置できます。
Agent API の設計ポリシー
Agent API を設計するときに意識したのは以下です:
- RESTful:標準的な HTTP 認証で、どの言語からも叩ける
-
ステートレス:
result_idを軸にすべての結果を参照できる - 構造化レスポンス:Agent がパースしやすい JSON 形式
- レート制限あり:暴走防止(Trial プランでは控えめな上限)
AI Agent がループを回すと、ときどき 意図しない無限ループ に陥ることがあります。これを防ぐために、同一キーでの短時間大量実行にはレート制限をかけています。
2 つのモードの使い分け
| 目的 | おすすめモード |
|---|---|
| 仮説が固まっていて、それを検証したい | Backtest |
| 1 回だけ実行してグラフをじっくり見たい | Backtest |
| 具体的な戦略アイデアはあるが、最適パラメータを探したい | with AI Agent |
| 「何か効く戦略を探してほしい」レベルで丸投げしたい | with AI Agent |
| 研究ノートのようにたくさん試行錯誤したい | with AI Agent |
個人的には 両方を行き来するのが一番効率的 だと感じています。Backtest モードで粒度の細かい分析をして発見した仮説を、AI Agent モードで大量に検証してもらう、というワークフローです。
おわりに
Hawk-Backtester は、個人トレーダーが「研究のためのラボ」として使えることを目指して作ったツールです。
- Backtest モード で詳細な分析を
- with AI Agent モード で自律的な探索を
という 2 つの軸で、どちらも 戦略コードをローカルに留めたまま 実現できます。
もし触ってみて「ここがこうだったらもっといい」というフィードバックがあれば、サービス内の Feedback ページから送ってもらえると嬉しいです。開発の糧にさせてもらいます。
- Service: https://app.hawk-backtester.com
- Python SDK:
pip install hawk-bt - 技術設計記事(姉妹記事): https://qiita.com/atranta333/items/c8b6711e04a74605632b
本記事は Hawk-Backtester の開発者が設計意図と使い方を解説したものです。表示されている数値は執筆時点のサンプル実行結果であり、実運用での利益を保証するものではありません。










