Insights·2026-07-28

バックテストの収益率が本当の実力かどうかをどう確かめるか — 保有比率と露出調整後アルファ

収益率の隣に保有比率を並べ、収益率から保有比率×バイアンドホールド収益率を差し引く。残った値が市場への露出では説明できない部分、すなわちアルファである。保有比率とは、バックテスト期間の全取引日のうち実際にポジションを持っていた日の割合を指す。この数字を欠いたまま収益率だけを見ると、戦略が正しかったから稼いだのか、単に市場にいなかっただけなのかを区別できない。広く教えられている五つのテクニカル手法を、個別株・レバレッジETF・指数ETFの十六銘柄でウォークフォワードに回すと、その違いがそのまま表れる。五つとも一つもバイアンドホールドに勝てず、勝率が最も高いものでも34.5パーセントだった。さらに、その資産が当該区間で上がった幅と戦略の超過収益は相関マイナス0.945で結びついていた。資産が上がれば戦略は負け、下がれば勝つということだ。原因は露出だった。1年区間の平均保有比率は23.8パーセントで、残りの時間は現金である。露出調整後アルファは中央値マイナス5.73パーセントポイント、回帰の切片はマイナス0.52パーセントポイントと、事実上ゼロ以下だった。本稿はその検証を一から再現できるよう、手順と計算式にまとめたものである。

前の記事の続きAI エージェントに売買ルールをバックテストさせるには、何を決めておく必要があるか?

保有比率とは何か、なぜ収益率より先に見るのか

保有比率(time in market)とは、バックテスト期間の全取引日のうち実際に株を持っていた日の割合である。252取引日を回してそのうち60日しかポジションがなければ、保有比率は23.8パーセント。残る192日は現金だったという意味だ。

なぜこれを先に見るのか。市場に半分しか入っていなければ、利益も損失もおおよそ半分しか届かない。上昇相場で戦略の収益率が低いのは判断を誤ったからではなく、単にその場にいなかっただけかもしれない。下落相場で損失が小さいのも、うまく避けたからではなく同じ理由かもしれない。収益率という一つの数字だけを見ると、この二つが完全に混ざる。

だからバックテストの結果表を受け取ったら、収益率の隣に保有比率の列を必ず立てる。実力と不在はそこから分かれる。

検証対象 — 広く知られたテクニカル手法五つ

対象は海外のトレーディング教育で繰り返し扱われる五つである。まずそれぞれが何かを解いておく。

エルダーBBPは、アレキサンダー・エルダーのブル・ベア・パワーをEMAの並びとADXに束ねたものだ。20日指数移動平均が50日の上にあれば上昇配列とみなし、ADXが25以上なら트렌드が十分強いと判断したうえで、買い勢と売り勢の力が入れ替わる地点を進入タイミングとする。

スーパートレンド・プルバックはATRベースのトレンドラインで方向を決め、RSIで過熱圏を除き、ストキャスティクスで押し目を捉え、MACDで大きなトレンドを再確認する四重フィルターである。ICT IFVGは、ローソク足三本の間に生じた価格の空白(フェアバリューギャップ)が逆方向に抜かれると、その区間が支持・抵抗に反転すると見る手法だ。

残る二つはデイトレード講師として知られるロス・キャメロンの規則である。一つはRSIの売られ過ぎとボリンジャー下限の割り込みにダブルボトムを重ねる反転手法、もう一つは価格が安値を切り下げる一方でRSIが安値を切り上げるダイバージェンスに、MACDのクロスを確認シグナルとして添えた手法だ。

どう回したか — ウォークフォワードの手順

まず日足を集める。韓国銘柄はNaverファイナンスの相場JSON、海外銘柄はTiingoの調整済みOHLCを用いた。配当と株式分割が反映された調整済み株価でなければならない。未調整の終値を使うと分割日に価格が急落し、存在しなかった売りシグナルが生まれる。

次がこの検証の核心である。シグナルはその日の終値までのデータのみで計算し、実際の約定は翌日の始値に置く。同じ日の終値で約定したことにすると、まだ知り得ない情報で売買したことになり、そのバックテストは丸ごと意味を失う。これをルックアヘッド・バイアスという。

指標のウォームアップも要る。50日移動平均を使う手法があるため、測定区間の前に最低150取引日を余分に確保し、各時点のシグナルは直前400本のみを切り出して計算した。

最後に、終了時点を一つに固定しなかった。今日だけを基準に測ると、直前に急落相場があったかどうかで結果が丸ごと揺れる。そこで終了日を21取引日ずつ過去へずらし、最大36の時点で同じ測定を繰り返した。

約定ルール(ルックアヘッド遮断)
// シグナルは t-1 日の終値までのデータのみで算出する
const want = signals[t - 1]?.direction === 'LONG' ? 1 : 0

if (pos === 0 && want === 1) {
  // 進入:翌日の始値で約定し、その日の終値まで保有
  equity *= (1 - buyCost) * (rows[t].close / rows[t].open)
} else if (pos === 1 && want === 1) {
  // 保有:前日終値 → 当日終値
  equity *= rows[t].close / rows[t - 1].close
} else if (pos === 1 && want === 0) {
  // 手仕舞い:翌日の始値で約定
  equity *= (rows[t].open / rows[t - 1].close) * (1 - sellCost)
}
pos = want

結果1 — 五つとも一つもバイアンドホールドに勝てなかった

十六銘柄に終了時点のローリングを掛けると、期間ごとに数百から千単位の比較セルが出る。取引が一度でも発生したセルだけを数えて勝敗を集計した。

全戦略の勝率が50パーセントを下回り、保有期間が長くなるほどさらに下がる。1か月の窓で38.5パーセントだった勝率が、1年の窓では18.7パーセントになる。

