← 記事一覧に戻る
July 2, 2026
読了時間: 5分

デフレーテッド・シャープレシオ:バックテストの「勝者」のうち、多重検定を生き延びるのは何割か?

デフレーテッド・シャープレシオ:バックテストの「勝者」のうち、多重検定を生き延びるのは何割か?
#algotrading
#backtest
#overfitting
#statistics
#sharpe
#multiple-testing
#validation
🎯
Part 6 of 7 · Collection
Backtesting Without Fooling Yourself

「幻想なきバックテスト」シリーズの一篇。

📄 この記事は研究論文に発展しました。 以下のすべての数値は、制御された既知の正解——純粋ノイズのサーチ、エッジを仕込んだサーチ、そして実際に相関したパラメータグリッド——を構築する1つの決定論的スクリプトから得られており、そこにデフレーテッド・シャープレシオ、Harvey-Liuの多重検定ヘアカット、Whiteのリアリティチェック/HansenのSPAを走らせて、各手法の偽発見率と検出力を直接測定しています。論文はオンライン版(インタラクティブ版+PDF)をdeflated-sharpe.marketmaker.ccで、コードとデータはgithub.com/suenot/deflated-sharpe-searchで公開しています。

パラメータスイープを実行する。ファストの長さ16通り、スローの長さ40通り、移動平均クロスオーバーの組合せ640通り。グリッドが終わると、1つのセルが輝く:年率シャープレシオ3.9、単一検定のp値は6×10126\times10^{-12}。有意性の12個のゼロ。あなたは何かを見つけた。

あるいは、あなたは何も見つけておらず、サーチがあなたの代わりにそれを見つけただけかもしれない。

パラメータサーチは検定ではない。それはN回の試行のうち最も運が良かったものを見つける機械であり、試行回数を増やすほど、その勝者は——本物のエッジがあろうとなかろうと——より運が良く見えるようになる。best-of-Nのシャープレシオは選択によって水増しされる。1,000人の無作為な人々の中で最も背が高い人が背が高く見えるのと同じ理屈だ:背の高さが本物だからではなく、あなたがサーチしたからだ。勝者の隣に印字される単一検定の統計量——そのp値、t統計量、「これは有意か?」——は、事前に登録された1つの仮説のために設計されたものだ。それらにサーチの生存者を与えれば、毎回、自信満々に嘘をつく。

この記事は、それらがどれほどひどく嘘をつくかを正確に測定し、それを修正する3つのツールを測定する。要点は制御された既知の正解にある:私たちは答えを知っているリターンを生成する——時にはエッジがゼロの純粋なノイズ、時には既知の強さのエッジを仕込んだもの——そうすれば「その手法は正しかったか?」は判断の余地のある問いではなく、事実になる。まず結論を先に示そう。誠実な答えが常に「発見なし」である既知の帰無サーチにおいて、各検定がどれだけの頻度で「オオカミが来た」と叫ぶかがこれだ:

検定 既知の帰無サーチにおける偽発見率 判定
素朴な「最良のシャープレシオは有意か?」 1.000 毎回例外なく発見を宣言する
デフレーテッド・シャープレシオ(DSR ≥ 0.95) 0.001 制御されている
Harvey-Liuヘアカット — Bonferroni 0.057 ほぼ制御されている
Harvey-Liuヘアカット — Holm 0.057 ほぼ制御されている
Harvey-Liuヘアカット — BHY 0.007 制御されている
Whiteのリアリティチェック(ブートストラップ) 0.022 制御されている

サーチあたり戦略1,000個、それぞれ観測1,000個、独立した帰無サーチ2,000回、真のシャープレシオはすべて0。合成iid正規分布リターン、seed 0、α = 0.05、年率換算252期間。素朴な検定の偽発見率は高いのではなく——ちょうど1なのだ。

1行目を、それが刺さるまで読んでほしい。純粋なノイズに対して5%の確率で発火するはずの検定が、**100%**の確率で発火する——なぜなら、あなたはそれに純粋なノイズを見せているのではなく、純粋なノイズを1,000回引いた最大値を見せているからであり、1,000人のコイン投げ師の最大値は常に天才のように見えるからだ。他のすべての行は、これを知った上で補正する手法だ。この記事全体のテーマはこれに尽きる:なぜ1行目が1.000で、他はそうでないのか、そして(最終セクションで扱う)優れた手法でさえ誠実さを保つために2段階目の補正が必要になる唯一の場所はどこか。

第1幕——罠:サーチは無からシャープレシオを製造する

パラメータサーチを、1,000本のランダムな戦略カーブを漏斗に通すスロットマシンとして描いた図。最も運の良い1本だけが誘惑的なシャープレシオのラベルを付けて浮かび上がり、その背後で捨てられたカーブがノイズへと消えていく

最もクリーンな罠から始めよう。リターンが独立な標準正規分布ノイズである戦略をN=1000N = 1000個生成する——ドリフトなし、スキルなし、すべてについて真のシャープレシオはちょうどゼロ。それぞれT=1000T = 1000個の観測を持つ。ここで、すべてのパラメータサーチがやることをやる:最良の1つを残す。

best-of-1000の観測あたりシャープレシオは平均0.1027で、年率換算すると1.63になる(導出:0.1027×2521.630.1027 \times \sqrt{252} \approx 1.63)。これは控えめな数字ではない。年率シャープレシオ1.63といえば、戦略に資金がつき、論文が書かれ、資金配分される類の結果だ。それが、ドリフトをゼロに設定した乱数生成器から生まれた。

