アセットマネージャーのためのファイナンス機械学習:テストデータのオーバーフィッティング 多重テスト下の再現率

最良戦略の対立仮説$${H_1:SR>0}$$が真で、$${SR=SR^\ast}$$であると仮定する。ファミリーワイズエラー率が$${\alpha_K}$$が与えられている検定の再現率(recall)は、
$${P[\max_k\{\hat{z}[0]_k\}k=1,\dots,K > z_\alpha | SR=SR^\ast] }$$
$${\displaystyle{=P\left[\frac{(\widehat{SR}+SR^\ast-SR^\ast)\sqrt{T-1}}{\sqrt{1-\hat{\gamma}_3 \widehat{SR} + \frac{\hat{\gamma}_4-1}{4}\widehat{SR}^2}} > z_\alpha | SR=SR^\ast\right]}}$$
$${\displaystyle{=P\left[\hat{z}[SR^\ast]>z_\alpha-\frac{SR^\ast \sqrt{T-1}}{\sqrt{1-\hat{\gamma}_3 \widehat{SR} + \frac{\hat{\gamma}_4-1}{4}\widehat{SR}^2}} | SR=SR^\ast\right]}}$$
$${\displaystyle{=1-P\left[\hat{z}[SR^\ast] < z_\alpha-\frac{SR^\ast \sqrt{T-1}}{\sqrt{1-\hat{\gamma}_3 \widehat{SR} + \frac{\hat{\gamma}_4-1}{4}\widehat{SR}^2}} | SR=SR^\ast\right]}}$$
$${\displaystyle{=1-Z\left[z_\alpha-\frac{SR^\ast \sqrt{T-1}}{\sqrt{1-\hat{\gamma}_3 \widehat{SR} + \frac{\hat{\gamma}_4-1}{4}\widehat{SR}}} \right] = 1-\beta}}$$
ここで、$${z_\alpha=Z^{-1}[(1-\alpha_K)^{1/K}]}$$である。

上記の記事で、ファミリーワイズの偽陰性率を、全ての試行での陽性を陰性と判断する確率として、$${\beta_K=\beta^K}$$としている。
上の式から、$${(\alpha_K)}$$と$${\beta}$$を与えたら、
$${P[\max_k\{\hat{z}[0]_k\}k=1,\dots,K > z_\alpha | SR=SR^\ast] =1-\beta}$$が成り立つ$${SR^\ast}$$が求められる。
つまり、ファミリーワイズエラー率$${\alpha_K}$$において、$${(1-\beta)}$$以上のファミリーワイズ件出力を達成するには、真のシャープレシオは、$${SR^\ast}$$よりも大きくなければならない。これは、$${SR^\ast}$$以下のシャープレシオの真の戦略を検出するには、この検定は不十分であるという意味になる。
 多重テスト下のタイプ$${{\rm II}}$$エラー$${\beta_K}$$は、以下の手順で$${\alpha_K}$$から求められる。
 $${\alpha_K}$$より、$${z_\alpha=Z^{-1}[(1-\alpha_K)^{1/K}]}$$を計算する。シャープレシオ$${SR^\ast}$$を持つ戦略を偽とする確率は、$${\beta=\displaystyle{Z\left[z_\alpha-\frac{SR^\ast \sqrt{T-1}}{\sqrt{1-\hat{\gamma}_3 \widehat{SR} + \frac{\hat{\gamma}_4-1}{4}\widehat{SR}}} \right] }}$$であるから、$${\beta_K=\beta^K}$$となる。
 この数値例のpythonコードはスニペット8.4で与えられている。

def getTheta(sr, t, sr_=0., skew=0., kurt=3):
    theta = sr_*(t-1)**.5
    theta /= (1-skew*sr+(kurt-1)/.4*sr**2)**.5
    return theta
    
def type2Err(alpha_k, k, theta):
    #false negative rate
    z = ss.norm.ppf((1-alpha_k)**(1./k)) #Sidak's correction
    beta = ss.norm.cdf(z-theta)
    return beta

t, skew, kurt, k, freq = 1250, -3, 10, 10, 250
sr = 1.25/freq**.5
sr_ = 1./freq**.5
z = getZStat(sr, t, 0, skew, kurt)
alpha_k = type1Err(z, k=k)
theta = getTheta(sr, t, sr_, skew, kurt)
beta = type2Err(alpha_k, k, theta)
beta_k = beta**k
print(beta_k)

この数値例では、$${SR>0.080}$$の戦略に関して、$${\beta_K=0.039}$$であり、96%以上の検出力があると言える。

この記事が気に入ったらサポートをしてみませんか?