ファイナンス機械学習:ラベリング 動的閾値とトリプルバリア法
動的閾値 日次ボラティリティ推定
投資戦略に必須なリスク関数の利益確定と損切り制限を設定するために、日中の推定ポイントで日次ボラティリティを、EWMの標準偏差を用いて計算し、これを可変の閾値$${\sigma_{t_{i,0}}}$$とし、ラベリングする。
日次ボラティリティの計算は、スニペット3.1で与えられている。
def getDailyVol(close, span0):
df0 = close.index.searchsorted(close.index - pd.Timedelta(days=1))
df0 = df0[df0 > 0]
df0 = pd.Series(close.index[df0 - 1], index=close.index[close.shape[0] - df0.shape[0]:])
v=[]
for i in range(len(df0)):
v.append(close.loc[df0.index[i]] / close.loc[df0[i]] - 1)
#df0= close.loc[df0.index] / close.loc[df0.values] - 1 # daily returns
rtn=pd.Series(v,index=df0.index)
df0_vol = rtn.ewm(span=span0).std()
return df0_vol.dropna()
トリプルバリア法
利食いと損切りの限度額で決められる2つの水平バリアと、ポジションを取ってからの有効期限である経過バー数の垂直バリアの三つのバリアを決め、このうち最初に触れたバリアに従って観測値をラベリングする。
上バリアに最初に触れた場合に観測値を1、下バリアに最初に触れた場合に観測値を−1、垂直バリアに最初に触れた場合は観測値をゼロ、またリターン符号とラベリングする。
このラベリングは、経路の全域$${[t_{i,0},t_{i,0}+h]}$$($${h}$$:垂直バリア)を見ている。
最初のバリア接触時間を$${t_{i,1}}$$とし、ここでの特徴量に対するリターンを$${r_{t_{i,0},t_{i,1}}}$$で表す。水平バリアは対称である必要はない。
スニペット3.2で、このトリプルバリア方式を実装している。
def applyTPBarrier(close,events,ptSl):
events_=events
out=events_[['t1']].copy(deep=True)
if ptSl[0]>0:
pt=ptSl[0]*events_['trgt']
else:
pt=pd.Series(index=events.index) # NaNs
if ptSl[1]>0:
sl=-ptSl[1]*events_['trgt']
else:
sl=pd.Series(index=events.index) # NaNs
for loc,t1 in events_['t1'].fillna(close.index[-1]).items():
df0=close[loc:t1] # path prices
df0=(df0/close[loc]-1)*events_.at[loc,'side'] # path returns
out.loc[loc,'sl']=df0[df0<sl[loc]].index.min() # earliest stop loss
out.loc[loc,'pt']=df0[df0>pt[loc]].index.min() # earliest profit taking
return out
ここで、closeは価格、eventsは、垂直バリアのタイムスタンプ(np.nanの場合は垂直バリアは無し)、水平バリアの幅のtrgtを持つDataFrame、ptSL(profit take and stop loss)は、trgtの値にかかる係数で上下バリアの幅を決める二つの非負の実数リストであり、ptSL[0]が上バリア、ptSL[1]が下バリアにかかる。
上バリア(利食い/ProfitTake:pt)、下バリア(損切り/StopLoss:sl)、垂直バリア(t1)の設定[pt,sl,t1]の考えられる8通りの解釈は以下の通り
[1,1,1] 三つのバリアの出口条件があり、利益実現と損切り限度、保有期間を設定している
[0,1,1] 損切りされない限り、保有期間で終了する
[1,1,0] 損切りされない限り、利食いを待ち続ける。損切りも利食いもない場合、保有し続けることとなり、やや非現実的である。
以下の三つは現実的でない
[0,0,1] 固定時間ホライズンと一緒であるが、出来高、ドルバー、情報ドリブンバーに適用するならば、有益でもある
[1,0,1] 損切りを考慮に入れていないので、利益実現か保有期間終了まで保持されていない。
[1,0,0] 利益が出るまで保持し続けるので、損失を出しつつ何年も維持する可能性がある。
非論理的な設定
[0,1,0] 損失を待ち続けている
[0,0,0] ラベル付けがされない