Home > Javaカブロボ | Javaカブロボ | サンプル | プログラミング > トレーリングストップのサンプルロボット

トレーリングストップのサンプルロボット

トレーリングストップとは | 簡単な設定例 | コード説明 | ソースコードダウンロード


トレーリングストップとは

トレーリングストップとは、利益になっているトレードにおいて、利益を確実に確定するという手法であり、利益から損失に変えない為のトレード手法です。逆指値の値段を株価に合わせて上げていくことで利益確定のラインを決定します。
設定できるのは以下の4項目です。
目標値(%)
ストップロス(%)
損切り(%)
最長ホールド日数(日)

目標値にはトレーリングストップが発動する条件を指定します。
5%と指定すると、高値が購入金額×1.05を超えるとトレーリングストップの注文を出します。

ストップロスには目標値を超えたときに、最高値を基準にストップロスの値段を設定します。
2%と指定すると、最高値×0.98の金額で逆指値注文を出します。

損切りには株価の安値を基準に反対売買注文を出します。
3%と指定すると、安値が購入金額×0.97を下回ったら、即時成行で反対売買注文を出します。

最長ホールド日数には保有する日数を設定します。
どのような場合でも、この期間が過ぎたら即時成行で反対注文を行います。

この説明は現物買いのときを前提にしていますが、信用売りを行っている場合もこの設定で大丈夫です。 つまり、信用売りの場合は安値が購入金額×0.95を下回ったら、トレーリングストップが発動し、最安値×1.05で逆指値の返済注文を出します。 最安値を更新すると逆指値の値段は下がっていきます。


簡単な設定例

カブロボSDKに付属するサンプルロボットに利益率が5%以上の銘柄に対してTrailing Stopの戦略を適応しました。
サンプルロボットでは保有銘柄の利益率が15%上がったら利益確定売りを行うのですが、Trailing Stopの戦略を行うことによって、 損益率がさらにあがっても利益確定売りライン(逆指値注文)を自動的に引き上げてくれるので、利益を確保しながら利益を伸ばすことができます。
また、損切りを購入株価の-6%の値段で逆指値注文を常に繰り返すことによって、サンプルロボットの損切りラインを過ぎてから成り行き売買で損切りを行うよりも、 リスクをコントロールすることができます。

1年でのトータル純損益 9.94%
平均利益 7.45%
平均損益 -4.79%

資産推移グラフ
サンプルロボット パフォーマンス

単純にバイアンドホールドでは生み出せない高い収益と安定性。

サンプルロボットのトレード毎実現損益率別件数ヒストグラム
サンプルロボット パフォーマンス

トレイリングストップ戦略実装サンプルロボットのトレード毎実現損益率別件数ヒストグラム
トレイリングストップ戦略実装サンプルロボット パフォーマンス

数10%以上値上がりする銘柄も、利益確定売りせずにホールドし続けます。
また逆指値注文による損切りを行うことで、設定した-6%前後で損切りできていることがわかります。


