IBM®
本文へジャンプ
    Japan [変更]    ご利用条件
 
 
検索範囲検索:    
    ホーム    製品    サービス & ソリューション    サポート & ダウンロード    マイアカウント    
skip to main content

developerWorks Japan  >  Java technology  >

第2回スーパー・カブロボ・コンテスト: 予習編(3)

developerWorks
ページオプション

JavaScript を要するドキュメントオプションは表示されません


レベル: 中級

木村 桂 (kimuc@jp.ibm.com), ソフトウェア事業, IBM 

2007年 3月 30日
2007年 4月 11日 更新

今回は株式を買う際の銘柄選定というロジックをカブロボに実装する例を紹介します。

知能を少々・・・

前回は実際にカブロボを作って、株を売買するロジックを実装し、起動させて、その動作結果を確認する、という一連の手順を紹介しました。今後、より投資精度の高いロボットを作っていく際にも、この手順は変わりません(「株を売買するロジック」の内容だけを変えていくことになります)。

では今回はやみくもにただ売買するのではなく、「値上がりしそうな株を買う」という合理的なロジックをカブロボに追加して、投資ロボットらしく成長させてみましょう。前回紹介した DwRobot01 に対して、以下の機能を追加することにします:

  • 移動平均線のゴールデンクロスが発生した直後の、上昇が見込める銘柄のみを選別して買う
  • 買った銘柄は半場後に決済する(ここは変更しない)

「ゴールデンクロス」というのは、いわゆるテクニカル分析で多く使われる基本的な指標の1つです。まず短期間(今回は13データとします)と長期間(今回は34データとします)の2種類の株価終値移動平均値を計算し、短期平均値が長期平均値を追い抜いた直後のタイミングを「ゴールデンクロス」と呼び、このタイミングを株価上昇のサインと判断します(注 この考え方が必ずしも正しい、というわけではありません)。また今回は利用しませんが、短期平均値が長期平均値に追い抜かれた直後のタイミングを「デッドクロス」と呼び、株価下落のサインと判断します。

(赤い線が短期移動平均線、青い線が長期移動平均線。赤丸(赤い線が青い線を追い抜いている箇所)でゴールデンクロス、黄丸(赤い線が青い線に抜かれている箇所)でデッドクロスになっている例)



カブロボ SDK にはこのゴールデンクロスをはじめとした各種テクニカル分析を簡単に行える機能がライブラリとして提供されています。これらテクニカル分析や各種注文方法などカブロボ SDK で提供されている機能の利用方法についてはカブロボ SDK に同梱された HTML 形式の各種ヘルプファイルや Javadoc 形式のヘルプを参照してください。特に Javadoc 形式のヘルプはカブロボ SDK を展開したフォルダ(この紹介記事では "c:\kaburobo")から doc\javadoc とサブフォルダに入った中の index.html というファイルから探すことができます。



この index.html ファイルをダブルクリックすると、ブラウザと共に以下のような画面が起動します。この中からカブロボ SDK で提供されている各種パッケージやクラス、メソッドについて使い方が紹介されています。適宜参照しながら学習していくことをお奨めします。



クリックして拡大

では上記で説明したゴールデンクロスによる銘柄選別の機能を追加したロボット: DwRobot02 を新たに作成します。前回紹介した方法と同様、Eclipse のパッケージエクスプローラからプロジェクト名(今回の例では "Kaburobo")部分を右クリックし、 New → Class を選択します。



また、New Java Class のダイアログでは以下のように指定して、新しいロボット DwRobot02 を作成します。



またorder メソッドと main メソッドの中身には以下のようなコードを記述します。DwRobot01 からの変更部分を赤字および青字で記しています。


DwRobot02.java の内容
                
import java.util.ArrayList;

import jp.tradesc.superkaburobo.sdk.driver.RobotDriver;
import jp.tradesc.superkaburobo.sdk.robot.AbstractRobot;
import jp.tradesc.superkaburobo.sdk.trade.EnumAnalysisSpan;
import jp.tradesc.superkaburobo.sdk.trade.TradeAgent;
import jp.tradesc.superkaburobo.sdk.trade.analysis.technicalindex.GoldenCross;
import jp.tradesc.superkaburobo.sdk.trade.data.Portfolio;
import jp.tradesc.superkaburobo.sdk.trade.data.Stock;


public class DwRobot02 extends AbstractRobot {