では、その勝者を素朴な有意性検定——どのバックテストライブラリも無料で出力してくれるあれ——に渡してみよう。シャープレシオをt統計量に変換し(t=SR^Tt = \hat{SR}\sqrt{T})、片側p値を取り、p<0.05p < 0.05なら発見と呼ぶ:

t=SR^T,p=1Z(t),"discovery" if p<αt = \hat{SR}\sqrt{T}, \qquad p = 1 - Z(t), \qquad \text{"discovery" if } p < \alpha

これらノイズの勝者の単一検定p値の中央値は0.000686——エッジのない戦略から出た「有意性」の3個のゼロだ。そして2,000回の独立した帰無サーチ全体で、素朴な検定はそのすべてで発見を宣言する:偽発見率1.000。「水増しされている」のではない。「やや高い」のでもない。単一の帰無仮説に対しては構造上たかだか5%の確率でしか正しくない検定が、サーチの勝者に対しては100%の確率で誤っているのだ。

メカニズムは、名前をつけてしまえば微妙でも何でもない。素朴な検定が問うのは「帰無仮説の下で、このシャープレシオは偶然に生じ得るか?」——これはデータを見る前に選んだ戦略に対しては公正な問いだ。しかしあなたがこれを選んだのは、それが1,000個の中で最高のシャープレシオを持っていたからこそだ。あなたは最大値に対して条件付けをしており、最大値の標本分布は単一の抽出の標本分布とはまるで違う。これは、私たちの先読みバイアス分類が反対側から診断したのと同じ病だ——あちらでは1バーのリークがノイズから15のシャープレシオを製造した。こちらではサーチが、リークなど一切なく、純粋に選択だけでノイズから1.63のシャープレシオを製造する。メカニズムは異なるが、症状は同一だ:見た目は素晴らしいが、何の意味もないシャープレシオ。

重要なのは1.63という数字なので、覚えておいてほしい。これはこのサーチのノイズ天井——エッジがゼロの戦略1,000個のうち最も運の良いものが叩き出すと期待すべきシャープレシオだ。サーチの勝者に対する誠実な検定は、ゼロと比較するのではなく、これと——1,000回見たときに運だけがもたらすものと——比較しなければならない。

第2幕——道具箱:サーチの値段を付ける3つの方法

作業台に並んだ3つの測定器具。いずれも同じ水増しされたシャープレシオの数字に狙いを定めている:ベンチマークのバーを引き下げるデフレーションゲージ、目盛り付きヘアカット用ハサミ、そしてリターン系列の影のコピーを何本も生み出すブートストラップ再標本抽出ホイール

3つの研究プログラムが、それぞれ独立に到達しながら、同じ処方箋にたどり着く:勝者をゼロと比較するのをやめ、このサイズのサーチが運だけで生み出すものと比較せよ、というものだ。違うのは、その比較をどう構築するかだ。

PSRとデフレーテッド・シャープレシオ(Bailey & López de Prado, 2012 / 2014)

**確率的シャープレシオ(PSR)**は、「シャープレシオは正か?」よりも鋭い問いを立てる。サンプルの長さとリターンの形状(歪度、ファットテール)を踏まえたとき、真のシャープレシオがベンチマークSRSR^*を上回る確率はどれだけか、と問うのだ。

PSR(SR)=Z ⁣((SR^SR)n11γ^3SR^+γ^414SR^2)\text{PSR}(SR^*) = Z\!\left( \frac{(\hat{SR} - SR^*)\sqrt{n-1}}{\sqrt{\,1 - \hat\gamma_3\,\hat{SR} + \frac{\hat\gamma_4 - 1}{4}\,\hat{SR}^2\,}} \right)

ここでZZは標準正規分布の累積分布関数、γ^3\hat\gamma_3は歪度、γ^4\hat\gamma_4非超過(non-excess)規約での尖度である(正規分布 ⇒ γ^4=3\hat\gamma_4 = 3;ここに3を足さずに超過尖度を代入すると、デフレーションの計算が狂う)。SR=0SR^* = 0と置けば、PSRは単なる有限サンプルの有意性検定になる。魔法はSRSR^*をうまく選ぶところにある。

デフレーテッド・シャープレシオは、ゼロではなくサーチ全体の期待最大シャープレシオをベンチマークとして評価したPSRである:

SR0=Var[{SRn}]  ((1γ)Z1 ⁣(11N)  +  γZ1 ⁣(11Ne))SR_0 = \sqrt{\operatorname{Var}[\{SR_n\}]}\;\Big(\,(1-\gamma)\,Z^{-1}\!\big(1 - \tfrac{1}{N}\big) \;+\; \gamma\,Z^{-1}\!\big(1 - \tfrac{1}{N e}\big)\Big)

ここでVar[{SRn}]\operatorname{Var}[\{SR_n\}]N回の全試行のシャープレシオにわたる分散(サーチ自身が生み出したばらつき)、γ0.5772\gamma \approx 0.5772はオイラー・マスケローニ定数、そして2つの逆正規項は、NN個の標準正規分布からの抽出の期待最大値に対する極値理論の近似である。コードにすると、印象的と言うには短すぎるくらいだ:

def expected_max_sharpe(sr_variance, N, mean_sr=0.0):
    """E[max of N independent SR estimates ~ N(mean_sr, sr_variance)]
    (Bailey & LdP 2014)."""
    g = EULER_MASCHERONI                       # 0.5772156649
    a = norm.ppf(1.0 - 1.0 / N)                # Z^{-1}(1 - 1/N)
    b = norm.ppf(1.0 - 1.0 / (N * E))          # Z^{-1}(1 - 1/(N e))
    return float(mean_sr + np.sqrt(sr_variance) * ((1.0 - g) * a + g * b))

