ファイナンス機械学習:バックテストの統計学 パフォーマンス統計 HHI
パフォーマンス測定指標としては以下のものがある。
PnL 最終ポジションからの精算費用を含むバックテスト全体の時価評価損益
ロングポジションからのPnL
年率換算収益率 配当、クーポン、コストを含む時間加重平均の年間総収益率
ヒット率 ポジティブなPnLをもたらしたベットの割合
利益の平均リターン 利益をもたらしたベットの平均リターン
損失の平均リターン 損失をもたらしたベットの平均リターン
時間荷重収益率
経過利息、支払い済みクーポン、および測定期間内の配当金を含む、実現、未実現全ての損益からの収益率を総収益率と言い、そのうち、外部キャッシュフローを調整したものを時間荷重収益率(TWRR)と呼ぶ。GIPS規制によって、外部キャッシュフロー調整後のポートフォリオリターンの計算が義務付けられている。
TWRRは、各外部キャッシュフローが発生した時に、ポートフォリオの価値を決定して得られる。
キャッシュインが1日の始まりに発生し、アウトが1日の終わりに発生すると仮定すると、部分期間のリターンを通じて、1ドルをポートフォリオ$${i}$$に投資した場合の全期間$${T}$$のパフォーマンス$${\varphi_{i,T}}$$が得られる。
部分期間$${[t-1,t]}$$間のポートフォリオのTWRR$${r_{i,t}}$$は、時刻$${t}$$でのポートフォリオ$${i}$$の時価評価損益$${\pi_{i,t}}$$を、同期間の運用資産の市場価値$${K_{i,t}}$$で割ったもので得られる。
$${r_{i,t}=\displaystyle{\frac{\pi_{i,t}}{K_{i,t}}}}$$
$${\pi_{i,t}=\displaystyle{\sum^{J}_{j=1}\left[ (\Delta P_{j,t} + A_{j,t})\theta_{i,j,t-1} + \Delta \theta_{i,j,t-1}(P_{j,t}-\bar{P}_{j,t-1}) \right]}}$$
$${K_{i,t}=\displaystyle{\sum^{J}_{j=1}\tilde{P}_{j,t-1}\theta_{i,j,t-1} + \max\{ 0, \sum^{J}_{j=1}\bar{P}_{j,t-1}\Delta\theta_{i,j,t}\} }}$$
ここで、$${\theta_{i,j,t}}$$は、ポートフォリオ$${i}$$の時刻$${t}$$での証券$${j}$$の保有単位、$${P_{j,t}}$$は証券$${j}$$の時刻$${t}$$での経過利息を含まない価格、$${\tilde{P}_{j,t}}$$は証券$${j}$$の時刻$${t}$$での経過利息を含む価格、$${\bar{P}_{j,t}}$$は証券$${j}$$の時刻$${t}$$での経過利息を含まない価格での平均取引価格、$${A_{j,t}}$$は証券$${j}$$の単位あたりの経過利息と配当金、$${\theta_{i,j,t}}$$はポートフォリオ$${i}$$が持つ証券$${j}$$の保有単位である。
これを用いて、
$${\varphi_{i,T}=\Pi^{T}_{t=1}(1+r_{i,t})}$$
と得られ、このポートフォリオの年率換算収益率は、経過年数を$${y_i}$$として、
$${R_i=(\varphi_{i,T})^{-y_i}-1}$$
となる。
同じ符号のリターンが継続した系列をランと呼び、このランが長いと、市場が反発する可能性があり、突然の変動が発生しやすくなる。よって、ランが長くなった時には、損失を予測する必要ある。
リターンの集中度は、以下の様に得られる。
ベットからのリターンの時系列を$${\{r_t\},t=1,\dots, T}$$とすると、$${r_t \ge 0}$$の$${r_t}$$を$${r^{+}_t}$$、$${r_t < 0}$$の$${r_t}$$を$${r^{-}_t}$$とわけ、其々のウェイト系列$${\bf{\omega}^{\pm}}$$を
$${\bf{\omega}^{+}=\displaystyle{\left\{\frac{r_t^+}{\sum_i r_t^+}\right\}_{t=1,\dots,T}}}$$
$${\bf{\omega}^{-}=\displaystyle{\left\{\frac{r_t^-}{\sum_i r_t^-}\right\}_{t=1,\dots,T}}}$$
とする。
これを使い、リターン集中度(HHI)は、$${|\bf{\omega}^{\pm}|>1}$$の時、
$${h^{+}=\displaystyle{\frac{\sum_t (w_t^+)^2 - |w_t^+|^{-1}}{1-|w_t^+|^{-1}} = \left(\frac{E[(r^+_t)^2]}{E[r^+_t]^2}-1)\right)(|r_t^+|^{-1}-1)}}$$
$${h^{-}=\displaystyle{\frac{\sum_t (w_t^-)^2 - |w_t^-|^{-1}}{1-|w_t^-|^{-1}} = \left(\frac{E[(r^-_t)^2]}{E[r^-_t]^2}-1)\right)(|r_t^-|^{-1}-1)}}$$
と定義される。
このHHI集中度を求めるコードはスニペット14.3で実装されている。
def getHHI(betRet):
if betRet.shape[0] <= 2:
return np.nan
wght = betRet / betRet.sum()
hhi = (wght ** 2).sum()
hhi = (hhi - betRet.shape[0] ** (-1)) / (1.0 - betRet.shape[0] ** (-1))
return hhi
これを用いて、$${h^+,h^-}$$、および、1ヶ月あたりのベットの集中度は、リターン行列$${r_t}$$を引数として、
rHHIPos=getHHI(ret[ret>=0])
rHHINeg=getHHI(ret[ret<0])
tHHI=getHHI(ret.groupby(pd.TimeGrouper(freq='M')).count())
で得られる。