トリプルバリア法

今回の紹介する戦略はトリプルバリア法というものである。これを紹介する理由としては、今後ある投資戦略を考えたときに、データセットにラベリングしないといけないからである。つまり、価格以外に、どの価格で買って、どの価格で売ったのか等の情報を導入する必要がある。これは一例である。

トリプルバリア法では、例えば、デイトレにおいて、ボラティリティが推定されたら、どこで利食い(take profit)して、どこで損切りするか(stop loss)を決定して投資戦略を構築する。例えば、取引期間を1日にして、過去の株価の動きから1日で大体5%株価が動くとしたら、どこで取引すれば良いのだろうか?

考えられる戦略としては、とりあえず買って、利食いと損切りの価格をそれぞれ決定することである。

それではトリプルバリア法について説明したいと思う。

まず、2つの平行線がある。一つ目の平行線は利食い価格、二つ目の平行線は損切り価格である。そして、一つの垂直線がある。これは、エントリーしたポイントからの経過線で例えば1分足で取引しているのであればエントリーしてから線が1分ごとに右にずれていく。垂直線に関しては、最大値を設定(例えば1日)にしたら、利食いも損切りもしなかった場合、その時点に到達したらポジションを閉じることにする。

この3つの線+垂直線の有効期限を結ぶと長方形が出来る。この長方形のそれぞれの辺をバリアと呼ぶ。

変数の説明とトリプルバリア法の実装に進もう。

#close : 価格のpandas Series(参照価格)
#events : 次の列を含むpandas Series(シグナルが出ている時刻の列、前章で説明した。)
#t1 : 垂直バリアのタイムスタンプ。値がnp.nanの場合、垂直バリアはない。(ポジションの保有期間)
#trgt : 水平バリアの幅の単位(小さくすると計算量が多くなる。)
#ptSl : 2つの非負float値 [上のバリアの乗数(ex. 1%),下のバリアの乗数(ex. 1%)]
#molecule : シングルスレッドによって処理されるイベントインデックスのサブセットを含むリスト。(今後説明予定)
def applyPtSlOnT1(close, events, ptSl, molecule):
    # t1前に行われた場合は、ストップロス/利食いを実施。
    events_ = events.loc[molecule]
    out = events_[['t1']].copy(deep=True)
    if ptSl[0] > 0:pt=ptSl[0]*events_['trgt']
    else:pt=pd.Series(index=events.index)
    if ptSl[0] > 0:sl=-ptSl[1]*events_['trgt']
    else:sl=pd.Series(index=events.index)
    for loc, t1 in events_['t1'].fillna(close.index[-1]).iteritems():
        df0 = close[loc:t1] #価格経路    
        df0 = (df0/close[loc]-1)*events_.at[loc, 'side'] #リターン
        out.loc[loc, 'sl'] = df0[df0 < sl[loc]].index.min()
        out.loc[loc, 'pt'] = df0[df0 > pt[loc]].index.min()
    return out

次にこの戦略の最適化を行いたいと思う。投資戦略の最適化は、まず一つ投資戦略を決定し、利益が最大化するようにパラメーターを調整することである。投資戦略における主なパラメーターは、買う価格とその数量、売る価格とその数量である。上のトリプルバリア法であれば、ptSlを最適化することによって、戦略の利食いと損切りを上手にできるようになる。実装上の注意点であるが、理想は、取引手数料なしで動的に資産の最適な状態にすることである。しかし、現実はスプレッドや板の注文量の限界などもあり、資産が少額であればあるほど、理想的な取引の実現が可能になる。なので、こういったアルゴリズム取引では基本的に資産が増えるほど、資産を増やすのが難しくなるのである。

次の記事で、トリプルバリア法の投資戦略に最適化を行いたいと思う。

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