コード説明
行数
018 public class TrailingStopSampleRobot extends SampleRobot {
019
020   @Override
021   public void order(TradeAgent tradeAgent) {
022
023     // 保存してあるメモを取得します。
024     SampleObjectMemo memo = (SampleObjectMemo) tradeAgent.getMemoManager().getObjectMemo();
025     // メモが null の時のことを考えて null チェックをします。
026     if(memo == null) return;
027
028     // シグナルと反対のポジションを解消します。
029     orderReverseBySignal(memo);

SampleTrailingStopクラスはSampleRobotクラスを継承しています。
orderNewメソッドとorderReverseBySignalメソッドとscreeningメソッドはそのまま使用しますので、SampleTrailingStopクラスで記述する必要がありません。
orderメソッドは挙動が違うのでオーバーライドします。

行数
031     // ポートフォリオを参照します
032     ArrayList portfolioList = tradeAgent.getPortfolioManager().getPortfolio();
033     for (Portfolio portfolio : portfolioList) {
034
035     // トレーリングストップ注文を行います。
036       orderTrailingStop(portfolio, 5.0, 7.0, 6.0, 300);
037     }

自分のportfolioListを取得し、for文でポジションごとにトレーリングストップメソッドを呼び出します。
36行目の場合、
目標値(損益率)が5%を超えたらトレーリングストップを実行し
最高値より7%低いの金額で逆指値注文をします。
また目標値に届かなかった場合、買った値段より6%の金額で逆指値注文をして損切りします。
最後の300は保有日数が300日を超えたとき、どのような場合でも即時成行で反対注文を行います。

行数
085     // 保有銘柄の期間中の株価をリストとして取得します
086     ArrayList stockDataList = im.getStockSessionByInterval(
087        portfolio.getExecDate(), tm.getCurrentDate(), stock);
088
089     for (int i=0; i < stockDataList.size(); i ++)
090     {
091       StockData stockData = stockDataList.get(i);
092
093       if ( i == stockDataList.size()-1 )
094       {
095         // 新規売買を行ったセッションのみ終値で判断を行います。
096         // (高値・安値と約定価格の順序関係を認識できないため)
097
098         if (peakPrice < stockData.getClosingPrice())
099           peakPrice = stockData.getClosingPrice();
100
101         if (bottomPrice > stockData.getClosingPrice())
102           bottomPrice = stockData.getClosingPrice();
103       }
104       else
105       {
106         if (peakPrice < stockData.getHighPrice())
107           peakPrice = stockData.getHighPrice();
108
109         if (bottomPrice > stockData.getLowPrice())
110           bottomPrice = stockData.getLowPrice();
111       }
112     }

保有期間中の最高値と最安値を算出します。
stockDataListにstockで指定された銘柄の「portfolio.getExecDate」(購入日)から「tm.getCurrentDate」(今日)までの四本値を格納します。
for文で一日ごとを比較し最高値と最安値を算出します。
新規売買した日は高値・安値と約定価格の順序関係を認識できないため、終値のみを使います。

行数
118     if (portfolio.getExecQty() > 0)
119     {
120       // 現物買いトレードについての判断
121
122       // オーダータイミング2:ストップロスの逆指値注文を行います。
123
124       // 買付け後の最大利益率
125       double profitPeakRatio = ((double)peakPrice / execPrice - 1) * 100;
126
137
138       // 目標達成の判定
139       if ( profitPeakRatio > targetRate )
140       {
141         // 逆指値注文価格
142         int orderPrice = (int)(peakPrice * (1 - (stopLossRate / 100)));
143
144         orderReverseStopForPortfolio(
145           portfolio,
146           orderPrice,
147           "トレーリングストップによる売却 取得後の高値:" + peakPrice
148           );
149         return;
150       }

現物買いと信用売りで注文価格が異なるので場合わけします。
portfolio.getExecQtyが0より大きい場合現物買いなので、
現物買いに対応する注文値段を計算します。
その後、買付け後の最大利益率を計算し、
最大利益率が目標値を上回った場合にorderReverseStopForPortfolioメソッドを呼び出して逆指値注文を出します。

行数
152       // オーダータイミング3:損切りの対象です。
153
154       // 現物買いトレードの場合の損切り
155       int lossCutPrice = (int)(execPrice * (1 - (lossCutRate / 100)));
156       //損切りのための逆指値注文を行います。
157       orderReverseStopForPortfolio(
158         portfolio,
159         lossCutPrice,
160         "現物買いの損切り:"
161         );

最大利益率が目標値を上回っていなかった場合は損切りのための逆指値注文を行います。

行数
217   protected void orderReverseStopForPortfolio(Portfolio portfolio,int orderPrice, String reason){
218     // ポートフォリオから直接反対売買注文を行います。
219     boolean result = portfolio.orderReverseNowStopAll(orderPrice);

orderReverseStopForPortfolioメソッドで実際に逆指値注文を行います。
portfolio.orderReverseNowStopAll(orderPrice);で指定した値段で逆指値注文を行います。
その後はログを出力します。


ソースコードダウンロード
TrailingStopSampleRobot.java
※このロボットはSampleRobot.java、SampleObjectMemo.javaがないと動作しません。
カブロボをお使いのPCで実行するには、カブロボSDKが必要です。

別途、カブロボサイトからカブロボSDKをダウンロードしご利用ください。

Comments:0

Comment Form

コメントを表示する前にこのブログのオーナーの承認が必要になることがあります。

Remember personal info

Trackback:0

TrackBack URL for this entry
http://kaburobo.sakura.ne.jp/kaburobonet/mt-tb.cgi/270
Listed below are links to weblogs that reference
トレーリングストップのサンプルロボット from kaburobo tech support - kaburobo.net/support/

Home > Javaカブロボ | Javaカブロボ | サンプル | プログラミング > トレーリングストップのサンプルロボット

Search
Feeds

Page Top