| name | backtest |
| description | bitbank のローソク足データでトレーディング戦略をバックテストし、
損益・勝率・ドローダウンを算出する(SMAクロス・RSI逆張り・MACD 等)。
コスト・サイジング・複利を含む実運用評価のレイヤー。
代表トリガー: 「SMAクロス戦略をバックテストして」
「この戦略で儲かる?」「勝率どのくらい?」「ストラテジーを比較して」
注意: 現在値の読みは indicator-analysis、シグナル単体の予測力検証は
signal-explorer が担当。
|
| compatibility | Requires the bitbank CLI on PATH (install separately: npm i -g bitbank-lab-cli).
Plugin install alone does NOT bundle the CLI or its dependencies. Node.js 22+.
|
| metadata | {"author":"bitbankinc","version":"1.0","requires":{"bins":["bitbank"]}} |
バックテスト Skill
いつ使うか
代表トリガー以外にも以下のような発話で起動する:
- 「RSI逆張りの成績は?」「過去1年の BTC でこの戦略を試して」
- 「過去のパフォーマンスは?」「買いシグナルが出たけど信頼できる?」
- 戦略の有効性や過去実績を問う質問全般
実行フロー(Plan → Validate → Execute)
Step 1: ストラテジー定義
ユーザーのリクエストから以下を決定する:
- エントリー条件: いつ買う/売るか(例: SMA(20) が SMA(50) を上抜け → 買い)
- イグジット条件: いつ手仕舞いするか(例: 逆クロス、または損切りライン)
- ポジションサイズ: 1回のトレードで投入する割合(デフォルト: 全資金の 100%)
- 手数料: 対象ペアの現行レートを
bitbank pairs から取得する(下記)。
記憶や他ペアの数字をハードコードしない
手数料レートの取得:
bitbank pairs --format=json --machine
data は全ペア設定の配列。name が対象ペア(例: btc_jpy)の要素から
taker_fee_rate_quote / maker_fee_rate_quote を読む(小数表記。0.0012 = 0.12%)
- バックテストの約定は次の足の始値での成行を想定するため、デフォルトは
taker レートを片道分として使う。ユーザーが指値(maker)前提を明示した
場合のみ maker レートを使う(maker は 0% や負=リベートのこともある。
取得値の符号をそのまま使う)
- レートは改定・campaign で随時更新されるため、実行のたびに取得する
- 取得に失敗した場合のみ、CLI の既定フォールバック 0.0012(0.12%。過去の
公称上限に合わせた保守値であり、現行レートではない)を使い、結果出力に
「手数料はフォールバック値」と明記する
ユーザーが戦略を指定しない場合、SMA クロス戦略(20/50) をデフォルトで使用する。
Step 2: データ取得
bitbank candles <pair> --type=<timeframe> --limit=<N> --format=json --machine
- バックテストには十分なデータが必要。最低でも SMA の長期期間 × 2 以上
- 1回で足りない場合は
--date を変えて複数回取得し結合する
--format=json --machine を併用する(_shared/references/cli-conventions.md)。
envelope の success を確認後、data 配列から各行
{open, high, low, close, vol, timestamp} を取り出す(CLI が数値正規化済み、
timestamp はミリ秒 UTC、配列は昇順=古い順)。meta.lastIsIncomplete: true なら末尾足を 必ずシミュレーション
から外す(未確定足でエントリー判定すると将来データを参照したのと同じ
リーク源になる)。gaps / truncated はバックテスト期間の信頼性に直結する
ため、検出時は実行前にユーザーに確認する
Step 3: ドライラン(検証)
フル実行の前に、必ず最初の 10 トレードだけ表示してユーザーに確認する。
表示内容:
=== ドライラン: 最初の 10 トレード ===
# | 日付 | アクション | 価格 | 理由
1 | 2024-01-15 | 買い | 6,500,000 | SMA(20) > SMA(50) クロス
2 | 2024-02-03 | 売り | 7,100,000 | SMA(20) < SMA(50) クロス(+9.2%)
...
この戦略で全期間のバックテストを実行しますか?
Step 3.5: リークサニティチェック
ドライラン承認後・フル実行前に、データリークの有無を確認する。
手順:
- shift(1) ありの版(正規版)と shift(1) を意図的に外した版(リーク版)を、同じデータ・同じ戦略・同じ期間でシミュレートする
- それぞれの累積 PnL の最終値とシャープレシオを並べて表示する
- 差を比較し、異常に大きければユーザーに警告する
判定基準(目安):
- shift なしのシャープが shift ありの 2 倍以上になる場合 → リーク疑い
- shift なしの累積 PnL が shift ありの 数倍になる場合 → リーク疑い
- 警告閾値はあくまで目安。データや戦略の性質に応じてユーザーが調整可能
リーク疑いと判定された場合:
ロジックの再確認をユーザーに促し、フル実行を一旦停止する。
重要な注意:
- shift なし版は 検証目的のみの使い捨てパス。ユーザーの戦略を実運用でこの方法で動かしてはならない
- リークサニティ用の比較が終わったら、結果は破棄し、shift あり版のみを Step 4 以降に進める
出力例:
=== リークサニティチェック ===
shift(1) あり: 累積PnL +12.5%, シャープ 0.85
shift(1) なし: 累積PnL +89.3%, シャープ 4.12
→ 差が大きすぎます。シグナル → 約定のタイミングを再確認してください。
差が小さい場合の出力例:
=== リークサニティチェック ===
shift(1) あり: 累積PnL +12.5%, シャープ 0.85
shift(1) なし: 累積PnL +14.1%, シャープ 0.92
→ shift 効果が確認できる範囲内。フル実行に進みます。
Step 4: フル実行
ユーザーの承認後、全期間でシミュレーションを実行する。
Step 5: 自己チェック(Validation Loop)
計算結果の整合性を必ず検証する:
- 総損益 = 各トレードの損益の合計か?
- 最終資金 = 初期資金 + 総損益 か?
- 勝率 = 勝ちトレード数 / 全トレード数 か?
- 最大ドローダウンの計算が正しいか?
- シグナル生成と約定タイミングのずれが正しいか?
- シグナルは
t のデータで計算し、約定は t+1 の始値で行われているか
t の close を使ったシグナルで t の close 約定は不可(同足リーク)
- 指標の rolling 計算が将来データを参照していないか(rolling は過去のみ)
不整合があれば原因を特定し、修正して再計算する。検証なしで結果を出すと、ユーザーが誤ったデータに基づいて投資判断してしまうリスクがある。
Step 6: 結果出力
=== バックテスト結果 ===
戦略: SMA クロス (20/50)
期間: 2023-01-01 〜 2024-03-01
ペア: BTC/JPY
時間軸: 1day
手数料: taker 0.10%(片道、bitbank pairs 取得値)
--- パフォーマンス ---
初期資金: 1,000,000 JPY
最終資金: 1,250,000 JPY
総損益: +250,000 JPY (+25.0%)
トレード数: 15
勝率: 60.0% (9勝 6敗)
平均利益: +45,000 JPY
平均損失: -18,750 JPY
プロフィットファクター: 2.40
最大ドローダウン: -8.5%
シャープレシオ: 1.82
--- トレード一覧 ---
# | エントリー日 | イグジット日 | 方向 | エントリー価格 | イグジット価格 | 損益 | 損益率
1 | 2023-01-15 | 2023-02-03 | 買い | 6,500,000 | 7,100,000 | +92,000 | +9.2%
...
デフォルト戦略: SMA クロス
- 買いエントリー: SMA(20) が SMA(50) を上抜けた次の足の始値
- 売りイグジット: SMA(20) が SMA(50) を下抜けた次の足の始値
- 初期資金: 1,000,000 JPY
- 手数料:
bitbank pairs の taker レートを片道分として適用(往復はその 2 倍)
可視化(オプション)
トリガー規律・実行環境の解決・出力先・スタイル・安全規律は
_shared/references/visualization-guide.md に従う。デフォルトは off
(ユーザーが明示的に求めたとき、または提案に同意したときだけ描く)。
チャートは Step 6 のテキスト出力の後に描き、テーブル・サマリーの
置き換えにはしない。
本 skill の標準チャート:
| チャート ID | 内容 | 主な構成要素 |
|---|
backtest.equity-curve | 累積損益曲線 | x=時間、y=資金(JPY)。戦略 equity と Buy & Hold の 2 系列 + 初期資金の水平線。手数料条件(taker/maker・レート・フォールバックか否か)をフッターに明記 |
backtest.drawdown | ドローダウン曲線 | equity のランニング最大値からの下落率(%)を塗りつぶしで。最大ドローダウンの位置と値を注記 |
backtest.equity-drawdown | 損益スナップショット(統合版) | 上段(高さ 2/3): equity-curve と同構成。下段(高さ 1/3): drawdown と同構成(underwater 塗りつぶし + 最大 DD 注記)。共有 x 軸・タイトルとフッターは 1 つ。quantstats の snapshot に相当する定番レイアウト |
backtest.trades-on-price | 約定マーカー付き価格チャート | close の折れ線 + エントリー(▲)/ イグジット(▼)マーカー。凡例は simulated entry / simulated exit(過去のシミュレーション約定であり推奨ではない) |
backtest.leak-check | リークサニティ比較 | Step 3.5 の shift(1) あり / なしの累積 PnL 2 系列。VALIDATION ONLY — do not trade the no-shift series を図中に明記 |
チャート固有の注意:
- チャートの選び方(既定マッピング): 「損益をプロットして」「成績を
グラフで」のような損益系の総称的な依頼には
equity-drawdown(統合版)
1 枚を既定とする。DD は損益の読みの一部であり、テキスト出力が必ず
最大 DD を含むのと同じ思想(上がり方だけ見せると楽観バイアスを再導入する)。
「損益曲線だけ」なら equity-curve 単独、「ドローダウンを」なら
drawdown 単独。統合版と単独版を同時に出すのはユーザーが明示したときだけ
equity-curve / drawdown / equity-drawdown の数値は Step 6 の
総損益・最大ドローダウンと一致していること(Step 5 の自己チェックと
同じ整合性検証を図にも適用する)
trades-on-price はトレード数が多いとマーカーが潰れる。100 トレードを
大きく超える場合は期間分割(複数ファイル)を提案する
leak-check の shift なし系列は検証用使い捨てパス。図を保存しても
以降のステップで再利用しない
Gotchas
- 手数料を必ず考慮する。 手数料を無視するとバックテスト結果が大幅に楽観的になり、実運用で損失につながる。レートはペアごとに異なり、campaign で無料化されることもある(現行値の一覧は公式ガイド https://bitbank.cc/guide/fee )。学習知識にある数字や他ペアの数字を使い回さず、実行のたびに
bitbank pairs から対象ペアの値を取得する。取得失敗時のみ CLI の既定フォールバック(cli/fees.ts の DEFAULT_TAKER_FEE_RATE = 0.12%。maker/taker を問わず保守値=コスト過大側で、不明時にリベートを仮定しない)を使い、その旨を結果に明記する
- スリッページは考慮しない。 バックテストでは次の足の始値で約定したと仮定する。実際の取引ではスリッページが発生するため、結果は「理論上の上限」であることをユーザーに伝える
- 十分なデータ期間を確保する。 データが少ないと指標が安定せず、最初の数十トレードが無意味になる。SMA(50) なら最低 100 本、SMA(200) なら最低 400 本
- 価格は文字列で返る。 数値変換を忘れると文字列比較になり、計算結果が完全に壊れる
- 配列は古い順。 先頭が最も古いデータ。逆に処理するとクロス判定が反転する
- API がエラーを返した場合は
_shared/references/bitbank-api-formats.md を読んでエラーコードを確認する
- ショート(空売り)は現物取引では不可。 bitbank 現物はロング(買い→売り)のみ。ショートを含む戦略を提案すると、ユーザーが実行できないので注意
- 「良すぎる結果」が出たらまずリークを疑う。 将来リターンと相関 0.3 以上の指標は通常存在しない。Step 3.5 のサニティチェックで shift 有無の差が 2 倍を超えたら、ロジックを止めて再確認すること。