ファイナンス機械学習:戦略リスク 練習問題 混合ガウス分布

毎月ベットした2年間のリターンが二つのガウス分布からなる戦略を考える。
 平均は一つ目が-0.1、二つ目が0.06で、分散はそれぞれ0.06と0.03で、リターンが最初の分布から生じる確率は0.15とする。

この論文を用いて、$${m}$$個のガウシアン分布が重なっている時のモーメントを計算する。それぞれの分布からリターンが生じる可能性を$${p_j, j=1,\cdots, m}$$、それぞれの平均と分散を$${\mu_j, \sigma_j}$$とする。一次から5次のモーメントは以下で求められる。
$${E[r]=\sum^{m}_{j=1}p_j\mu_i}$$
$${E[r^2]=\sum^{m}_{j=1}p_j(\sigma_j^2+\mu_j^2)}$$
$${E[r^3]=\sum^{m}_{j=1}p_j(3\sigma_j^2\mu_j+\mu_j^3)}$$
$${E[r^4]=\sum^{m}_{j=1}p_j(3\sigma_j^4+6\sigma_j^2\mu_j^2+\mu_j^4)}$$
$${E[r^5]=\sum^{m}_{j=1}p_j(15\sigma_j^4\mu_j+10\sigma_j^2\mu_j^3+\mu_j^5)}$$
よって、この二つのガウス分布によって作られるリターン系列の平均$${\mu=E[r]}$$、分散は$${\sigma^2=E[r^2]-E^2[r]}$$、
歪度は$${\gamma_3=\displaystyle{\frac{E[r^3]-3E[r]\sigma^2 - E[r]^3}{\sigma^3}}}$$、
尖度$${\gamma_4=\displaystyle{\frac{E[r^4]}{E[r^2]}}}$$
と与えられる。
 このモーメントを使って、年率換算ポートフォリオと、確率的ポートフォリオを求めるコードは以下の通り。

import BackTestStats as BTS

mu1, mu2, sigma1, sigma2, prob1, nObs=-.1, 0.06, .12, .03, .15, 2*12
freq=12

m1=prob1*mu1+(1-prob1)*mu2
m2=prob1*(mu1*mu1+sigma1*sigma1)+(1-prob1)*(mu2*mu2+sigma2*sigma2)
m3= prob1*(mu1**3+3*sigma1*sigma1*mu1)+ \
(1-prob1)*(mu2**3+3*sigma2*sigma2*mu2)
m4= prob1*(mu1**4 + 3*sigma1**4 + 6.*(sigma1**2)*(mu1**2))+ \
(1-prob1)*(mu2**4 + 3*sigma2**4 + 6.*(sigma2**2)*(mu2**2))

print(f'Moment1:{np.round(m1,4)},Moment2:{np.round(m2,4)},\
Moment3:{np.round(m3,4)},Moment4:{np.round(m4,4)}')

sigma2=m2-m1**2
mSR = (12**.5 * m1) / sigma2**.5
print('Annualized Sharpe Ratio:', np.round(mSR,4))

skw=(m3-3*m1*sigma2-m1**3)/sigma2**1.5
kurt=m4/m2**2
print(f'skewness: {np.round(skw,4)}, kurtosis: {np.round(kurt,4)}')

PSR=BTS.getProbSR(mSR/12**.5, 1/12**.5, 2*12,skw, kurt)
print('PSR[1]',np.round(PSR,4))
モーメントからの年率換算SRとPSR

よって、このリターン系列から、毎月のベットで1以上のシャープレシオが得られる確率は0.72と言える。

このリターン系列に毎月のベットで、2年間投資した結果、シャープレシオ1を獲得する戦略のリスクは以下の様に計算される。

def probFailure(ret, freq, tSR):
    rPos, rNeg = ret[ret > 0].mean(), ret[ret <= 0].mean()
    p = ret[ret > 0].shape[0] / float(ret.shape[0])
    thresP = binHR([rNeg, rPos], freq, tSR)
    print(f'the required minimal precision: {np.round(thresP,3)}')
    risk = ss.norm.cdf(thresP, p, p * (1 - p))    # approximation to bootstrap
    return risk

mu1, mu2, sigma1, sigma2, prob1, nObs=-.1, 0.06, .12, .03, .15, 2*12
freq=12
ret=mixGaussians(mu1,mu2,sigma1,sigma2,prob1,nObs)
mean, std = np.mean(ret), np.std(ret)
skw, kurt = ss.skew(ret),ss.kurtosis(ret)
sr = mean/std
print(f'Mean:{np.round(mean,3)}, Std:{np.round(std,3)}')
print(f'Skew:{np.round(skw,3)}, Kurtosis:{np.round(kurt,3)}')
print(f'SR:{np.round(sr*np.sqrt(12),6)}')
probF=probFailure(ret,freq,tSR=1.)
print(f'Prob. of Failure {np.round(probF,4)}')
戦略リスク


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