自分で作るレジーム検出器
このキャップストーンでは、NumPyだけで隠れマルコフモデルを作り、20年分のSPYで動かします。モデルは、市場が毎日、穏やか・普通・荒れという3つの隠れたレジームのどれかにあり、それは見えないと考えます。各レジームには典型的なリターンとボラティリティがあり、明日のレジームは遷移行列 A を通じて今日のレジームだけに依存します。前向き計算はリターンを毎日の各レジームの確率に変えます。後ろ向き計算は後の日が語ることを加えます。ビタビは最も可能性の高い経路を1本見つけます。バウム・ウェルチはこれらの手順を繰り返して、データからレジームの数値を学びます。
αₜ=((αₜ₋₁A)·Bₜ)/cₜ, βₜ=(A (Bₜ₊₁·βₜ₊₁))/(cₜ₊₁), γₜ=(αₜ·βₜ)/(Σ(αₜ·βₜ)), log L=Σₜlog cₜ
すべてスケーリングされています。各日の前向きの数をその和 cₜ で割ると、何千日にわたって0に縮んでしまうことがなく、log cₜ の和がそのまま対数尤度になります。ビタビも同じ理由で対数で計算します。バウム・ウェルチの段階では、平滑化確率 γ が重みとして働きます。各レジームの平均とボラティリティはリターンの加重平均と加重ばらつきで、遷移の回数は毎日 i から j へ移る確率から得られます。各ラウンドは対数尤度を上げることしかできないので、これはコードのよいテストになります。最後の関数では、当てはめたレジームで売買します。1つは前日から危機の確率を予測するシグナル(誠実)、もう1つは平滑化確率から読むシグナル(先読み)です。
実データが語ること2005年以降のSPYの 5 404 個のリターンに対し、粗い初期値から40ラウンド回すと、年率ボラティリティが約 8%、19%、51% の3つのレジームが見つかります。年率の平均は約 +30%、-1%、-73% で、各レジームは非常に粘り強く、約 96% から 97% の日にとどまります。対数尤度は約 17 544 から 17 803 に上がります。ビタビ経路では、市場は約 52% の日を穏やかなレジーム、41% を普通、6% を危機のレジームで過ごします。危機の確率が2分の1未満の間だけ投資すると、年率シャープレシオはバイ・アンド・ホールドで 0.52、誠実なフィルタのシグナルで 0.66、平滑化のシグナルで 1.12 です。この最後の差が先読みの罠の実例です。
- 各ステップをスケーリング:その日の和で割って対数を足す。しないと数千日で0に潰れる。
- 総当たりで確認:数日なら全状態経路を列挙して比べられる。対数尤度はラウンドごとに下がってはいけない。
- 誠実なシグナルだけ:今日のフィルタ確率から明日を予測する。平滑化確率はバックテストを良く見せてしまう。
覚えておく単純化レジーム内のリターンは正規分布で独立だと扱っており、厚い裾は無視しています。レジームの数は3つに固定です。モデルは標本全体で1回だけ当てはめるので、誠実なフィルタのシグナルでさえ未来から学んだ数を使っています。厳密な検証では過去のデータだけで再推定し、取引コストを加えます。2分の1という閾値も最適化していません。
ラボ:採点される内容
- 出力確率10点
- 前向きアルゴリズム20点
- 後ろ向きアルゴリズム10点
- 平滑化5点
- ビタビ復号15点
- バウム・ウェルチの当てはめ25点
- レジーム研究15点