| name | signal-explorer |
| description | 任意のシグナル候補(指標・出来高変換量・自作特徴量・外部時系列)の
予測力を将来リターン相関・Z-score 変換・ラグ相関・冗長性・符号 PnL・
リーク検証から客観的に評価する。
代表トリガー: 「RSI、本当に効く?」「この指標に予測力ある?」
「自作のシグナルを評価して」「Z-score 化で改善する?」
注意: 現在値の読みは indicator-analysis、コスト込み戦略 PnL は
backtest が担当。本 skill はその間の「予測力スクリーニング」層。
|
| 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
いつ使うか
代表トリガー以外にも以下のような発話で起動する:
- 「BB 幅は将来リターンと相関ある?」「シグナル候補を評価して」
- 「この特徴量、効果ある?」「どの指標が効きそう?」
役割と他 skill との切り分け
本 skill は 「シグナル候補の予測力を客観的に評価する」 ためのもの。
売買判断でも戦略 PnL でもなく、「そのシグナルは将来リターンと関係しているか」
だけを見るスクリーニング層。
- indicator-analysis との違い:
indicator-analysis は「現在値の読み」(今の RSI は何か、SMA クロスしたか)。
本 skill は 「その指標が将来リターンと相関しているか」 を検証する。
「BTC の RSI を見て」では起動しないが、「RSI に予測力ある?」では起動する。
- backtest との違い:
backtest は コスト・サイジング・複利込みの戦略 PnL。閾値最適化やイグジット
ロジックも含む実運用評価。本 skill は コスト無視・閾値最適化なし の
「予測力スクリーニング PnL」のみ。promising と判定されたシグナルを backtest に
渡すのが標準的な使い方。
- volatility-profile との違い:
volatility-profile は単一銘柄の「リスク特性のメタ情報」(分布の形・時間帯・
クラスタリング)。本 skill は シグナル候補と将来リターンの「関係性」。
トリガー条件
以下のような発話で起動する:
- 「RSI、本当に効く?」「この指標に予測力ある?」
- 「自作シグナルを評価して」「BB 幅は将来リターンと相関ある?」
- 「Z-score 化で改善する?」「シグナル候補を評価して」
- 「この特徴量、効果ある?」「どの指標が効きそう?」
以下では 起動しない:
- 「BTC の RSI を見て」(現在値の読み → indicator-analysis)
- 「SMA クロス戦略をバックテストして」(戦略 PnL → backtest)
- 「BTC のボラ特性は?」(リスク特性 → volatility-profile)
シグナル指定方法
ユーザーは 3 つの経路でシグナル候補を指定できる。
A. 組み込み指標名で指定(最も簡単)
例: 「RSI(14) の予測力を評価して」「BB 幅を評価して」「ROC(12) を評価して」
skill は indicator-analysis と同じ計算ロジックで指標を生成して評価する。
計算式は indicator-analysis/references/indicator-guide.md を参照
(重複実装は許容)。組み込み済みの候補:
- SMA(N) 乖離率:
(close - SMA(N)) / SMA(N)
- EMA(N) 乖離率:
(close - EMA(N)) / EMA(N)
- RSI(14)、MACD ヒストグラム、ROC(N)、ATR(N)、BB 幅(20)(= (upper - lower) / mid)
- BB %B:
(close - lower) / (upper - lower)
B. 派生量を式で指定
例: 「出来高の log を評価して」「直近 24 本の出来高 Z-score を評価して」
「(high - low) / close を評価して」
skill は受け取った式を candles の OHLCV から計算する。
不明瞭な式はユーザーに確認してから進める。
C. 値を直接受け取る(外部データ)
ユーザーが事前に計算した時系列を JSON で渡す:
{
"name": "coinbase_premium",
"timestamps": [1712025600000, 1712029200000, ...],
"values": [0.0012, -0.0035, ...]
}
skill は candles の timestamp と left-join し、欠損は除外して評価する。
詳細フォーマットは references/exploration-guide.md 参照。
重要な制約: Coinbase プレミアム等の 他取引所データは bitbank CLI で取得不可。
そういうケースは経路 C で受け取る。本 skill が外部 API を直接叩くことはしない。
デフォルト分析セット(7 ステップ)
入力: シグナル候補 + ペア + 時間軸(足種・期間)。
ユーザー指定がない項目は下記デフォルトを使う。
Step 1: 生データでの基本確認
シグナル s[t] と将来リターン r_fwd[t] = log(close[t+h] / close[t])
(h はデフォルト 1)の関係を計算。
- Pearson r、Spearman r、各 p 値、サンプル数 N
- p 値の解釈に 「ファットテール・自己相関により楽観バイアスあり」 を必ず併記
- |Pearson - Spearman| > 0.05 の場合は「外れ値の影響を疑う」と注記
Step 2: ローリング Z-score 変換と再評価
シグナルを window 期間でローリング標準化:
z[t] = (s[t] - rolling_mean(s, window)[t]) / rolling_std(s, window)[t]
- デフォルト window: 短期足(1min〜4hour)= 168 本(1hour なら 1 週間相当)、
長期足(1day 以上)= 30 本(1 ヶ月相当)
- 最初の window-1 本は NaN(0 埋めしない)
- 生データの相関と Z-score の相関を 両方表示 し、「変換で改善したか」を即座に判定
- 非定常な指標(プレミアム、出来高、価格水準そのもの)は変換で大きく改善することが多い
Step 3: ラグ相関プロファイル
ラグ +1 〜 +max_lag(デフォルト 48)でシグナル → 将来リターン相関を計算:
corr_lag[k] = Pearson(s[t], log(close[t+k] / close[t+k-1])) for k in 1..max_lag
- 「何足先まで効くか」「ピークラグはどこか」を表で表示
- 多重比較への注意を 1 行: 48 ラグ同時検定で偶然 |r| > 0.05 が出る確率は無視できない。
Bonferroni 補正の話を
references/exploration-guide.md に逃がす
Step 4: シグナルの自己相関(粘着性)
ラグ 1〜max_lag のシグナル自身の自己相関 Pearson(s[t], s[t-k]) を計算。
- 1 / 6 / 12 / 24 / 48 の代表ラグでサマリー表示
- 解釈ラベル:
- 粘着的(lag=1 で > 0.9、lag=24 で > 0.3) → ATR・SMA 系。レジーム検出向き
- 非粘着(lag=1 で < 0.3) → リターン・MACD ヒスト系。エントリー信号向き
- 超粘着(lag=1 で > 0.99) → 価格そのものに近い疑い。Gotchas 参照
Step 5: 既存指標との冗長性チェック
評価対象シグナル × 既存指標セットで相関行列を計算。
既存指標セット(デフォルト):
- SMA(20) 乖離率、EMA(20) 乖離率
- RSI(14)、ROC(12)
- ATR(14)(価格スケール除去のため close で割る:
ATR / close)
- BB 幅(20)
判定:
- |r| > 0.8 のペアを 冗長(redundant) としてフラグ
- 異なるカテゴリ(モメンタム / ボラ / トレンド)の指標と |r| < 0.3 → 独立性あり
評価対象シグナル自身は既存指標セットに含めない(自己相関 1.0 になるだけ)。
Step 6: 符号ベース簡易 PnL(コスト無視・予測力チェック専用)
シグナルの 符号 だけでロング/ショートを切り替える最シンプルな PnL:
position[t] = sign(s[t]) # +1: long, -1: short, 0: flat
pnl[t] = position[t-1] * r[t] # shift(1) で次足始値約定相当
- shift(1) を厳守。shift なしは Step 7 のリーク検証専用
- 生データ符号 / Z-score 符号 / Buy & Hold の 3 系列累積 PnL を比較
- コスト・サイジング・複利は一切考慮しない ことを出力に明記
- ショート(sign < 0)は方向検証用の数学シミュレーション。bitbank 現物では
ロングのみ実行可能であることを必ず併記
- 本格評価は backtest skill へ誘導 する 1 行を最後に入れる
Step 7: リーク自己チェック
backtest skill の Step 3.5 と同じ哲学:
- shift(1) あり版(正規)と shift(1) なし版(リーク版)の累積 PnL を並べる
- 判定基準:
- shift なし PnL の絶対値が shift あり PnL の 2 倍以上 → leak-suspect
- 通った場合のみ「予測力検証として信頼できる」と表示
- shift なし版は 検証用使い捨てパス。実運用に流用しない
最終サマリー(判定ラベル)
5 軸を踏まえて、シグナル候補に 判定ラベル を付ける。複数フラグ併用可。
| ラベル | 条件(デフォルト) |
|---|
| ✅ promising | |r| > 0.05、Z-score で改善、ローリング相関の符号が安定、既存指標と |r| ≤ 0.8、リーク疑いなし |
| ⚠️ noisy | |r| < 0.03、ローリング相関が頻繁に符号反転 |
| 🔁 redundant | 既存指標のいずれかと |r| > 0.8 |
| 🚨 leak-suspect | shift なし PnL の絶対値が shift あり PnL の 2 倍以上 |
判定はあくまで 目安。閾値はユーザーが上書きできる(カスタマイズ可能なパラメータ参照)。
複合ラベル例: 🔁 redundant + ⚠️ noisy、✅ promising(単独)。
出力フォーマット
セクションごとにテーブル + 簡潔な解釈。最後に判定サマリーを 1 ボックス。
=== シグナル評価: RSI(14) on btc_jpy 1hour ===
期間: 2024-04-01 〜 2024-12-31, N=6,576
--- 1. 生データ vs 将来リターン ---
Pearson r = -0.0012 (p = 0.91, n.s.)
Spearman r = -0.0040 (p = 0.74, n.s.)
※ サンプル多 + 自己相関で p 値は楽観バイアス
--- 2. Z-score 変換(168 本ローリング)---
生データ r = -0.0012 → Z-score r = +0.0048
→ 改善はほぼなし
--- 3. ラグ相関 ---
ピーク: lag=+1 (r=-0.0012), 有意ラグなし
※ 48 ラグ同時検定。多重比較に注意
--- 4. 自己相関(粘着性)---
lag=1: 0.92, lag=6: 0.55, lag=24: 0.16, lag=48: 0.05
→ 粘着的(レジーム情報。エントリー信号には不向き)
--- 5. 既存指標との冗長性 ---
SMA(20) 乖離率 r= 0.89 ← 🔁 冗長
ROC(12) r= 0.82 ← 🔁 冗長
ATR(14)/close r=-0.07 ← 独立
BB 幅(20) r= 0.04 ← 独立
--- 6. 符号ベース簡易 PnL(コスト無視)---
生データ符号: 累積 -2.3%
Z-score 符号: 累積 -1.1%
Buy & Hold: 累積 +112.4%
※ shift(1)、コスト・サイジング無視。ショートは方向検証用(bitbank 現物不可)
--- 7. リーク検証 ---
shift(1) あり: 累積 -1.1%
shift(1) なし: 累積 +0.4%
→ リーク疑いなし
=== 判定: 🔁 redundant + ⚠️ noisy ===
RSI 単体での予測力は確認できず、SMA 乖離率や ROC と冗長。
ATR とは独立しているので「ボラ × モメンタム」の組み合わせは検討余地あり。
本格的な戦略化は backtest skill を参照。
実行手順
- シグナル指定経路(A/B/C)と評価対象を確定。経路 C なら JSON フォーマットを確認
- ペア・足種・期間を確認。指定がなければ「BTC/JPY 1hour、過去 9 ヶ月」をデフォルト提案
- CLI でローソク足を取得(
--format=json --machine)。必要本数 = 期間 + max(window, max_lag) のバッファ。
envelope の success を確認後、data 配列から各行 {open, high, low, close, vol, timestamp} を取り出す(CLI が数値正規化済み、timestamp はミリ秒 UTC、配列は昇順=古い順)。
meta.lastIsIncomplete: true なら末尾足は 必ず除外(将来リターン
r_fwd[t] を計算する直前足はリーク源になりやすいため、未確定足を含めない)。
gaps がある場合は欠損区間を取り除いてから将来リターンとシグナルを整列する
- 経路に応じてシグナル
s[t] を構築。経路 C は timestamp で left-join、欠損行は除外
- 将来リターン
r_fwd[t] = log(close[t+1] / close[t]) を計算(horizon 指定があれば反映)
- Step 1〜7 を順に実行
- Validation Loop(下記)の 5 項目を点検
- テーブル + 判定サマリーを出力。promising なら backtest への引き渡しを提案
自己チェック(Validation Loop)
出力前に以下を確認し、不整合があれば修正してから出す。
- 将来リターンの向き —
r_fwd[t] = log(close[t+1]/close[t]) で、過去ではなく
未来を指しているか。shift(-1) の符号を間違えるとリーク方向が反転する
- ローリング Z-score の最初の
window-1 本が NaN になっているか。
0 埋めしていないか(0 埋めすると相関が偽改善する)
- ラグ相関のラグが等間隔 か。1, 2, 3, ... と連続しているか(飛びがあれば実装ミス)
- 既存指標との相関で、評価対象シグナル自身が既存指標セットに混入していないか
(自己相関 1.0 のフラグ漏れ)
- 符号ベース PnL の出力に「コスト・サイジング無視」「ショートは方向検証用」が
明記されているか
カスタマイズ可能なパラメータ
ユーザー指定があれば優先。
| パラメータ | デフォルト | 説明 |
|---|
| 将来リターンの horizon | 1(次足) | shift(-N) の N |
| Z-score window | 168(短期足)/ 30(長期足) | ローリング標準化窓 |
| ラグ相関の最大ラグ | 48 | クロスコリログラム範囲 |
| 自己相関の最大ラグ | 48 | 同上 |
| ローリング相関 window | 720(1 ヶ月相当 1hour) | 安定性検証用 |
| 冗長性の閾値 | |r| > 0.8 | redundant フラグ基準 |
| 予測力の閾値 | |r| > 0.05 | promising の最低条件 |
| ノイズ判定の閾値 | |r| < 0.03 | noisy の基準 |
| リーク疑いの閾値 | shift なし PnL が 2x | leak-suspect 基準 |
| 既存指標セット | SMA20 乖離 / EMA20 乖離 / RSI14 / ROC12 / ATR14/close / BB 幅20 | redundancy 比較対象 |
ローカル環境なので、このファイルのデフォルト値を直接編集しても OK。
可視化(オプション)
トリガー規律・実行環境の解決・出力先・スタイル・安全規律は
_shared/references/visualization-guide.md に従う。デフォルトは off
(ユーザーが明示的に求めたとき、または提案に同意したときだけ描く)。
チャートはテキスト出力(テーブル + 判定サマリー)の後に描き、
その置き換えにはしない。
本 skill の標準チャート:
| チャート ID | 内容 | 主な構成要素 |
|---|
signal-explorer.scatter | シグナル vs 将来リターン散布図 | Step 1 の s[t] × r_fwd[t] の散布 + 最小二乗直線。Pearson / Spearman r をタイトルに併記 |
signal-explorer.lag-correlation | ラグ相関プロファイル | Step 3 の corr_lag[k](k=1..max_lag)の棒グラフ + r=0 の水平線。多重比較への注意を脚注に |
signal-explorer.autocorrelation | シグナル自己相関(粘着性) | Step 4 の自己相関の棒グラフ。粘着 / 非粘着の判定ラベルをタイトルに |
signal-explorer.sign-pnl | 符号ベース簡易 PnL 比較 | Step 6 の 3 系列(生符号 / Z-score 符号 / Buy & Hold)の累積 PnL。cost & sizing ignored; short side = math simulation (bitbank spot is long-only) を図中に明記 |
signal-explorer.leak-check | リーク検証比較 | Step 7 の shift(1) あり / なしの累積 PnL 2 系列。VALIDATION ONLY — do not trade the no-shift series を図中に明記 |
チャート固有の注意:
scatter は NaN 除外後の系列で描く(Z-score 序盤の NaN・経路 C の欠損行を
含めない)。点数が多い場合は alpha を下げて重なりを見せる
lag-correlation / autocorrelation の値は本文のテーブルと一致していること
(Validation Loop と同じ整合性検証を図にも適用する)
sign-pnl / leak-check の系列はいずれもコスト無視の予測力チェック用。
本格評価の図が欲しい場合は backtest skill の backtest.equity-curve へ誘導する
Gotchas
- 将来リターンの向きを間違えるとリーク。
shift(-1) が未来、shift(1) が過去。
r_fwd[t] = log(close[t+1]/close[t]) を必ず確認する
- rolling 計算で
center=True は厳禁。 未来データを参照してしまう。
全ての rolling は 末尾合わせ(trailing window) で計算
- 全期間正規化は厳禁。 Z-score も min-max もグローバルだとリーク。
必ずローリングで標準化する
- p 値は楽観バイアス。 ファットテール + 自己相関で p 値は過小評価される。
判定は r の絶対値とローリング相関の安定性 を重視。p 値だけで結論しない
- Spearman と Pearson の差が大きい(|差| > 0.05) → 外れ値の影響を疑う。
非線形変換(log、Z-score)の余地あり
- シグナルの自己相関が極端に高い(lag=1 で > 0.99) → シグナルが価格そのものに
近すぎる可能性。rolling 窓が大きすぎないか、定常化忘れがないかを確認
- 多重比較問題。 48 ラグ × 複数指標で「たまたま当たった」候補が出る。
Bonferroni 補正等は
references/exploration-guide.md 参照
- シグナルが NaN を含む場合。 経路 C や rolling 計算で序盤が NaN になる。
全 step で「NaN 行を除外してから相関計算」を徹底(NaN を 0 埋めしない)
- シグナルと将来リターンの timestamp 整列。
s[t] と r_fwd[t] のインデックスが
ずれていると相関が無意味。経路 C は left-join 後にインデックスを再点検する
- ショートは方向検証用。 bitbank 現物ではロングのみ実行可能。簡易 PnL の
ショートサイドはあくまで「シグナルの方向性が機能するか」を見るための
数学的シミュレーションであり、実運用に直結しない
- コスト無視は本 skill 限定。 promising と判定されても、往復の手数料
(
bitbank pairs の taker レート × 2)で簡単に利益が消える。
本格評価は必ず backtest skill へ
- データ本数。 短期足は最低 1,000 本、できれば 5,000 本以上。
少ないと相関が偶然に支配される
- API がエラーを返した場合は
_shared/references/bitbank-api-formats.md を参照
参照資料
詳細な理論的背景・経路 C の入力フォーマット仕様・多重比較補正の実務・
promising 判定後の backtest 引き渡し手順は references/exploration-guide.md を参照。