PBOの順位計算を壊さない|CSCVの同順位・負のSharpe・欠損処理

CSCVの学習勝者を検証側で昇順順位付けし同順位と中央値境界を分離する。 クオンツ投資

CSCVを実装してPBOを計算したところ、候補列の順番を変えただけで結果が変わった。全候補が赤字なのにPBOは低かった。同じSharpeを丸めて表示する候補を増やすと推定値が急変した。これらは、指標の限界だけでなく、順位方向・同順位・欠損値の実装仕様が表へ出ていないことから起こります。

本稿では、候補の損益行列を受け取ってからPBOを集計するまでの境界条件を点検します。焦点は「学習側の勝者が検証側のどこへ落ちたか」であり、利益を出す戦略の発見方法ではありません。図と数値例は架空の候補で計算したものです。

スポンサーリンク
【DMM FX】入金

順位は昇順、選択は最大値という約束を最初に固定する

基準となる一次論文はBailey・Borwein・López de Prado・ZhuのThe Probability of Backtest Overfittingです。第2.2節のCSCVは、同期した候補損益の行列を時間方向へ偶数のブロックに分け、その半分で候補を選び、残り半分で選ばれた候補の相対順位を調べます。

本記事では、大きい値ほど良い指標を使います。検証側の順位rは最悪を1、最良をMとする昇順です。候補数Mに対してω=r/(M+1)、λ=log[ω/(1−ω)]とします。λが負なら検証側の順位中央値より下です。順位1を最良とするライブラリの初期設定をそのまま使うと、よい候補を過剰適合として数える逆転が起こります。

分母をMではなくM+1にすることで、ωは0と1の間に入り、最良順位のlogitが無限大になるのを避けられます。平均順位を使うときもこの正規化を維持します。候補数を分割ごとに変える実装は順位の母集団まで変わるので、欠損候補の扱いを先に決める必要があります。

四候補の一分割を、手計算と一致させる

図1の学習側指標はA=1.4、B=1.1、C=0.8、D=0.5です。選ばれるのはAです。一方、検証側はA=0.2、B=0.7、C=0.4、D=−0.1。昇順順位はDが1、Aが2、Cが3、Bが4なので、選ばれたAのωは2/5=0.4、λはlog(2/3)=約−0.405になります。

この一分割は負のλへ該当しますが、この結果だけをPBOと呼びません。たとえば8ブロックを半分ずつへ分けるなら、学習側の選び方は70通りです。学習と検証を反転した組も評価し、そのたびに学習側で勝者を選び直します。一度決めたAを全分割で評価するだけでは、候補選択手順のCSCVになりません。

学習指標1.4で選ばれたAが検証側0.2で昇順2位となり、4候補の相対順位0.4とlogitマイナス0.405を得る計算表
IS勝者の選択とOOS順位の評価を分離。検証結果を見て勝者を差し替えない。

順位計算へ入れるSharpeは、表示用に小数一桁へ丸めた値ではなく計算精度を保った値を使います。画面上で両方0.2でも内部値が0.196と0.204なら、計算上は同順位ではありません。丸めた表と実際の順位が違う場合は、詳細欄へ十分な桁数を出して再現できるようにします。

OOSの同順位にはmidrankを使い、境界を独立に数える

図2では検証側A=0.20、B=0.20、C=0.40、D=0.60です。AとBは最悪側の二つの順位を共有するため、平均順位midrankは(1+2)/2=1.5です。学習側の勝者がAならω=1.5/5=0.30、λ=約−0.847となります。Aを1位、Bを2位とID順に割り当てる方式とは異なります。

全候補が同じ値なら全員の平均順位は2.5となり、ωは0.5、λは0です。本稿では集計を厳密なλ<0とし、λ=0は負へ含めず、境界として別に報告します。原論文の累積分布表現や使用するソフトの規約を再現する場合は、0を含めるかを合わせてください。同値が多いと、λ≤0で数える実装と結果が大きく異なります。

OOSでAとBが0.20の同値となり平均順位1.5、相対順位0.30、logitマイナス0.847を得る例と、全候補同値ならlogitゼロになる境界例
同順位は平均順位、集計はλ<0を採用。λ=0の割合を別掲して同値への依存を見えるようにする。