すると、DSRは単に、そのデフレートされたバーを使ったPSRに過ぎない:

def deflated_sharpe(sr_max, sr_estimates, T, skew=0.0, kurt=3.0, N=None):
    """DSR = PSR(sr_max, SR0). Returns (dsr, sr0)."""
    v = float(np.asarray(sr_estimates).var(ddof=1))   # dispersion of the search
    m = float(np.asarray(sr_estimates).mean())
    if N is None:
        N = len(sr_estimates)
    sr0 = expected_max_sharpe(v, N, mean_sr=m)
    return psr(sr_max, sr0, T, skew, kurt), sr0

DSRは確率である。DSR1α=0.95\text{DSR} \geq 1 - \alpha = 0.95のとき、私たちは発見を宣言する:勝者の真のシャープレシオが運による期待最良値を95%の確信度で上回っている、という意味だ。SR0SR_0に組み込まれた、決定的に重要な前提に注意してほしい:NN回の試行は独立として扱われている。第5幕はまるごと、それが独立でないときに何が起きるかを扱う。

Harvey-Liuヘアカット(2015)

HarveyとLiuは同じ問題に、多重検定のp値補正——「M回の検定を行ったのだから、自分をだまさないようにしよう」という古典的な仕組み——を通じて挑む。MM個の単一検定p値p(1)p(M)p_{(1)} \le \dots \le p_{(M)}を並べ、それらを水増しする:

piBonf=min[Mp(i),1],piHolm=min ⁣[maxji{(Mj+1)p(j)},1]p_i^{\text{Bonf}} = \min[\,M\,p_{(i)},\,1\,], \qquad p_i^{\text{Holm}} = \min\!\Big[\max_{j\le i}\{(M-j+1)\,p_{(j)}\},\,1\Big]

Bonferroniは鈍器のような手法だ(すべてのp値にMMを掛けることで、いずれかの偽陽性が生じる確率を制御する)。Holmはそれよりも一様に検出力の高い、ステップダウン式のいとこにあたる。3つ目のBenjamini-Yekutieli(BHY)は、偽発見率——棄却したもののうち誤っている割合の期待値——を制御し、決定的に重要なことに、検定間の任意の依存関係の下でもそれを行う。分子に調和級数の正規化項を使うことで:

c(M)=j=1M1j,c(1000)7.49c(M) = \sum_{j=1}^{M} \frac{1}{j}, \qquad c(1000) \approx 7.49

c(1000)=7.49c(1000) = 7.49というのは、1,000回の試行が独立だと仮定しないことに対してBHYが課す代償であり、FDRのしきい値をlnM\ln Mのように増大する係数で水増しする。「ヘアカット」そのものが、この手法の核心となる指標だ:補正後のp値を再びシャープレシオに変換し、元のシャープレシオのうちどれだけを削り取らなければならなかったかを報告する。ヘアカットが100%なら、勝者は完全に多重検定で説明できることを意味し、15%ならほとんどが生き残ることを意味する。

Whiteのリアリティチェックと HansenのSPA(2000/2005)

3つ目のツールは、分布に関する仮定を一切置かない。Whiteのリアリティチェックは、すべてのルールの実際のリターンを取り、ルール間の最大値統計量を構成し、その帰無分布を直接ブートストラップする:

RCT=maxk=1,,KTfˉkRC_T = \max_{k=1,\dots,K} \sqrt{T}\,\bar{f}_k

ここでfˉk\bar{f}_kはルールkkのベンチマークに対する平均パフォーマンスである。リターンを定常ブートストラップ(Politis-Romano——ランダムな長さのブロックを使うことで、系列相関がリサンプリングを生き延びる)でリサンプリングし、構成上帰無仮説を満たすよう各抽出を再センタリングし、抽出のたびに最大値を再計算し、観測された最大値を上回るブートストラップ最大値の割合としてp値を報告する。HansenのSPAはRCを2つの点で鋭くする:スチューデント化(各ルールの平均を自身の標準誤差で割ることで、1つの分散の大きな暴れ馬ルールが最大値を乗っ取れないようにする)と、帰無仮説の一貫した、サンプルに依存する再センタリングだ。私たちの実装はスチューデント化は加えているが、完全な一貫再センタリングのステップは加えていない——したがって、この記事がSPA型のp値を報告する箇所はすべて、完全なHansenのSPAではなくスチューデント化されたリアリティチェックとして読んでほしい。DSRが「この勝者はこのサーチの内部で特別か?」と問うのに対し、リアリティチェックは「試したルールの数を正直に考慮した上で、最良のルールは現金を上回るか?」と問う——そして、試行数を一切数えることなく、ブートストラップを通じて相関したルールをネイティブに扱う。この区別を覚えておいてほしい。最終セクションはこれにかかっている。

第3幕——キャリブレーションこそがすべての証明

偽発見率1でそびえ立つ1本のバーと、α水準の5%付近に張り付いた5本の短いバーを対比させたキャリブレーションチャート。ノイズ天井のシャープレシオ1.63を示す水平の参照線が引かれている

何も発見を宣言しない手法は、偽発見率もゼロになる——そして無用の長物だ。だから、これらのツールに対する意味のある検定は両面から行う必要がある:既知の帰無データでは偽発見をα\alpha以下に制御しなければならず、既知のエッジデータ(次のセクション)では、それでもなお発火しなければならない。このセクションはその前半だ。