  @Override
  public void order(TradeAgent arg0) {
    // TODO Auto-generated method stub
    
    //. 手持ちのポジションを清算するため、ポートフォリオを取得する
    ArrayList<Portfolio> portfolioList = arg0.getPortfolioManager().getPortfolio();

    //. 手持ちのポジションがあれば全て決済する
    for( Portfolio portfolio : portfolioList ){
      portfolio.orderReverseNowMarketAll();
    }
    
    //. このシミュレーションで取引できる全株銘柄を取得する
    ArrayList<Stock> stockList = arg0.getInformationManager().getStockList();
    
    //. 13データと 34 データでのゴールデンクロスの有無をチェックするためのクラスを用意する (1)
                GoldenCross gc = arg0.getAnalysisManager()
                		.getGoldenCross( EnumAnalysisSpan.SESSION, 13, 34 );
    
    //. 個別に銘柄を1つずつ取得して、ゴールデンクロスの有無をチェックする
    for( Stock stock : stockList ){
      //. 取り出した銘柄のゴールデンクロス発生有無を調べる (2)
                Double x = gc.getIndexGoldenCross( stock );
                //. 取り出した値が 1.0 だった場合はゴールデンクロスが発生していたことになる (3)
                if( x == 1.0 ){
        //. 取り出した銘柄の単元数を取得する
        Integer unit = stock.getUnit();

        //. 最低取引株数(=単元数)分だけ売買する
        arg0.getOrderManager().orderActualNowMarket( stock, unit );
      }
    }
  }

  @Override
  public void screening(TradeAgent arg0) {
    // TODO Auto-generated method stub

  }

  /**
   * @param args
   */
  public static void main(String[] args) {
    // TODO Auto-generated method stub
    //. 便利に実行するためのおまじない
    String[] arg = { "-n", "DwRobot02" };
    RobotDriver.main( arg );
  }

}

コードの解説ですが、まず order メソッド内のポートフォリオを決済する部分は何も変更していません。今回のカブロボでも order メソッドが実行されるたびに存在しているポジションは全て決済します。

ただし銘柄の買い注文時には大きな変更を加えました。カブロボ SDK では短期と長期それぞれのデータ数だけを指定してゴールデンクロスを判断することができる、便利なクラス(GoldenCross)が用意されているので、まずこのクラスを生成して、変数 gc に代入します(1)。この第一パラメータで EnumAnalysisSpan.SESSION と指定しているのは、半場単位の計算を行う、という指定です。ちなみにここで用いた 13 や 34 という数字に明確な根拠はありませんが、フィボナッチ級数※に出てくる数が使われることが多い(らしい)ので、そのまま使ってみました。

※まず 0 と 1 を横に並べ、前の2つの数字の和を次の数字としていく級数です。具体的には以下のようになります: 0, 1, (0+1=)1, (1+1=)2, (1+2=)3, (2+3=)5, (3+5=)8, (5+8=)13, (8+13=)21, (13+21=)34, (21+34=)55, ...

そして全対象銘柄リストから、各銘柄を1つずつ取り出すところは変わりませんが、この取り出した個別銘柄ごとにゴールデンクロスが発生したかどうかを判断します。上記の Javadoc で GoldenCross クラスを調べると、getIndexGoldenCross というメソッドを Stock オブジェクトを指定して実行することで、その Stock オブジェクトが示す銘柄のゴールデンクロスを判断することができる、と記述されていますので、これを使います。



クリックして拡大

取り出した個別銘柄の変数 stock を指定して gc の getIndexGoldenCross メソッドを実行し、その結果を変数 x に代入します(2)。そして上記 Javadoc にも記載されている通り、この結果が 1 だった場合はゴールデンクロスが発生していると判断できますから、値が 1 かどうかを比較します(3)。そして値が 1 だった場合のみ、この銘柄を前回のロジックを用いて単元株数だけ購入します。

では、前回の DwRobot01 から改良した DwRobot02 を起動して、その実行結果を見てみることにしましょう。前回の紹介内容を参考にして、DwRobot02 を起動します。そして1年間に及ぶシミュレーションが終了すると、カブロボは停止し、以下のような最終結果を出しているはずです:


改良したカブロボ DwRobot02 が停止した後の Console の内容
                