取引コストを外して回し直しても結果は覆らず、最良で12勝12敗だった。取引頻度自体が低くコスト感応度が大きくないという意味であり、同時に成績不振の原因が手数料ではないという意味でもある。

期間比較セル戦略勝率超過収益中央値戦略中央値バイアンドホールド中央値
1か月72238.5%-2.7pp+0.5%+3.2%
6か月1,06127.7%-17.6pp+2.9%+19.5%
1年1,15918.7%-39.0pp+6.0%+44.9%

結果2 — 勝敗を分けたのはその資産が上がったかどうかだった

表を銘柄ごとに分解すると、一つの規則があった。その資産が当該区間で上がった幅と、戦略の超過収益が逆向きに結びついていた。相関係数は1か月でマイナス0.808、6か月でマイナス0.905、1年でマイナス0.945である。

バイアンドホールド収益率の区間で切ると、もっと明確になる。資産が20パーセント超下げた区間で戦略の勝率は89.1パーセント、100パーセント超上げた区間では1.8パーセントだ。

つまり戦略が勝つ条件は戦略自体ではなく資産にある。そしてその区間で資産が上がるか下がるかは、過ぎてからしか分からない。前もって分かるなら、そもそも手法は要らない。

区間のバイアンドホールド収益(1年窓)比較セル戦略勝率超過収益中央値
-20%未満25689.1%+25.1pp
-20 ~ 0%25862.0%+5.2pp
0 ~ 20%50414.9%-13.7pp
20 ~ 50%7993.8%-30.2pp
50 ~ 100%5553.1%-61.9pp
100%以上5521.8%-167.7pp

結果3 — レバレッジETFなら通用するという仮説も棄却された

最初に六銘柄だけ回したときは、2倍レバレッジETF一つでのみ戦略が勝っていた。長期保有が構造的に壊れる資産だからかと思い、レバレッジETF六種と同じ原資産の無レバレッジETF四種を追加で回した。

レバレッジ群の内部で結果が正反対に割れた。3倍ETF四つのうち二つは勝ち、二つは惨敗した。勝った側の共通点は倍数ではなく、その区間のバイアンドホールド収益率がマイナスだったことである。

無レバレッジの対照群でも同じだった。最も上がらなかった銘柄でのみ勝率が跳ねた。結局レバレッジは変数ではなく、結果2の規則がそのまま貫いていた。

銘柄倍数1年勝率超過収益中央値バイアンドホールド中央値
TSLL2倍62.7%+23.8pp-11.7%
LABU3倍55.5%+5.8pp-16.5%
NVDL2倍18.7%-49.1pp+45.5%
SOXL3倍21.0%-78.9pp+79.2%
TQQQ3倍3.8%-67.1pp+67.5%
SPXL3倍3.3%-45.5pp+40.1%

露出調整後アルファを自分で計算する方法

ここまでが診断で、次が読者が自分のバックテストにすぐ適用できる手順である。必要な値は三つだけだ。戦略収益率、同じ区間のバイアンドホールド収益率、そして保有比率。

まず保有比率を求める。シミュレーションのループでポジションが1の日を数え、全取引日で割ればよい。次に戦略収益率から保有比率×バイアンドホールド収益率を差し引く。残った値が、市場への露出だけでは説明できない部分である。

標本が複数あるなら回帰でもう一度見る。超過収益をバイアンドホールド収益に回帰させ、切片を読む。この切片が平均的なアルファだ。傾きは照合用で、露出以外に何もなければ傾きはおおよそ保有比率マイナス1に収束する。

今回の標本の数字はこうだった。実測の傾きマイナス0.845に対し、平均保有比率23.8パーセントから予測される傾きはマイナス0.762。ほぼ重なる。そして切片はマイナス0.52パーセントポイントだった。露出調整後の超過収益は中央値マイナス5.73パーセントポイント、プラスの比率は33.3パーセントである。

まとめると、この五つの手法が売っていたのは超過収益ではなく、市場から外れていた時間だった。統計物理学者の金範俊教授が移動平均に依拠した戦略には科学的根拠がないと述べたのと同じ方向だが、もう一歩入ると、間違っていたというより初めから別の商品だったという方が近い。

露出調整後アルファ
// 1) 保有比率
const exposure = daysInMarket / totalDays

// 2) 露出で説明される分を引いた残りがアルファ
const alpha = strategyReturn - exposure * buyHoldReturn

// 3) 標本が複数なら回帰の切片で確認
//    excess = a + b * buyHold   (a がアルファ、b は -(1-exposure) に収束)
//
// 実測: b = -0.845, -(1 - 0.238) = -0.762, a = -0.52pp
// 露出調整後アルファ中央値 -5.73pp、プラス比率 33.3%

この検証の限界

標本は十六銘柄である。個別株五、レバレッジETF七、無レバレッジETF四。テクニカル分析一般についての結論ではなく、この五つの手法、この標本、この規則についての結論だ。

規則も単純化した。ロングオンリーに統一し、損切り・目標価格・分割買いといった実戦の運用規則は入れていない。売りシグナルは空売りに使わず現金として扱った。シグナル自体の性質を見るための設計だが、運用規則が付けば数字は変わり得る。

取引コストは韓国の買い0.065パーセント、売り0.215パーセント(証券取引税込み)、海外は片道0.12パーセントとした。スリッページの仮定が入った値なので、証券会社や約定状況によって変わる。前の記事で扱ったとおり、約定の仮定を書いた一行が結果を大きく揺らし得るため、他人のバックテストを見るときも判定時点・約定価格・取引コスト・データ区間の四つを併せて確認する方が安全である。