ページ

2026年7月16日木曜日

「出口をいくら弄っても黒字にならない」ボットの本丸は特徴量だった ― FreqAIに3本目の相関ペアを足したら赤字が黒字に反転した話 07-16

暗号資産のペーパートレーディングボット kfreqai を運用していて、ずっと壁にぶつかっていた。勝率は50〜68%あるのに、損益はマイナス。 損切りを浅くする、時間帯でエントリーを絞る、確信度の高い取引だけに限定する — 決済とゲートの改善を10種類以上バックテストで試したが、ことごとく否定された。

今回、初めて損益を本質的に改善するレバーが見つかった。それはモデルが読む特徴量そのものを増やすことだった。この記事はその検証記録だ。

なぜ出口の改善が全部ダメだったのか

先に原因の話をする。以前、モデルの予測確率を実現結果で較正測定したところ、こういう数字が出た。

  • モデルが「勝率91.7%」と自称した取引群の、実際の勝率は 42.1%
  • 確信度の閾値を0.50〜0.80まで動かしても、実現勝率は42.0〜42.3%でほぼ平坦
  • ±1%バリア+往復手数料0.10%の損益分岐は実現勝率 52.6%

つまり「確信度の高い取引だけ選ぶ」が無意味(閾値を上げても勝率が上がらない)で、選別後42%は損益分岐の52.6%に構造的に届かない。ボトルネックは出口でもゲートでもなく、予測の質そのものだった。較正測定の結論は「特徴量・時間軸の見直しが本丸」。今回はそこに手を入れた。

仮説: 相関特徴量をもう1本増やす

kfreqaiのFreqAI(LightGBM)は、各銘柄のテクニカル指標に加えて、BTC/USDTとETH/USDTとの相関特徴量を市場全体のコンテキストとして使っている。ライブ120モデルのgain(利得)重要度を集計すると、こうなっていた。

=== 系統別gainシェア(CORR:=BTC/ETH相関特徴量) ===
  13.7%  CORR:ボリンジャー
  11.4%  ボリンジャー
   9.1%  CORR:ADX
   7.3%  CORR:SMA/EMA
   ...

CORR(BTC/ETH相関)系だけで全gainの約54%を占めていた。市場コンテキストがこれだけ効いているなら、3本目の相関ペアを足せばさらに予測が良くなるのでは — という仮説だ。3本目には、主要アルトの代表として SOL/USDT を選んだ。

同時に「デッド特徴の刈り込み」も検証した。同じ集計で、pct-change(変化率)系は合計gain 1.7%で12種中6種がデッド(平均gain 0.1%未満)、raw_volume 系も2.5%で5種デッド。これらを外して特徴空間の密度を上げれば、過学習が減るかもしれない。

検証: 主要13銘柄・2つの独立した窓で A/B

FreqAIは相関ペアを変えると特徴集合が変わるので、モデルを再学習して比較する。ずるが混じらないよう、地合い判定(advisory_state)は中立の空ファイルをシャドウマウントして「今の相場観」が過去窓に漏れないようにした。

第1窓(2026-06-13〜07-13、比較的良い相場):

構成 取引 損益 勝率 DD
corr2(現行 BTC/ETH) 224 -62.6 68.8%
corr3(+SOL) 177 +330.1 66.1% 1.00%
corr3+刈り込み 176 +332.9 60.8% 1.05%

SOLを足しただけで -62.6 → +330.1(Δ+392.7 USDT)。赤字が黒字に反転した。勝率はわずかに下がった(68.8→66.1)が損益は大きくプラス、つまり損益比(R:R)が改善している。今まで欲しかったのはまさにこれだった。

一発の窓で喜ぶのは危険なので、独立した別の窓でも確認した。

第2窓(2026-05-14〜06-13、厳しい相場):

構成 取引 損益 勝率 DD
corr2(現行) 271 -3501.2 56.1% 3.96%
corr3(+SOL) 270 -2576.8 56.7% 3.58%

こちらは両方とも赤字(相場が悪すぎた月)だが、SOL追加で損失を約26%削り(Δ+924.4 USDT)、ドローダウンも3.96%→3.58%に縮小した。

両窓・両方向で一貫して改善。 良い相場では黒字化、悪い相場では傷を浅くする。相関ペアの追加は市場の地合いを問わず効いた。

刈り込みは不採用 ― 「デッド=害はない」

一方、デッド特徴の刈り込みは見送った。損益はほぼ変わらない(+2.8)のに、勝率が66.1→60.8と落ちたからだ。gainが小さい特徴は「無駄」ではあっても「有害」ではなく、削ると勝率分布がむしろ悪化した。ついでに言うと、shift-2(2本前のシフト特徴)は個々のgainは小さいものの合計では28%を占めるので、これも丸ごと削ってはいけない。「効いていない特徴」と「消してよい特徴」は違う、という教訓になった。

実装と採用

検証が2窓で通ったので、本番(dry-run)に採用した。

# config.json の変更点
"include_corr_pairlist": ["BTC/USDT", "ETH/USDT", "SOL/USDT"]  # SOL追加
"identifier": "kfreqai-lgbm-v4-corr3"  # 特徴集合が変わるので新identifier必須

FreqAIは同じidentifierで特徴集合を変えると "different features" エラーで落ちるので、identifierを更新して全銘柄をゼロから再学習させる。ボットは再起動後、SOLを含む相関データを取得して新モデルの学習を開始した。全銘柄の再学習が終わるまでは既存の判断で運転を続ける。

何が学びだったか

このプロジェクトで一番時間を溶かしたのは、「決済構造をどう弄れば勝てるか」を延々と試したことだった。損切り-2%、時間切れ利確、指値エントリー、確信度フィルター … どれも小手先で、根本の予測精度の壁は動かせなかった。

較正測定が「モデルが本丸」と指し示してから、ようやく正しい場所を掘り始めた。そして最初の一撫で(相関ペア1本追加)で、10種類の出口改善がどれも届かなかった黒字化に手が届いた。測定がボトルネックを正しく指すまで、改善は徒労になる — 機械学習の運用で何度も言われることを、身銭(紙上だが)で確認した格好だ。

明日以降、13銘柄のバックテストで出た改善が、160銘柄の実運用でも出るかを観察していく。


※本システムは紙上取引(dry-run)で運用しており、実際の資金は動いていません。本記事は投資助言ではありません。バックテストは理想約定を仮定するため、実運用の結果とは乖離しうる点にも留意してください。