■■最終成績表■■■■■■■■■■■■■■■■■■■■
--●取引データ●--------------------------------------
初期資産額(円)      : 50,000,000
最終資産額(円)      : 49,477,503
取引開始日        :2004-09-01
取引終了日        :2005-08-31
経過日数(日)       :365
運用日数(日)       :245
総トレード数       :400
勝ちトレード数      :172
負けトレード数      :228
勝率(%)         :43
年間平均トレード数    :243
全トレード平均期間(日)  :0
勝ちトレード平均期間(日) :0
負けトレード平均期間(日) :0
最長フラット期間(日)   :11
トータル約定金額(円)   :433,586,800
--●損益データ●--------------------------------------
トータル純損益(%)    :-1.04
勝ちトレード純利益(%)  :1.29
負けトレード純損失(%)  :-1.47
買いトレード純損益(%)  :-0.18
売りトレード純損益(%)  :0
平均損益(%)       :0.01
平均利益(%)       :0.78
平均損失(%)       :-0.57
年率換算利回り(%)    :-1.04
最大勝ちトレード(%)   :2.94
最大負けトレード(%)   :-2.87
--●指標データ●--------------------------------------
平均ドローダウン(%)   :0.59
最大ドローダウン(%)   :1.09
損益レシオ(倍)      :1.17
プロフィットファクター(倍):0.88
リスクレシオ(倍)     :-0.96
年率シャープレシオ(倍)  :-3.57
年率ボラティリティ(%)  :0.29
■■■■■■■■■■■■■■■■■■■■■■■■■■■

この最終結果にはシミュレートした取引に関する資産額やトレード数、勝率、純損益といったものから、ドローダウン値、損益レシオ、プロフィットファクターといった詳細まで、各種データが出力されています。この結果を前回のロボットでの最終結果と比較してみます。

・・・胸を張って「前回とは見違えるようです!」とまでは言えません(苦笑)が、それなりにマシな結果にはなりました。細かな数値の解説はしませんが、トータルの純損益は -1.04%。前回の約 -25% よりはそれなりに考えながら投資しているような、努力の跡は見ることができます。総トレード数は 400 回で、1日1トレード強の厳選した銘柄だけを対象にしていることもわかります。ただ意外なことに勝率はわずかながら下がりました(43.07%→43%)。やはり買った後のポジション管理をせずに、直後の場で決済する方法が響いているのかもしれません。このあたりは次回以降の紹介記事で更なる改良の材料にします。




上に戻る


拡張パックで隠し味

まだまだ未熟とはいえ、少しずつ投資に必要な要素を取り入れながら、カブロボは進化してきていますね。ではロボットの改良はひとまずお休みとして、ロボット開発環境の改良を紹介します。第一回目の紹介記事ではカブロボ開発に必要な最低限の環境構築方法を紹介しましたが、カブロボ公式サイトからはカブロボ SDK の拡張パックもダウンロードできるようになっています。この記事を書いている 2007 年4月10日現在では、

  • ロボット成績表作成ツール(RC1)
  • 拡張検証パック(RC1)

が、それぞれダウンロード可能です。



3回目の紹介である今回は、最後にこれら拡張機能について説明します。まず拡張検証パックですが、カブロボ SDK に付属している株価データは 2004/01/05 ~ 2006/12/29 までの50銘柄の株価データを含むものでしたが、この拡張検証パックを使うと、カブロボ本戦と同様の全300銘柄を対象とした動作検証ができるようになります。ただし検証期間は 2006/01/04 ~ 2006/12/29 になりますので注意が必要です。また、この拡張検証パックでは大量のデータを扱う関係もあって、比較的高機能のPCが必要になったり、そうでない場合は動作が遅くなったり、場合によってはエラーとなってそのままでは動作しないことも考えられます。このあたりの対処方法等については、付属のマニュアル等カブロボ公式サイトからの情報を参考にしてください。

拡張検証パックを利用するには、カブロボ公式サイトにログインし、上記サイトから最新版の拡張検証パックをダウンロードします。またダウンロード後に検証パックを展開し、中にある data300 というフォルダをカブロボ SDK をインストールしたフォルダ(今回であれば c:\kaburobo)にコピーします。



次に Eclipse で準備したカブロボ作成プロジェクト内の robot-config.xml ファイルを編集して、この拡張パックを使って起動するよう変更します。Eclipse を起動して robot-config.xml ファイルをダブルクリックで開き、<data>~</data> と書かれたタグ内を data300 (拡張パックのフォルダ名)に変更します。またこの拡張パックで用意されたデータの期間にあわせて、シミュレーションを行う期間の開始日および終了日を変更して保存します。



この変更を行った状態でロボットを起動することによって、拡張検証パックを用いた 300 銘柄によるカブロボの動作検証ができるようになります。ちなみにこの設定で実際に起動すると、その最終結果は以下のようになりました。損益結果の評価はともかく、銘柄数が 50 から 300 と6倍になり、また動作期間は6ヶ月なので半分になったことを考慮すると、総トレード数が 400 から 1286 と約3倍になっているのは合理的な結果といえます。


改良したカブロボが停止した後の Console の内容
                