1,000個のゼロエッジ戦略にわたるサーチを2,000回、独立に実行し、各手法が何回発見を宣言するかを数える。その回数を2,000で割ったものが偽発見率だ——そして真実はエッジなしなので、すべての発見は偽である:

検定 偽発見率(α = 0.05)
素朴な有意性検定 1.000
デフレーテッド・シャープレシオ 0.001
Harvey-Liu — Bonferroni 0.057
Harvey-Liu — Holm 0.057
Harvey-Liu — BHY 0.007
Whiteのリアリティチェック 0.022

原理に基づいたすべての手法が5%ラインかその近傍に着地する——2つのFWERヘアカットはわずかに上、DSR/BHY/RCはやや下——一方で素朴な検定は100に張り付いている。(BonferroniとHolmはここで同じ0.057を出しているが、これは偶然ではない:単一の最良戦略について、Holmの最初のステップは(M1+1)p(1)=Mp(1)(M-1+1)\,p_{(1)} = M\,p_{(1)}であり、構成上Bonferroniと同一になる。したがってこれは2つの独立した確認ではなく、1つの確認に過ぎない。)しかし、この研究全体で最も深い数字はこの表の中にはない——それはDSR列を生み出す、デフレートされたベンチマークだ。帰無サーチ全体で平均すると、SR0SR_0は観測あたり0.1030となり、年率換算すると1.63になる(導出:0.1030×2521.630.1030 \times \sqrt{252} \approx 1.63)——これは平均的なノイズの勝者が叩き出す1.63とまったく同じ値だ(1.63)。これは偶然ではない。アイデア全体がまさに機能している証拠だ:

デフレートされたバーはノイズ天井とぴったり重なる。 DSRはサーチの勝者にゼロを上回れとは求めない。このサイズのサーチが運だけで生み出す最良のスコア——ここでは年率1.63——を上回れと求めるのだ。ノイズ天井にちょうど並ぶだけの勝者はDSR ≈ 0.5(コイン投げと同じ)を記録する。だからこそ、帰無サーチの平均DSRは小さな値ではなく0.495になる。発見と呼ばれるためには、勝者は1.63を超え、さらにその先まで——PSRを0.95より押し上げるだけの余地を——クリアしなければならない。

これは演習全体の見方を変える。素朴な検定はゼロからの距離を測る。どんなサーチも自明にそのバーをクリアしてしまうため、無用なのだ。DSRはノイズ天井からの距離を測り、そのバーをクリアするのは本当に難しい——本来そうあるべきように。Harvey-Liuヘアカットとリアリティチェックは異なる道筋で同じ制御に到達し(BHYはc(1000)=7.49c(1000)=7.49の水増し、RCはブートストラップの最大値分布)、同じ近傍——0.001から0.057、α\alphaかその近傍——に着地する。Bonferroni/Holmの0.057は5%ラインをわずかに超えているが、ほんの少しだ:2,000回のモンテカルロ・サーチでは、0.05付近のFDR推定値の標準誤差は約0.005であり、0.057はα\alphaからおよそ1.4標準誤差離れているに過ぎない——これは壊れた保証ではなく、モンテカルロ・ノイズだ。「FWERを制御する」というのはそもそも漸近的な約束であって、T=1000T = 1000においてビット単位で厳密なものではない。

第4幕——検出力:本物のエッジは維持されるか?

水平軸に沿って仕込んだ真のシャープレシオが増加するにつれ、ほぼゼロから1へと立ち上がるS字型の検出力曲線。ノイズ天井のシャープレシオ1.63の位置に垂直の破線があり、曲線はそのすぐ右側で50%の検出力に達する。偽陽性を示す線は床に張り付いたまま平坦

偽発見を制御するのは検定の半分に過ぎない——すべてを棄却する偏執的な手法は完璧な0.000を記録するが、無価値だ。もう半分はこうだ:本物のエッジが実際に存在するとき、DSRはそれを見つけられるか?

エッジを1つ仕込んでみよう。1,000個の戦略からなる集団の中で、25個に既知の強さの本物のエッジを持たせ、残りはノイズのままにしておく。それからサーチを実行し、DSRが勝者に発見のフラグを立てるかを確認する。仕込んだエッジを弱いものから強いものへと掃引すると、検出力はきれいなS字カーブを描く(偽陽性率は終始~0に保たれる):

仕込んだ真のシャープレシオ(年率) DSR検出力 DSR偽陽性率
0.79 0.005 0.000
1.27 0.090 0.000
1.90 0.651 0.000
2.54 0.998 0.000
3.17 1.000 0.000

曲線がどこで折れ曲がるかに注目してほしい。ノイズ天井を下回る領域——真の年率シャープレシオ0.79は1.63を大きく下回る——では、DSRは0.5%の確率でしか発火せず、正しく「発見なし」と判定する:それほど弱いエッジは、1,000回試行のサーチが生み出す運と本質的に区別がつかず、そうでないふりをするのは検出力が高いのではなく、不誠実というものだ。天井のすぐ周辺で曲線は急峻に立ち上がる(1.27で0.09、1.90で0.65)。年率シャープレシオ2.54では検出力は0.998に達し、3.17では完璧な1.000になる。強いエッジはほぼ毎回維持され、偽陽性はゼロに張り付いたままで、50%検出力のクロスオーバー地点は年率シャープレシオ約1.73(1.27行と1.90行の間の補間による導出)にある——これはノイズ天井1.63のすぐ上であり、誠実なバーがまさに置かれるべき場所だ:エッジが1,000回試行のサーチが作り出すものを追い抜き始める地点。

