ファイナンス機械学習:ラベリング SideとSize
機械学習アルゴリズムが、ベッドの際に、売りか買いのサイドと、そのサイズについて学習を行えるように、サンプルにラベリングする。
ポジションのサイドを設定できるような基礎情報がない場合、サイドの学習をしなければならない。ポジションサイドが明らかでない場合、利食いと損切りの区別はできず、サイド学習では水平バリアがないか、水平バリアは対称でなければならないことになる。
最初のバリアに触れる時間を見つけるgetEventsはスニペット3.3で実装されている。
def getEvents(close, tEvents, ptSL, trgt, minRet,
t1=False,side=None):
trgt = trgt.loc[tEvents]
trgt = trgt[trgt > minRet]
if t1 is False:
t1 = pd.Series(pd.NaT, index=tEvents)
side_=pd.Series(1.,index=trgt.index)
events=pd.concat({'t1': t1, 'trgt': trgt, 'side': side_},
axis=1).dropna(subset=['trgt'])
df0 = applyTPBarrier(close, events, ptSl=[ptSL,ptSL])
events['t1'] = df0.dropna(how='all').min(axis=1)
if side is None:
events = events.drop('side', axis=1)
return events
ここでは、マルチスレッドの並列処理はコードに入れていない。
このコードのままで、多変量を適用するのは計算機負荷から好ましくない。
コードの並列化は後ほど、ベクトル化とマルチスレッド化で行う。
この関数の引数の一つである$${t1}$$は、最初のバリアに触れた時のタイムスタンプで、これに垂直バリアに当てた時の時間を入れる実装はスニペット3.4にある。
def addVerticalBarrier(close, tEvents, numDays):
t1 = close.index.searchsorted(tEvents + pd.Timedelta(days=numDays))
t1 = t1[t1 < close.shape[0]]
t1 = pd.Series(close.index[t1], index=tEvents[:t1.shape[0]]) # adding NaNs to the end
return t1
次に以下で与えられるgetBinsで、観測値にラベルをつける。出力のretでは最初にバリアに接触した時に実現されるリターンで、binのラベル$${\{-1,0,1\}}$$はリターンの符号であり、$${-1}$$は売り、$${1}$$は買い解釈でき、また垂直バリアが最初に触れられた時には損益が出ないので0をラベリングするように拡張した。
def getBinsTU(events,close):
#1) prices aligned with events
events_=events.dropna(subset=['t1'])
px=events_.index.union(events_['t1'].values).drop_duplicates()
px=close.reindex(px,method='bfill')
#2) create out object
out=pd.DataFrame(index=events_.index)
out['ret']=px.loc[events_['t1'].values].values/px.loc[events_.index]-1
out['bin']=np.sign(out['ret'])
# where out index and t1 (vertical barrier) intersect label 0
try:
locs = out.query('index in @t1').index
out.loc[locs, 'bin'] = 0
except:
pass
return out
この記事が気に入ったらサポートをしてみませんか?