BitflyerFXの自動売買BOTにトレイリングストップを実装してみよう!ブレイクアウト戦略では、通常、勝率の悪さをカバーするために出来るだけ大きな利益を狙うため、利益目標(利確ライン)を設定しません。その代わりに利益を取り逃がさないようにトレイリングストップを設定することがあります。1.トレイリングストップとはトレイリングストップとは、エントリー後の含み益を逃がさないように、利益が乗るにつれて、最初に設定した損切ラインを少しずつエントリーした方向に動かしていくテクニックのことをいいます。上値ブレイクアウトで買いエントリーし、当初はエントリー価格の2レンジ(ATR)幅下に損切りを設定していたとします。この場合、ブレイクアウトに成功して1レンジ上に値が動くたびに、ストップ位置も1レンジずつ上にずらしていきます。トレイリング(trailing)は英語で「引きずる」という意味です。価格に引きずられるようにストップ位置が動いていくため、トレイリングストップといいます。今回は以下のようなルールを定義します。1)損切りラインはエントリーと同じ方向にのみ動かせる2)価格(終値)がエントリー方向に1レンジ進むごとに、損切りラインをmレンジ動かす(0≦m≦1)3)どこまで価格を追いかけるかを選択できるようにする一般論としてトレイリングストップには、トレンドによる含み益を逃がさない効果があります。あまりにストップの位置を価格に近づけすぎると、一時的な押し目で退出させられてしまい、本来の売買ロジックが持つパフォーマンスを発揮できなくなります。売買ロジックの期待値を最大限に活かすためには、できるだけ余計な条件を足さない方が得策です。そのため、価格と損切ラインを同じだけ動かすのではなく、価格が1レンジ動くたびに損切ラインは1/4~1/2レンジだけ動かすなど、より緩いトレイリングの設定ができるようにしておきます(この設定値が上記の2です)。どこまでも価格を追従するのではなく、最初のエントリー価格の位置(損益が±0になるライン)までだけストップを動かし、それ以降は追従しないような設定もできるようにしておきましょう。3.トレイリング・ストップのPythonコードでは実際にpythonコードを作りましょう。flag新しいローソク足(終値)を取得するたびに、上記の関数でトレイリングストップの値幅を計算します。トレイリングストップの値幅は、以下の式で計算します。トレイリング率)1)トレイリング率トレイリング率(trail_ratio)とは、さきほどの定義ルールのところで説明したm値のことです。「1」に設定すると、動いた価格と同じ値幅分だけストップ位置を動かします。「0.5」を設定すると、動いた価格の半分だけストップ位置を動かします。1以上を設定すると価格をストップ位置が追い越してしまうので、1以上を設定することはありえません。そのため、メイン処理に以下のようなコードを書いておきましょう。上記の計算式でトレイリングストップの値幅を計算すると、買いエントリーでトレイリングストップの位置がエントリー価格より上になった場合(または売りエントリーでトレイリングストップの位置がエントリー価格より下になった場合)に、ストップ幅がマイナスの値になります。そのため、損益ゼロのラインまでしかトレイリングしたくない場合には、ストップ幅が0未満かどうかを判定して、0未満であれば0を代入します。0これを応用すると、含み益の最大値の50%を守る位置にトレイリングストップを置くこともできます。この方法は後述します。3)ストップ位置をエントリー方向にのみ動かす一般論として、トレイリングストップには片方向(エントリーと同じ方向)にしか動かしてはいけないというルールがあります。逆向きに動かしていいのであれば、いつまでたっても損切りラインにかからず、損切ラインを動かす意味がないからです。そのため、最初に前回のストップ幅を記録しておき、新しく計算したストップ幅と比較します。ストップ幅はどんどん小さくならないといけないので、前回の数値よりも大きければ、前回のストップ幅をそのまま採用します。last_stop損切りの関数トレイリングストップの関数が完成したら、あとは以前の記事で作成した「損切りの関数」の先頭で、このトレイリングストップの関数を呼ぶだけです。)これで基本となるコードは完成です!4.実行結果これを実行してみると、以下のようにストップ位置が移動しているのがわかります。含み益の50%を守るトレイリングストップ上記のコードをカスタマイズすると、常に含み益の50%を守る位置にトレイリングストップを置くこともできます。0.5)をトレイリングストップ幅に代入します。以下略エントリー価格を超えた位置にストップを置く場合は、ストップ幅がマイナスの値になりますので、-1を掛けるのを忘れないようにしましょう。これを実行すると、買いエントリーの場合は高値を更新するたびに、売りエントリーの場合は安値を更新するたびに、トレイリングストップをピーク時の含み益の50%の位置に置くことができます。5.検証してみよう!ではトレイリングストップを採用した場合に、運用成績がどうなるか検証してみましょう。検証には前回の記事と同じ条件を使います。平均ボラティリティ(ATR)を基準に、価格がエントリー方向に1レンジ動くたびにストップ位置も同じだけ動かし、損切りにかかるかドテンするまでトレイリングし続けた場合の成績です。損益ゼロのラインに達するまでは、価格が1レンジ動くごとにストップを1レンジ動かし、損益ゼロラインに達した後は、ピーク時の含み益の半分を保護する位置に常にトレイリングストップを置いた場合の成績です。価格が1レンジ動くたびに、ストップ位置は1/2ずつだけ同じ方向に動かした場合の成績です。価格が1レンジ動くたびにストップ位置は1/2ずつだけ同じ方向に動かし、損切りラインがエントリー価格と同じライン(損益分岐点)に達したラインでトレイリングを辞めた場合の成績です。結果が良かった順に並べると以下のようになりました。損益±0ラインまで動かした場合4)価格と同じ比率で損切りラインを動かした場合5)含み益の50%を保護するよう損切りラインを動かした場合トレイリングの条件を厳しくしすぎると、パフォーマンスは悪化する結果となりました。損切りのラインを厳しくすることで、本来の売買ロジックが持つ期待値や優位性(エッジ)が失われてしまうのかもしれません。トレイリング比率によっては、「何もしなかった場合」を上回る成績を残したパターンもありました。今回の記事では、価格の動きに従って一定の比率で損切りラインを動かすトレイリングストップの作り方を勉強しました。この方法は実際のところあまり実践的ではありません。トレイリングの比率を上げすぎると序盤で損切りにかかってしまい、退出させられてしまう可能性が高くなりますし、比率を下げ過ぎると、今度は価格と損切りラインがどんどん乖離してしまい、「トレンドの含み益を逃がさない」という本来の役割を果たせなくなってしまうからです。そこで以下の記事では、より実践的なアイデアとして、「長くポジションを保有すればするほど、どんどんトレイリング比率が加速していく」ようなトレイリングストップを紹介します。定義を読んで自分でも実装してみてください。stop_price:flag["records"]["log"].append("{0}円の損切ラインに引っかかりました。stop_price:flag["records"]["log"].append("{0}円の損切ラインに引っかかりました。コメントをキャンセルメールアドレスが公開されることはありません。