1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Hawk-Backtester の使い方 — 設計者が語る Backtest モードと AI Agent モードの両輪

1
Last updated at Posted at 2026-04-20

はじめに

こんにちは。バックテストサービス Hawk-Backtester を個人で開発している者です。

https://app.hawk-backtester.com

このサービスは「戦略コードはローカルに留めたまま、ブラウザで分析できる」という設計と、「AI Agent が自律的にバックテストループを回せる」という2つを両立させることを目指して作りました。

前回の記事ではアーキテクチャ(Rust + WASM + WebSocket の構成)について書きましたが、今回は 実際にどう使うのか を、設計意図と合わせて丁寧に解説します。

Hawk-Backtester には 2 つの使い方があります:

  1. Backtest モード — ブラウザで Setup を組んで、ローカル Python 戦略と接続する手動モード
  2. with AI Agent モード — API Key を発行して、AI Agent に自律的にループを回させるモード

それぞれ、設計意図 → 使い方 → 見るべきポイント、の順に書きます。


Backtest モード — 1回ずつバックテストを回す手動ワークフロー

設計意図

Backtest モードは「自分で戦略を書き、自分で条件を決め、1回ずつ結果を見ながら育てていく」 クラシックなバックテスト体験 を提供するモードです。

このモードの設計で最も苦心したのは、「ブラウザUIなのに戦略コードが外に出ない」という矛盾をどう見せるか でした。普通のクラウド型バックテスターは「戦略コードをアップロード → サーバーで実行 → 結果表示」の流れですが、Hawk-Backtester はここが違います。

戦略コードは ユーザーのローカル Python プロセスの中だけ に存在し、ブラウザ内で動く WASM シミュレータと WebSocket 経由で通信します。「Connect to Local Strategy」ボタンが、その接続のトリガーです。

Setup 画面の読み方

まず、Backtest ページを開いた直後の画面です。

01_setup.png

画面下部の「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 ステップ)を選択しています。

データセットを選ぶと、チャートエリアにローソク足が表示されます。

02_chart_setup.png

左下には 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

03_outcome.png

右側にサマリー数値が並びます。設計上、これらは 「集計指標だけで判断しないでほしい」という意図 を込めてあります。

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% までレバレッジ効かせた瞬間があるが、それはリスク管理として妥当か?」という議論ができるようにしています。

ツールチップで時点を掘る

チャート上にマウスを置くと、その時点の数値がツールチップで出ます。

04_outcome_tooltip.png

これは設計時に「月単位の平均値ではなく、任意の時点の状態を詳細に見たい」というニーズから付けた機能です。急落した瞬間の Equity、Drawdown を即座に確認できます。

時系列 4 段構成

Time Series ビューは 4 段のパネルで構成されています。

05_timeseries_overview.png

  • 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 が出てきます。

06_action_lifecycle.png

横軸が時間、縦軸が同時保有スロット、個々のバーが個別取引です。これは Hawk-Backtester の特徴機能 で、全取引を時間軸にマッピングして可視化します。

バーにマウスを置くと、個別チケットの詳細が出ます。

07_trade_markers.png

Ticket #648 (Short) のように、開始時刻・終了時刻・サイズ・エントリー価格・エグジット価格・PnL がすべて追跡可能です。

この設計の意図は、「集計指標では見えない敗因を探せるようにする」 こと。次の AI Agent モードで真価を発揮します。

Scatter Plot — 統計的に戦略を評価する

「Scatter Plot」タブに切り替えると、4 段の散布図が表示されます。

08_scatter_plot.png

  • 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」。

09_exit_analysis.png

  • 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 ページを開くとこの画面になります。

HC-bnRTaEAAskcL.jpeg

画面上部の 「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 は:

  1. 仮説を立てて戦略コードを書く
  2. ローカルでバックテストを実行
  3. 結果を Agent API に保存 → result_id を取得
  4. 過去の result_id を取得して結果を比較
  5. 「iter6 が最良だから、それをベースに次の改善を試す」と自律判断
  6. 次のイテレーションへ

というループを回せます。

Claude Code による改善ログ

実例として、Claude Code が戦略コードを編集しながらイテレーションしている画面です。

10_claude_code_edit.png

見ての通り、AI Agent は:

  • hawk_auto_tune.py を編集
  • バックテストを実行
  • 結果をコメントとして残す(「iter7 より改善(57.9%→61.0%)」)
  • 判断を下す(「iter6 が最良なのでそのセッションを保存します」)
  • curl で API を叩いて保存

を完全に自動で実行しています。人間は最初に「このデータで戦略を作って改善してほしい」と指示するだけで、あとは放置できます。

Agent API の設計ポリシー

Agent API を設計するときに意識したのは以下です:

  1. RESTful:標準的な HTTP 認証で、どの言語からも叩ける
  2. ステートレスresult_id を軸にすべての結果を参照できる
  3. 構造化レスポンス:Agent がパースしやすい JSON 形式
  4. レート制限あり:暴走防止(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 ページから送ってもらえると嬉しいです。開発の糧にさせてもらいます。


本記事は Hawk-Backtester の開発者が設計意図と使い方を解説したものです。表示されている数値は執筆時点のサンプル実行結果であり、実運用での利益を保証するものではありません。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?