hawk-bt
ブラウザ上の WASM シミュレーションエンジンを Python から操るためのライブラリ。
システム全体構成を踏まえた hawk-bt の役割»
シミュレーション中、Python とブラウザは WebSocket で直結する。hawk-bt はその間に入り、接続管理・プロトコル変換・同期制御をすべて引き受ける。
step(ctx) で売買判断
同期ポリシー適用 / ループ実行
ポジション管理・損益
レポート生成
Quick Start»
※ PyPI 上の hawk-backtester は本プロジェクトとは無関係の別パッケージです。
Strategyクラスを書く(下の例 を参照)- ブラウザでシミュレーション画面を開く
python my_strategy.pyを実行- ブラウザ側で「Start」を押す
セッションが終わると結果がログに出る。ブラウザが切断・再接続しても自動で次のセッションを受け付ける。
例: SMA クロスオーバー»
短期 SMA が長期 SMA を上抜けたら Buy、下抜けたら Sell。 TP/SL で自動決済。手動クローズはしない。
コードの解説»
上の SMA クロスオーバーの例をもとに、hawk-bt がどう動くかを解説する。
シミュレーションループ
A HawkEngine().start(SMACross()) を実行すると、ブラウザからの接続を待ち受ける。接続が来るとバックテストが始まり、1 バーずつ以下の 3 ステップを繰り返す:
ctx.state.snapshot に格納
balance, equity, price …
売買判断 → 注文送信
TP/SL 判定・約定処理
step() の中身
B async def step(self, ctx: Context) は毎バー呼ばれるエントリポイント。この中で価格を読み、判断し、注文を出す。
- C ctx.state.snapshot.price — 現在価格を取得して SMA を計算
- D place_ticket(side="buy", ...) — ゴールデンクロス検出時に成行注文
- D take_profit=self.tp, stop_loss=self.sl — TP/SL を絶対価格差で指定
同期ポリシー: eager vs deferred
D place_ticket() を呼ぶと WASM 側の状態が変わる。 「その変化をいつ Python 側に反映するか」を制御するのが同期ポリシー。
deferred(デフォルト)
eager(UI「高精度」ボタン ON)
eager は操作のたびに WASM と同期するので、常に最新の状態が見える。安全だが通信回数が多い。
TP/SL 判定のタイミング
D take_profit=self.tp
で設定した TP/SL は、注文を出したバーでは評価されない。
step_next() で次のバーに進んだとき、そのバーの高値・安値で判定される。
API — 情報取得»
毎ステップ冒頭で自動更新される口座・市場の状態。呼び出し不要。
| Field | Type | Description |
|---|---|---|
| balance | float | 口座残高 |
| equity | float | 評価額 (残高 + 含み損益) |
| used_margin | float | 使用中証拠金 |
| margin_level | float | 証拠金維持率 |
| price | float | 現在価格 |
| timestamp_ms | float | タイムスタンプ (ms) |
| step | int | バー番号 (0-indexed) |
| pending_orders | float | 未約定注文数 |
| tickets_num | float | オープンポジション数 |
| ticket_all_num | float | 全ポジション数 (クローズ含む) |
| bar_count | int | 処理済みバー数 |
| ticket_stat_0..3 | float | ポジション統計 |
| ticket_long_count | float | ロングポジション数 |
| ticket_short_count | float | ショートポジション数 |
| pending_long_count | float | ロング未約定注文数 |
| pending_short_count | float | ショート未約定注文数 |
| total_steps | int | シミュレーション総バー数 |
全期間の OHLC + タイムスタンプ。セッション開始時に一括取得済み。 以降の通信は発生しない。numpy 配列なのでスライスや演算がそのまま使える。
candles.close[:step] のようにスライスし、
現在バーより先のデータを参照しないこと。未来の価格を使った戦略はバックテスト結果を無効にする。
| Field | Description |
|---|---|
| time | タイムスタンプ |
| open | 始値 |
| high | 高値 |
| low | 安値 |
| close | 終値 |
オープンポジション一覧。呼ぶたびに通信が発生する。
Returns
np.ndarray — 各行が 1 ポジション
前回取得以降のイベント(決済、マージンコール等)。ターミナル状態の検出も内部で行う。
Returns
np.ndarray — shape (N, 5)
スナップショットだけ手動で再取得。イベントは取らない。
API — 注文・決済»
成行注文。現在の市場価格で即時約定。
| Param | Type | Note |
|---|---|---|
| side | str | "buy" / "sell" |
| units | int | ロット数 (1 以上) |
| take_profit | float? | TP 距離 (絶対値) |
| stop_loss | float? | SL 距離 (絶対値) |
| trailing_stop | float? | トレーリングストップ距離 |
take_profit=5.0 なら「エントリーから 5.0 離れたら利確」。パーセンテージではない。
指値 ("limit") / 逆指値 ("stop") 注文。指定価格に到達したら約定。
| Param | Type | Note |
|---|---|---|
| side | str | "buy" / "sell" |
| order_type | str | "limit" / "stop" |
| price | float | 注文価格 |
| units | int | ロット数 |
| take_profit | float? | TP 距離 |
| stop_loss | float? | SL 距離 |
| trailing_stop | float? | トレーリングストップ距離 |
| time_limit | float? | 有効期限 (バー数) |
ポジション決済。全決済でも一部決済でも。
| Param | Type | Note |
|---|---|---|
| position_ids | list[int] | 対象ポジションの ID |
| actions | list[int] | アクションコード(下表参照) |
| ratios | list[float] | 決済比率 (0.0~1.0)。action=2 のときのみ使用 |
Action codes
| Code | 動作 | ratios の扱い |
|---|---|---|
| 1 | 全決済 | 無視される |
| 2 | 比率決済 | 1.0 = 全決済、0.5 = 半分決済 |
action=1 はポジションを即座に全決済する。action=2, ratio=1.0 でも全決済になるが、action=1 の方がシンプル。
シミュレーションを途中で打ち切る。通常は全バー消化か margin call で自動終了。
設定»
HawkEngine
| Param | Default | Note |
|---|---|---|
| host | "127.0.0.1" | バインドアドレス |
| port | 8787 | ポート番号 |
| on_result | None | 結果コールバック (BacktestResult を受け取る) |
BacktestResult
セッション終了後に on_result コールバックへ渡される結果オブジェクト。
| Field / Method | Type | Description |
|---|---|---|
| steps | int | 完了バー数 |
| balance | ndarray | 各バーの残高 |
| equity | ndarray | 各バーの評価額 |
| price | ndarray | 各バーの価格 |
| total_orders | int | 総注文数 |
| win_count | int | 勝ちトレード数 |
| loss_count | int | 負けトレード数 |
| gross_profit | float | 総利益(勝ちトレードの合計) |
| gross_loss | float | 総損失(負けトレードの合計) |
| final_balance() | float | 最終残高 |
| max_drawdown() | float | 最大 DD (例: -0.15) |
| max_drawdown_before_end() | float | 最大 DD(残高 0 以前まで) |
configure_logging(level)
| Level | 出力 |
|---|---|
| 1 | WARNING のみ |
| 2 | INFO — 接続・切断・結果レポート |
| 3 | DEBUG — 注文ごとの詳細ログ |
ctx.user
ステップ間でデータを持ち回すための辞書。 インジケータのバッファ、トレード回数カウンタ、何でも入れられる。
参考: 独自インジケーターを使った戦略»
ctx.state.candles は全期間の OHLC を numpy 配列で保持しているため、
現在のバー位置までスライスすれば任意のインジケーターをその場で計算できる。
candles は numpy 配列なので、RSI・ATR・MACD など任意の指標を同じ要領で実装できる。
参考: 外部データとの突合»
OHLC 以外のデータ(出来高、ファンダメンタルズ等)を使いたい場合、
自前で読み込んだデータを candles.time のタイムスタンプで突合すれば利用できる。
シミュレーターが提供するのは OHLC + タイムスタンプのみ。それ以外のデータは自由に持ち込める。
Security»
WebSocket 接続
- hawk-bt の WS サーバーは
127.0.0.1:8787にバインドされます。外部ネットワークには公開されません。 - 接続時に Origin ヘッダー検証を行い、許可リスト外のオリジンからの接続は
403 Forbiddenで拒否されます。 - Agent とブラウザが同一マシン上で実行されている必要があります。