ファイナンス機械学習:ラベリング 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


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