■■最終成績表■■■■■■■■■■■■■■■■■■■■
--●取引データ●--------------------------------------
初期資産額(円)      : 50,000,000
最終資産額(円)      : 48,242,856
取引開始日        :2006-03-01
取引終了日        :2006-08-31
経過日数(日)       :184
運用日数(日)       :127
総トレード数       :1,286
勝ちトレード数      :563
負けトレード数      :723
勝率(%)         :43.78
年間平均トレード数    :1286
全トレード平均期間(日)  :0
勝ちトレード平均期間(日) :1
負けトレード平均期間(日) :0
最長フラット期間(日)   :6
トータル約定金額(円)   :1,915,040,400
--●損益データ●--------------------------------------
トータル純損益(%)    :-3.51
勝ちトレード純利益(%)  :10.63
負けトレード純損失(%)  :-10.31
買いトレード純損益(%)  :0.32
売りトレード純損益(%)  :0
平均損益(%)       :-0.02
平均利益(%)       :1.26
平均損失(%)       :-1.01
年率換算利回り(%)    :-6.67
最大勝ちトレード(%)   :10.1
最大負けトレード(%)   :-9.63
--●指標データ●--------------------------------------
平均ドローダウン(%)   :2.24
最大ドローダウン(%)   :3.94
損益レシオ(倍)      :1.32
プロフィットファクター(倍):1.03
リスクレシオ(倍)     :-1.69
年率シャープレシオ(倍)  :-2.68
年率ボラティリティ(%)  :2.49
■■■■■■■■■■■■■■■■■■■■■■■■■■■

また、カブロボが動作した結果は最終成績表という形で残されますが、これだけだとどのような経緯でこの結果になったのか、という詳細は分かりにくいといえます。そこでカブロボの動作をビジュアル化するためのツールとして、「ロボット成績表作成ツール」が用意されています。こちらも同上の方法でダウンロードします。またダウンロード後に展開し、中にある tool というフォルダをカブロボ SDK をインストールしたフォルダ(今回であれば c:\kaburobo)にコピーします。



この成績表作成ツールの使い方は同フォルダ内にある readme.html というファイルをダブルクリックして内容を一読されることをお勧めしますが、以下にコマンドラインを使う例を簡単に説明します。まず成績表を作成するためにカブロボを起動する必要があります。ここでは上記 DwRobot02 を標準設定である data50 データを使い、また 2004/09/01 から 2005/08/31 までの期間で起動させることにします。設定を変更している場合は元に戻しておいてください。この状態で一度普通に起動し、停止するのを待ちます。



カブロボが停止したことを確認した後、tool フォルダの中にある performance-report.bat というファイルをダブルクリックします。



すると(いわゆるコマンドプロンプトの)黒いウィンドウの中で成績表作成ツールが起動し、直前に起動したカブロボの動作記録を調べて成績表の形で出力します。出力が終わる時にこの画面内に「ファイル file:/****************** に出力しました。」というメッセージが表示されます。******* の部分(以下の例では "C:\kaburobo\tool\report_54.html")はその時によって変わりますが、これが出力された成績表のファイルになります。



改めてエクスプローラ等でこのフォルダを開くと、出力された成績表を見つけることができます。



この HTML ファイルをダブルクリックすると、カブロボの動作記録が以下のようなビジュアルな形式で表示されます。単に視覚的に分かりやすいというだけではなく、細かな集計レポートやヒストグラム等も含まれており、とても便利で活用できるツールが提供されています。



クリックして拡大

なお、上記で紹介した 300 銘柄による拡張検証パックを利用した場合、そのまま performance-report.bat を実行したのでは正しい結果が出力されません。この場合はコマンドプロンプト等から

performance-report.bat -d data300

のように、"-d" というオプションに続いて拡張検証パックのフォルダを指定して実行する必要があります。この点に注意してください。




上に戻る


まだまだ未熟

今回は株式を買う際の銘柄選定というロジックをカブロボに実装する例を紹介しました。が、やはりそれだけでは充分とはいえず、「どこで決済するか」も重要な要素であることを再認識させられる結果になりました。成長はしていますが、人間でいえば、まだハイハイ歩き程度のロボットです。

そこで次回は決済のタイミングに焦点を当てて更なる成長の改良を試みる予定です。お楽しみに。



著者について

木村 桂: 日本IBM ソフトウェア事業




記事の評価


サイト改善のため、ご意見をお寄せください。こちらのフォームからお願いいたします。



はいいいえわからない
 


 


54321
大変素晴らしい不充分・不完全である
 


上に戻る


    日本IBMについて プライバシー お問い合わせ