説明用に70分割中、負が20、ゼロが30、正が20なら、厳密な負の割合は28.6%、ゼロを含む割合は71.4%です。どちらか好都合な数字だけを表示してはいけません。負・境界・正の三つの件数があれば、読者は規約差を理解できます。全候補同値で負の割合がゼロでも、選択に情報があることを示しません。

ISの同率首位は、OOSを開く前に処理する

学習側でAとBが同率首位だった場合、配列の最初の列を返すargmaxは暗黙の規則になります。列順の変更で勝者が変わり、検証成績も変わります。固定した永続IDの順で選ぶなら、その規則を明記し、入力列順を変えても同じIDが選ばれるようにします。検証側で成績がよかった方を選ぶのは明確な漏洩です。

別案として、同率首位のそれぞれのOOS順位を計算し、負へ入る比率をその分割の寄与にできます。二候補の一方が負、他方が正なら0.5を寄与させます。これは同率候補を等確率で選ぶ手順を評価する拡張で、固定ID選択とは別の推定対象です。どちらを採用しても、実際の戦略選択規則と一致させます。

候補リターンを平均して一つのポートフォリオを作ることと、同率候補の順位寄与を平均することは違います。前者は損益分布が変わる新しい戦略であり、そのポートフォリオを選択ルールとして事前に定義する必要があります。同率が出た分割だけ都合よく平均化する処理は、単なる順位計算の修正とはいえません。

負のSharpeを絶対値へ変換しない

検証SharpeがA=−0.2、B=−0.5、C=−0.8、D=−1.1なら、最もよいのはAです。Aは昇順4位、ω=0.8、λ=約1.386になります。ここで絶対値を最大化すると、最も悪いDを選んでしまいます。損失という符号を消して順位を作らないことが大切です。

Aがどの分割でも相対的に最良ならPBOは低くなり得ますが、Aが正の利益を持つとは限りません。PBOは候補集合内の選択の壊れやすさであり、現金や指数に勝つ確率ではありません。検証側の純平均リターン、損失分割の割合、候補全体の分布を横へ置き、順位がよいだけの赤字戦略を区別します。

学習Sharpe−0.1から検証−0.3へ悪化したケースで、単純な比率1−OOS/ISを計算すると−200%となり、改善したかのような誤解を招きます。ゼロ付近や符号をまたぐ成績では劣化率の比率表示を避け、OOS−ISという差と二つの元値を表示します。順位指標と劣化表示の定義は別々に点検します。

ゼロ分散と欠損を、最下位へ勝手に落とさない

全日ゼロ収益の候補は標準偏差がゼロなので、Sharpeは0/0で未定義です。平均ゼロだからSharpeもゼロ、と暗黙に置き換えると、負のSharpeを持つ売買候補より上位になります。現金を候補へ含めたいなら、Sharpe以外の共通指標を選ぶか、未定義への明示的な規約が必要です。

候補がある分割だけ無取引になる場合も同様です。その分割だけ候補を外すとMが変わり、他の候補の順位比率まで変わります。本例では指標を計算できない分割が生じたら未定義として報告し、黙って分母から取り除きません。候補生成段階の実行可能性条件や評価指標を見直す場合は、元の未定義件数も残します。

日付欠損と無取引を区別するため、損益行列とは別にデータ状態のマスクを保存します。口座が現金だった日は観測済みですが、約定データが届かなかった日は不明です。後者をゼロに埋めて同期行列を作ると、不安定な候補の分散を過小評価します。上場前や取引不能期間を含む候補は、対象期間の設計から整合させます。

Sharpeをブロック別に平均すると、別の順位になる

CSCVで選ばれた複数ブロックのSharpeは、各ブロックのSharpeを平均するのではなく、対象行のリターンを集めて平均と標準偏差から再計算します。高ボラの期間と低ボラの期間をまとめたとき、平均Sharpeは結合系列のSharpeに一致しません。ブロック別指標だけ保存している場合、元系列へ戻らなければ正しい比較を再現できません。

非連続の期間を連結する場合、行の元の日付は保持します。最大ドローダウンのように並び順と資産推移へ依存する指標では、離れた期間を継ぎ合わせた結果の解釈がさらに難しくなります。Sharpeで順位を作る評価と、運用停止や資金管理の時系列評価を一つにまとめないようにします。