これこそが、あなたが本当に求めている性質を、S字カーブとして言い表したものだ:ノイズ天井を下回るエッジは正しく運として棄却され、それを十分上回るエッジは検出力がほぼ1に近い状態で維持される。対照的に素朴な検定は、真のシャープレシオが0.79の時点でさえ、仕込んだエッジを67%の確率で「検出」する——しかしこの数字には意味がない。なぜなら、それが存在しないエッジを100%の確率で検出することは、すでに見た通りだからだ。何にでも発火する検定には検出力がない。識別力がないのだ。DSRは、限界的なエッジ(0.79と1.27の行)への感度を少し犠牲にする代わりに、本当に大事なもの——その発見が本物であること——を手に入れる。

第5幕——実務家の罠:相関したグリッド

移動平均クロスオーバーの結果を示すパラメータグリッドのヒートマップ。隣接するセル間の強いペア相関が浮かび上がっている。その横には、約2からほぼ400にわたる5通りの異なる有効試行数推定量の水平軸があり、本物のエッジがほぼ全域でデフレートされたバーをクリアしていることを示す網掛けの頑健性帯と、右端の過大カウント推定量だけがそこから下に沈む様子が描かれている

ここまではすべて独立な戦略を使ってきた——最もクリーンな設定であり、DSRの独立性の仮定が厳密に成り立つ設定でもある。実際のパラメータグリッドはそうではなく、ここでこそ、ツールを素朴に使うことが新たな誤りの温床になる。

正直な移動平均クロスオーバーサーチを取り上げよう:ファストの長さ16通り×\timesスローの長さ40通り=640= 640試行、それぞれ755観測。このようなグリッドは相関にどっぷり浸かっている——fast=45/slow=120とfast=45/slow=125はほぼ同一の戦略であり、そのリターン系列は一緒に動く。640試行にわたって測定した平均ペア相関は約0.61。これは640回の独立な賭けではない。まったくもって。

ケースA——ランダムウォーク(エッジなし):すべての手法が正しく葬り去る

純粋なランダムウォークにグリッドを実行する。勝者は魅力的に見える:パラメータfast=45/slow=120、最良年率シャープレシオ0.81、単一検定p値0.081。すべての手法がそれを見抜く:

手法 結果 判定
DSR(生のK = 640) 0.431 棄却(< 0.95)
リアリティチェック p 0.570 棄却
SPA型 p(スチューデント化RC) 0.569 棄却
Harvey-Liuヘアカット 100% 棄却

デフレーションを一切必要としない兆候から始めよう:この勝者の未補正の有限サンプル有意性、つまりPSR\text{PSR}-vs-ゼロでさえ、わずか0.918——640試行のうちたった1つを補正する前から、すでに0.95に届いていない。デフレーションはそれをさらに埋める:バーは観測あたりSR0=0.057SR_0 = 0.057、年率換算で~0.91(導出:0.057×2520.057 \times \sqrt{252})——勝者の0.81を上回る。最良の戦略はノイズ天井にすら到達せず、DSR ≈ 0.43(コイン投げより悪い)、そしてリアリティチェック、SPA型検定、100%のヘアカットすべてが一致する:ここには何もない、と。完璧だ。これは易しいケースであり、うまく機能する——そして、これから見るように、私たちが試すどの有効試行数においても棄却されたままだ。

ケースB——本物のレジームエッジ:生のDSRは誤る

今度は同じグリッドを、本物の、利用可能なエッジを持つレジームスイッチング系列に対して実行する。勝者は圧倒的だ:パラメータfast=3/slow=55、最良年率シャープレシオ3.92——これはインサンプルで選択されたシャープレシオであり、それ自体サーチによって選択で水増しされている(真の、あるいはアウトオブサンプルのエッジではない)が、その背後にあるレジーム効果は本物だ——単一検定p値は6×10126\times10^{-12}、未デフレートの有意性PSR\text{PSR}-vs-ゼロは実質的に1.000。ここには本物のエッジがあり、勝者はそれを見つけた。それでも生のDSRがそれを棄却する様子を見てほしい:

手法 結果 判定
DSR(生のK = 640) 0.748 棄却(< 0.95)✗ 過剰デフレート
リアリティチェック p 0.0024 確認 ✓
SPA型 p(スチューデント化RC) 0.0038 確認 ✓
Harvey-Liuヘアカット 15% 確認 ✓

生のDSR 0.748は本物のエッジの偽棄却である。原因は独立性の仮定であり、ここで大きく破られている:DSRは640回の相関した試行を640回の独立な抽出として扱うことで、デフレートされたバーを構築しており、そのため期待最大値SR0SR_0は観測あたり0.221——年率換算~3.51(導出:0.221×2520.221 \times \sqrt{252})まで水増しされる。3.51というバーに対して、3.92の勝者はわずかにしかクリアできず、DSRは0.748に着地する——0.95に届かない。このバーを押し上げる要因は2つある:生のカウント(一握りの有効な試行ではなく640回の試行)、そして試行間の本物のスキルのばらつき——一部のパラメータの組は実際にレジーム系列上でより優れており、これがVar[{SRn}]\operatorname{Var}[\{SR_n\}]を広げ、純粋な運だけがもたらす以上にSR0SR_0を押し上げる。両者は同じ方向に働き、バーは高くなりすぎる。なぜなら、このサーチは実際には640回の独立な視線などではなく、少数の独立な賭けを640回サンプリングし直したものに過ぎなかったからだ。

代わりに、DSRに有効試行数を与えよう。上で使った一行のコードは、平均ペア相関からの粗い推定量だ:

