Javaカブロボ Archive
MarketRanking (ランキングデータ) を使ったサンプルロボット
MarketRanking の機能にフォーカスしたサンプルコードを解説いたします。
MarketRanking には多くのデータが日々更新されていますので、これを期にマスターしましょう。
基本的な使い方は
import jp.tradesc.superkaburobo.sdk.trade.data.EnumMarketRankingType;
import jp.tradesc.superkaburobo.sdk.trade.data.MarketRanking;
と書いて EnumMarketRankingType と MarketRanking を import します。
次に
ArrayList < MarketRanking > rankingList =
tradeAgent.getInformationManager().getMarketRanking(EnumMarketRankingType.DROP_RATE);
のように書いてデータを取得します。
例では値下がり幅のデータを取得するために EnumMarketRankingType.DROP_RATE を使っていましたが、
EnumMarketRankingType にはDROP_RATE だけでなく合計で21種類データを取得することができます。
DIVIDEND:配当利回り上位
DROP_CREDIT_BUYING:信用買残減上位
DROP_CREDIT_SALE:信用売残減上位
DROP_RANGE:値下がり幅
DROP_RATE:値下がり率
HIGH_CREDIT_RATIO:信用高倍率上位
HIGH_PBR:高PBR
HIGH_PER:高PER
LOW_CREDIT_RATIO:信用低倍率上位
LOW_PBR:低PBR
LOW_PER:低PER
NET_PROFIT_RATE:純利益成長率上位
ORDINARY_PROFIT_RATE:経常利益成長率上位
RISE_CREDIT_BUYING:信用買残増上位
RISE_CREDIT_SALE:信用売残増上位
RISE_RANGE:値上がり幅
RISE_RATE:値上がり率
SALES_RATE:売上高成長率上位
VALUE:売買代金
VOLUME:出来高
VOLUME_RATE:出来高乖離率
それでは、実際に MarketRanking を使ったカブロボを作ってみましょう。
今回は、SDKに付属する SampleRobot の screening メソッドを書き換えるだけでできます。
戦略は前日-3%以上値下がりした銘柄を次の日に買う、というシンプルな短期逆張りロボットです。
短期保有にするためには、SampleRobot の order メソッドの中の、orderReverseByRate の保有日数を調整する必要があります。
コードは以下のようになります。
01 @Override
02 public void screening(TradeAgent tradeAgent) {
03
04 // オブジェクトメモを用意し、null チェックを行います。
05 SampleObjectMemo memo = (SampleObjectMemo) MemoManager.getInstance().getObjectMemo();
06 if(null == memo) memo = new SampleObjectMemo();
07
08 // 注文予定リストを用意し、null チェックを行います。
09 ArrayList<SampleObjectRecord> memoList = memo.getMemoList();
10 if(null == memoList) memoList = new ArrayList<SampleObjectRecord>();
11
12 ArrayList<MarketRanking> rankingList = tradeAgent.getInformationManager().getMarketRanking(EnumMarketRankingType.DROP_RATE);
13
14 for(MarketRanking r : rankingList)
15 {
16 //-3%以内の値下がり率の銘柄は買わない
17 if(r.getData() >= -3)
18 {
19 break;
20 }
21 RobotLogManager.getInstance().log(r.getStock().getStockName(), 3);
22 RobotLogManager.getInstance().log(r.getData().toString(), 3);
23 //購入予定に追加
24 memoList.add(new SampleObjectRecord(r.getStock(), true, 111, "値下がり率ランキング"));
25 }
26
27 // オブジェクトメモにセットします。
28 memo.setMemoList(memoList);
29
30 // オブジェクトメモを登録します。
31 MemoManager.getInstance().setObjectMemo(memo);
32 }
●ソースコードダウンロード
SampleMarketRankingRobot.java
※カブロボをお使いのPCで実行するには、カブロボSDKが必要です。
別途、カブロボサイトからカブロボSDKをダウンロードしご利用ください。
ETFを売買するサンプルロボット
今回は新しく追加されたETF機能にフォーカスしたサンプルロボットを解説したいと思います。
ポートフォリオに ETF がなければ買い、あれば売りをするだけの単純なカブロボです。
●ETFとは
ETF について、及び ETF 対応カブロボ SDK については ETF 機能対応のカブロボSDK 2.1.0-beta1版リリースのお知らせもご参照ください。
●コードの説明
サンプルソースコード行の先頭には行数が付与されています。実際のソースコードでは行数の記述は不要です。
36 // ETF の銘柄リストをつくります。
37 ArrayList<Stock> etfStockList = new ArrayList<Stock>();
38 for(Category cat: im.getEtfList()){
39 etfStockList.addAll(cat.getStockList());
40 }
ETFの情報はInformationManager(im)のgetEtfListメソッドで取得することができます。
for文を回してETFだけのリストを作ります。
42 // 1銘柄ずつ保有していれば売り、保有していなければ買います。
43 for (Stock etf : etfStockList) {
etfStockListからStock型のオブジェクトが取得できるので、これを元に売買命令を出します。
44 if(pm.isHolding(etf)){
45 // 保有しているので全量を 即時 成行 で売却します。
46 for (Portfolio portfolio : pm.getPortfolio()) {
47 // このポートフォリオが ETF 銘柄か調べます。
48 if(etf.equals(portfolio.getStock())){
49 // ETF なので売却します。
50 portfolio.orderReverseNowMarketAll();
51 }
52 }
53 } else {
銘柄を保有しているかどうかを調べます。
保有していた場合はその銘柄(ETF)を売却します。
53 } else {
54 // 保有していない ETF なので、新規に買い注文を出します。
55
56 // 買い注文を出すために、前日終値を取得し、数量を計算します。
57 StockData lastSession = im.getStockSession(etf);
58 if(lastSession == null) continue; // 最後の場の情報を取得できなかったのでこの銘柄をスキップします。
59 Integer closingPrice = lastSession.getClosingPrice();
60 if(closingPrice== null) continue; // 最後の場の終値が取得できなかったのでこの銘柄をスキップします。
61
62 // 注文数 (総資産の40%) (前日の終値)
63 int qty = orderMoney / closingPrice.intValue();
64
65 // 注文を出します。
66 if (! om.orderActualNowMarket(etf, qty) ) {
67 // 失敗した場合ログに理由と共に出力します。
68 rlm.log(etf.getStockName()+" "+qty+"株(終値:"+closingPrice+" 注文額:"+(closingPrice*qty)+" )の注文に失敗しました: "+om.getLastOrderResult().toJapanese());
69 }
70 }
保有していない場合、前日の終値と orderMoney (1回の注文で購入する1銘柄あたりの金額) から買う株数を計算します。
om.orderActualNowMarket(etf, qty) で実際に注文をし、失敗した場合はログに記録します。
●ソースコードダウンロード
SampleEtfRobot.java
※カブロボをお使いのPCで実行するには、カブロボSDKが必要です。
別途、カブロボサイトからカブロボSDKをダウンロードしご利用ください。
また、ETFを使うためには robot-config.xml を事前に修正しておく必要があります。
修正方法は robot-config.html (SDK付属の help/doc ディレクトリ内にございます)をご覧ください。
トレーリングストップのサンプルロボット
トレーリングストップとは | 簡単な設定例 | コード説明 | ソースコードダウンロード
トレーリングストップとは、利益になっているトレードにおいて、利益を確実に確定するという手法であり、利益から損失に変えない為のトレード手法です。逆指値の値段を株価に合わせて上げていくことで利益確定のラインを決定します。
設定できるのは以下の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
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
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をダウンロードしご利用ください。