モデルを全期間で学習した損益列を後から二分しても、モデル学習の先読みは消えません。CSCVのISは候補を選ぶ期間であり、候補モデルそのものを推定した期間とは区別されます。学習が必要な候補の損益を作るなら、まず予測時点で利用可能な情報だけで推定した系列を用意します。PBOは壊れたバックテストの修復装置ではありません。

候補集合と同順位頻度を一緒に報告する

同じ戦略の複製列を加えると、平均順位の位置と候補中央値が動きます。極端に弱い候補を大量に足して選択戦略を相対的によく見せることもできます。候補集合の内容はPBOの定義の一部です。総候補数だけでなく、ファミリー別件数、重複列数、IS同率首位の分割数、OOS同値群の大きさを残します。

技術的な重複排除を行う場合は、基準と対象IDを事前に固定し、元集合の結果も監査用に保存します。研究中に不採用だった候補を消すことと、同じ出力を二重保存したバグを除くことは区別します。PBOが最小になる候補集合を探す行為は、新しい探索問題を作っているだけです。

「ほぼ同じ」を同順位にするなら、数値規約を追加する

浮動小数点の計算では、同じ損益でも集計順の差で最終桁が変わることがあります。完全一致だけを同順位とするか、事前に定めた精度へ量子化して順位を付けるかを決めます。許容差を置く場合は指標の単位と関係付け、成績を見て閾値を広げません。小数二桁の表示精度を、そのまま統計上の同順位規則にしてよいとは限りません。

単純に隣接値の差が許容差以下なら同じ群へ入れる方法にも注意が必要です。値が0.200、0.206、0.212、許容差が0.007なら、隣同士は近くても両端は許容差を超えます。連鎖して全員を同じ群へ入れるか、固定刻みへ丸めるかで順位が変わります。同値の定義には推移性を持つ規則を選び、境界へ近い候補の件数を併記します。

さらに、指標を増加関数で変換しても順位が変わらないことを確かめます。Sharpeへ一律に1を足した場合、IS勝者とOOS順位は同じになるはずです。一方、絶対値や二乗は負の領域で順序を保たないため、このテストの対象にはできません。順位という情報だけで動く工程へ、値の符号を消す前処理が混入していないかを点検できます。

集計にも小さな検算用データを置きます。λが−0.8、−0.2、0、0.4の四分割なら、厳密な負の割合は50%、境界は25%、正は25%です。同率首位を等確率で扱う拡張では分割寄与が小数になるため、単なる負の件数と区別して記録します。未定義分割を含むときは、全分割数と計算済み分割数の両方を表示し、評価不能が少ないかのように見せないようにします。

四つのテストで計算器の合格を決める

第一に、図1の一分割がλ=約−0.405を返すこと。第二に、図2の同順位が平均順位1.5になること。第三に、全候補同値でλ=0となり境界件数へ入ること。第四に、候補IDを維持して列順を変えても全分割の選択IDと結果が不変なことを確認します。負のSharpeのみの例も追加し、絶対値への誤変換を検知します。

報告書には有効分割数、未定義分割数、負・ゼロ・正のλ件数、IS同率率、OOS絶対成績をまとめます。70組合せは独立な70回の実験ではないので、通常の独立ベルヌーイ試行として狭い信頼区間を付けないようにします。順位規約を固定し、境界を隠さず、利益の有無を別途評価して初めて、PBOは研究手順を点検する道具として使えます。

p-nuts

お金稼ぎの現場で役立つ「投資の地図」を描くブログを運営しているサラリーマン兼業個人投資家の”p-nuts”と申します。株式・FX・暗号資産からデリバティブやオルタナティブ投資まで、複雑な理論をわかりやすく噛み砕き、再現性のある戦略と“なぜそうなるか”を丁寧に解説します。読んだらすぐ実践できること、そして迷った投資家が次の一歩を踏み出せることを大切にしています。

p-nutsをフォローする
クオンツ投資
スポンサーリンク
【DMM FX】入金
シェアする
p-nutsをフォローする

コメント

タイトルとURLをコピーしました