def effective_n_trials(returns_matrix):
    """N_eff = N / (1 + (N-1) * rho_bar), clipped to [1, N].
    Correlated trials -> fewer independent bets."""
    C = np.corrcoef(returns_matrix, rowvar=False)
    rho_bar = max(np.nanmean(C[np.triu_indices(C.shape[0], k=1)]), 0.0)
    N = returns_matrix.shape[1]
    neff = N / (1.0 + (N - 1) * rho_bar)
    return float(min(max(neff, 1.0), N))

ρˉ0.62\bar\rho \approx 0.62N=640N = 640のとき、グリッドは有効**Neff1.6N_{\text{eff}} \approx 1.6試行にまで縮退し(導出:640/(1+639×0.62)640 / (1 + 639 \times 0.62))、DSRは1.000**へと跳ね上がる。だが、その数字を祝う前に立ち止まってほしい。これはこのセクション全体の中で最も弱い証拠だからだ。Neff1.6N_{\text{eff}} \approx 1.6では、デフレートされたバーは年率SR00.25SR_0 \approx 0.25——実質的に試行の平均値、実質的にゼロ——まで潰れてしまう。そこではデフレーションは機能を停止している:Neff1.6N_{\text{eff}} \approx 1.6でのDSRは、単に勝者の未デフレートの有限サンプル有意性(PSR\text{PSR}-vs-ゼロ =1.000= 1.000)を再報告しているに過ぎない。判定は多重検定補正によって生み出されたものではなく、生の有意性から引き継がれたものだ。そして、ランダムウォーク側にも鏡写しの注意点がある:Neff1.6N_{\text{eff}} \approx 1.6でのその棄却が成り立つのは、その勝者がそもそも独立に見て限界的だった(PSR\text{PSR}-vs-ゼロ =0.918<0.95= 0.918 < 0.95)からに過ぎない。議論全体を1.6に固定してしまえば、懐疑派が肩をすくめるのももっともだ:あなたは補正をオフにして、その下にあったものをそのまま報告しただけなのだから。

だから、1つの推定量に固定してはいけない。誠実な——そしてより強力な——やり方は、NeffN_{\text{eff}}を標準的な5つの異なる方法で計算し、判定を帯全体にわたって読むことだ。以下は、同じ640試行のシグナルグリッドに適用した5つの推定量と、それぞれが示唆するデフレートされたバー、そして生み出されるDSRである:

有効試行数の推定量 NeffN_{\text{eff}} デフレートされたバー SR0SR_0(年率) DSR 判定
平均相関 1.6 0.25 1.000 維持
参加率(participation ratio) 2.4 0.43 1.000 維持
PCA(分散の95%) 16 1.85 1.000 維持
Kaiser基準(固有値 > 1) 21 2.00 0.999 維持
Cheverud-Nyholt 370 3.31 0.845 棄却
生のグリッド数(補正なし) 640 3.51 0.748 棄却

推定量について:平均相関は上記のN/(1+(N1)ρˉ)N/(1+(N-1)\bar\rho)の一行コードそのもの。参加率(λi)2/λi2(\sum\lambda_i)^2/\sum\lambda_i^2、およびPCA-95%/Kaiserのカウントは、相関行列の固有値から有効次元数を読み取るもの。Cheverud-Nyholtは遺伝学の文献に由来する固有値分散の推定量で、ほぼ等相関の状況下では過大カウントすることが知られている。

ここでようやく要点が着地する。それは「どんな補正でも救われる」ということではない。擁護可能な中間層——PCA-95%(Neff=16N_{\text{eff}} = 16)とKaiser(Neff=21N_{\text{eff}} = 21)——を見てほしい。これらはデフレーションがオフになる領域ではない。本物の年率SR0SR_0バー1.85から2.00を課している——ノイズを大きく上回る、16-21回の有効な視線に対する正真正銘の多重検定ペナルティだ。そして3.92のエッジはそれでもクリアする(DSR 1.000と0.999)。このシグナルは144.8未満のあらゆるNeffN_{\text{eff}}についてDSRを生き延びる(交差点から導出)。失敗するのはCheverud-NyholtのNeff=370N_{\text{eff}} = 370の場合だけであり、これは試行がほぼ等相関のときに過大カウントすることが証明されている推定量だ——そして生の、未補正のカウント640でさえ、DSRを0.748まで押し下げるに過ぎず、ゼロにはしない。ランダムウォークの勝者を、まったく同じ5つの推定量にかけると、そのすべてで棄却される(1を上回るどのNeffN_{\text{eff}}でも生き残らない)。これこそが本当の結果だ:1つの幸運な数字ではなく、標準的な有効試行数推定量の帯全体にわたって安定した判定——これは、そのうちの1つを信頼するよりもはるかに強い証拠である。

最も粗い推定量について、技術的な注意点を1つ。これは、それが帯の弱い端に位置する理由を説明してくれる:N/(1+(N1)ρˉ)N/(1+(N-1)\bar\rho)は、実際には相関する変数の平均に対する分散削減係数だ(相関ρˉ\bar\rhoの下で平均化がどれだけ得をもたらすか)。DSRのベンチマークは極値の量——試行の期待最大値——であり、したがって平均の分散縮小を試行数として使うのは機能的なミスマッチだ:方向としては正しい(相関している ⇒ 有効試行数は少ない)が、最大値の分布が実際に依存している量そのものではない。だからこそ、帯の中央にある固有値ベースの推定量の方がより信頼できる読み方であり、だからこそ、成果物は点ではなく帯なのだ。

教訓:両方のツールを使い、DSRに正しいNを与える

同じサーチの勝者を異なる角度から狙う2つの補完的な器具。一方には「この勝者はこのサーチの内部で特別か」という問いのラベルが付き、有効試行数のダイヤルを必要とする。もう一方には「データスヌーピングの後、最良のものは現金を上回るか」という問いのラベルが付き、相関をデータから直接読み取るブートストラップによって駆動される

ケースBからは2つのことが導かれ、どちらも決定的に重要だ:

  1. 試行が相関しているとき、生のグリッドサイズはDSRにとって誤ったNであり——単一の有効Nもまた正しいものではない。 独立性を仮定する式に640を代入すると、過剰にデフレートしてしまう:サーチが実際に到達したよりもはるかに高いノイズ天井を製造し、本物のエッジをその下に埋めてしまう。DSRには有効試行数が必要だ——しかし、その解決策は1つの推定量を信頼することではない(とりわけ最も粗いもの、Neff=2N_{\text{eff}} = 2付近で補正が機能を停止するものは尚更だ)。標準的な推定量の帯全体(ここでは1.6から370)にわたって判定を読み、それが安定しているかを確認することだ。このエッジについてはそうだった:デフレーションが本当に機能している範囲全体(Neff=16N_{\text{eff}} = 16-2121での本物の年率1.85-2.00のバー)で維持され、過大カウントする推定量の下でのみ失敗した。帯全体で安定した判定は、単一の数字よりもはるかに強力だ。
  2. DSRとリアリティチェックを組み合わせよ。 リアリティチェックとそのSPA型(スチューデント化)のいとこは、試行数への一切の手術なしにケースBを正しく判定したことに注目してほしい(p = 0.0024と0.0038)——それらは、仮想的な独立の賭けを数える代わりに実際の相関したリターン系列をリサンプリングするため、定常ブートストラップを通じてネイティブに依存関係を扱う。これが、有効N問題全体における決着のつけ方だ:RCはNNを一切必要としない。DSRとRCは異なる問いに答える:DSRは「この勝者はこのサーチの内部で特別か?」と問う(そしてサーチが取った有効な視線の数を知る必要がある)。RC/SPA型は「データスヌーピングの後、最良のルールは現金を上回るか?」と問う(そして依存関係をデータそのものから読み取る)。両方が欲しい。両者が食い違うとき——ここでの生のカウントDSRとRCのように——その食い違いは診断的だ:たいていの場合、それはあなたのNNが間違っていることを意味する。

これは、私たちの速度の梯子IPC税の研究がエンジニアリング側から繰り返し突き当たってきたのと同じ構造的な警告だ——巨大な相関したグリッドを実行する高速なサーチは、大量の独立した賭けを買えているわけではない。グリッドサイズを試行数として扱うことは、オプティマイザと有意性検定の両方を欺く。近日公開予定の姉妹編、バックテスト過学習の確率は、同じ選択バイアスをリサンプリング側(CSCV)から攻撃するもので、ここでのすべてと自然に対をなす:DSRは勝者に値段をつけ、PBOは手続きに値段をつける。

誠実さについての注記

率直に述べる3つの留保事項。制御された研究の要点は、それを誇張して売り込まないことにあるからだ。

  • リターンは合成データである。 キャリブレーションと検出力の実験にはiid正規分布を、本物のエッジのケースにはレジームスイッチング過程を用いた——これは市場のリアリズムのためではなく、制御された既知の正解のために選んだものだ。実際のリターンはファットテールで、自己相関があり、非定常だ。PSRの歪度・尖度項は、まさにその1つ目を扱うために存在する。ここでの成果物はキャリブレーションされた手法であって、戦略ではない:検定が偽発見を制御することを証明できるのは、発見すべきものが何もないと分かっているデータの上でそれを走らせたときだけだ。それには既知の正解を製造することが必要になる。
  • 標準となる有効N推定量は存在しない——だからこそ私たちは5つを報告した。 平均相関の一行式Neff=N/(1+(N1)ρˉ)N_{\text{eff}} = N/(1 + (N-1)\bar\rho)は査読者にも理解しやすく、方向性としては正しい(相関が強いほど有効試行数は少ない)が、それは平均に対する分散削減係数であり、DSRの最大値ベンチマークとは機能的にミスマッチであり、Neff<2N_{\text{eff}} < 2付近ではデフレーションを完全にオフにしてしまう。固有値ベースの推定量(参加率、PCA-95%、Kaiser)はより整合しているが、それでもヒューリスティックであり、Cheverud-Nyholtは等相関の下で過大カウントする。より完全で原理的なアプローチは試行のクラスタリングだ(Bailey & López de PradoのDSR付録3):すべてを1つのスカラーに潰すのではなく、相関構造によって試行をグループ化し、クラスターの数を数える。私たちが帯全体を報告するのは、まさにその選択が定まっていないからだ——5つの推定量すべてにわたって安定した判定こそが誠実な主張であり、単一の推定量の選択に依存した判定はそうではない。
  • ブートストラップはスチューデント化されたリアリティチェックであり、完全なHansenのSPAではない。また再標本数は実験ごとに異なる。 この記事が「SPA型」と言うときは常に、ルールごとのスチューデント化を伴うWhiteのリアリティチェックを指しており、Hansenの完全な一貫した、サンプルに依存する再センタリングは実装されていない。キャリブレーションの偽発見率は、400回のサーチにわたり、サーチあたり500回の定常ブートストラップ再標本を使用している。2つのケーススタディのRC/SPA型p値は、それぞれ5,000回の再標本を使用している。平均ブロック長は一貫して20(Politis-Romano)、α=0.05\alpha = 0.05、年率換算は252期間。これらを変えれば小数点第3位の数字は動く。しかし、素朴な検定の1.000対、原理に基づいた手法の0.001-0.057、ノイズ天井のすぐ上で50%の検出力に達するS字カーブ、そして判定を有効N帯全体にわたって読まなければならない相関グリッドの罠——というストーリーは変わらない。

まとめ

  1. パラメータサーチは多重検定の機械であり、素朴な有意性検定はそれに対して盲目だ。 1,000個のゼロエッジ戦略において、最良の年率シャープレシオは平均1.63、単一検定p値の中央値は0.000686——そして「これは有意か?」検定は100%の確率で発見を宣言する(偽発見率1.000)。無から生まれた素晴らしいシャープレシオが、そもそも正しい問いを立てたことのない検定によって「有意」のお墨付きを得てしまう。
  2. デフレーテッド・シャープレシオは、ゴールポストをゼロからノイズ天井へ動かす。 DSRは勝者をゼロではなく、このサイズのサーチの運による期待最良値であるSR0SR_0と比較する——帰無ケースでは、これは年率1.63に着地し、平均的なノイズの勝者がまさに位置する場所と一致する(導出:0.1030×2520.1030 \times \sqrt{252})。その帰無偽発見率は0.001。Harvey-Liuヘアカット(Bonferroni/Holm 0.057、BHY 0.007)とWhiteのリアリティチェック(0.022)は、別の道筋で同じ制御に到達する。
  3. 本物のエッジは維持される。 DSRの検出力は、年率シャープレシオ1.73——ノイズ天井1.63のすぐ上——で50%の検出力に達するS字カーブを描く:真の年率シャープレシオ0.79で0.005、1.90で0.651、2.54で0.998、3.17で1.000、偽陽性は終始0。天井を下回るエッジは正しく運と区別不能と判定され、それを上回るエッジは検出力がほぼ1に近い状態で維持される。
  4. 相関したグリッドは生のDSRを壊す——そして単一の有効Nはそれを救えない。救うのは帯だ。 640セルのMAクロスオーバー(平均ペア相関0.61)において、生のカウントDSRは本物の(インサンプルで選択された、年率3.92の)エッジを誤って棄却した(0.748 < 0.95)。640回の相関した試行は640回の独立な賭けではないからだ。しかし解決策は1つの魔法のNeffN_{\text{eff}}ではない——最も粗い推定(Neff1.6N_{\text{eff}} \approx 1.6)では、デフレーションは実質的にオフになっており(バーは年率0.25)、DSRは単に生の有意性をおうむ返ししているに過ぎない。本当の証拠は、このエッジが標準的な推定量の帯全体にわたって維持されていることだ——Neff=N_{\text{eff}} = 1.6/2.4/16/21でDSR 1.000/1.000/1.000/0.999、擁護可能なPCA-95%/Kaiserの中間域での本物の年率1.85-2.00のバーを含め、145未満のあらゆるNeffN_{\text{eff}}で生き残り、Cheverud-Nyholtの過大カウントである370でのみ失敗する。ランダムウォークはどの推定量でも棄却される。点ではなく帯を読め。
  5. DSRとリアリティチェックを組み合わせよ。両者は異なる問いに答えるからだ。 リアリティチェックとそのSPA型(スチューデント化)のいとこは、試行数への手術を一切行わずに本物のエッジを確認した(p = 0.0024と0.0038)——定常ブートストラップを通じて依存関係をネイティブに扱っており、これはまさに有効Nが争点になったときの決着のつけ方だ。DSRは「この勝者はこのサーチの内部で特別か?」と問い、RC/SPA型は「データスヌーピングの後、最良のものは現金を上回るか?」と問う。両者の食い違いは、あなたのNNが間違っているというシグナルだ。両方を実行せよ。

サーチの勝者は、無罪が証明されるまでは有罪だ。素朴なp値は無罪の証明にはならない——それはサーチ自身の水増しされた証言であり、純粋なノイズに対しても12個のゼロの確信度で保証書を書いてしまう。ベンチマークを運がもたらすものへとデフレートし、有効試行数を正直に数え、最大値をブートストラップしてセカンドオピニオンを得よ。3つのバーすべてをクリアするものは、本物である可能性がある。素朴なバーだけをクリアするものは、1,000人のコイン投げ師の中で最も背が高い者に過ぎない。

完全な実験——帰無キャリブレーション・ハーネス、仕込みエッジの検出力掃引、相関グリッドサーチ、そしてこの記事のすべての数値を1つの決定論的スクリプトから再生成できる仕組み——は、姉妹編の論文deflated-sharpe.marketmaker.ccにあり、コードとデータはgithub.com/suenot/deflated-sharpe-searchで公開している。

blog.disclaimer

Authors

Eugen Soloviov
Eugen Soloviov

Trading-systems engineer

Trading-systems engineer building bots since 2017: cross-exchange arbitrage (connected up to 30 venues), cointegration-based pairs arbitrage across spot and futures, scalping, news and sentiment-driven strategies, trend algorithms, and portfolio management and balancing algorithms. Also builds sub-millisecond order execution, big-data warehouses, backtesting engines, AI agents, and trading interfaces (incl. open-source profitmaker.cc). Stack: JS/TS, Python, Rust/Zig/Go, DevOps, backend, frontend, architecture.

Newsletter

市場の先を行く

ニュースレターを購読して、独占的なAI取引の洞察、市場分析、プラットフォームの更新情報を受け取りましょう。

プライバシーを尊重します。いつでも配信停止可能です。