レベル: 中級 木村 桂 (kimuc@jp.ibm.com), ソフトウェア事業, IBM
2006年 6月 16日 2006年 6月 19日 更新 過去に日本アイ・ビー・エムおよび developerWorks を通じて運営・開催に協力してきたカブロボが、「スーパー」になって帰ってきました。カブロボコンテストは過去2回行われており、今回が第三回目になります。が、今回は趣向を大幅に変更し、改めて「第一回 スーパー・カブロボ・コンテスト」として開催されます。
「スーパー」カブロボとは?
この記事に興味をもっていただき、ご覧になっている一部のマニアな皆さん、こんにちは。過去に日本アイ・ビー・エムおよび developerWorks を通じて運営・開催に協力してきたカブロボが、「スーパー」になって帰ってきました。
カブロボを知らない方のために簡単に説明します。カブロボは2つの特徴を持っています。
- 実際の相場と仮想の資金を使った株式投資のシミュレーションコンテストです。
- ただし銘柄の指定や売買命令は参加者が行うのではなく、参加者が作成した「投資ロボット」によって執行され、そのロボットの運用成績を競います。
参加者は2で説明したロボットを作ってエントリーさせることで参加できます。ここでいう「ロボット」というのは鉄腕アトムやドラえもんのような物理的な実体を持つロボットではなく、ファンダメンタル的/テクニカル的な情報を日々取り入れながら最適な売買銘柄を選んで、売買命令を発行するようなロジックが組み込まれた「ソフトウェアのロボット」です。 プログラミングが得意な方はこのロボットを SDK を元にゼロからスクラッチで作成してもかまいませんし、プログラミングが苦手であれば、投資スタイルについての質問に答えていくことで、そのスタイルに合うようなロボットが自動生成されますので、それを使うこともできます。
そして評価は結果が全てです。本人がどれだけ投資に詳しくても、どれだけ経済に強くても、意味はありません。作ったロボットの運用成績が全てです。まさに「誰でも参加できる、リアルタイム知的ゲーム」、それがカブロボコンテストです。
カブロボコンテストは過去2回行われており、今回が第三回目になります。が、今回は趣向を大幅に変更し、改めて「第一回 スーパー・カブロボ・コンテスト」として開催されます。スーパー・カブロボ・コンテストについての詳細はウェブページを参照してください。
では何が「スーパー」になったのでしょうか? まず大きくはコンテストの目的が変わりました。第二回まではカブロボコンテストそのものが最終目的であり、ここで上位入賞することが名誉なこと、という位置づけでした。スーパー・カブロボではコンテストは1つのゴールではありますが、その先を見据えています。今までは仮想資金をどれだけ増やせるかを競うコンテストでしたが、今回は最終的には仮想ではない実資を運用することになります。その運用を任せることができるロボットを探し出すためのオーディションという位置づけでスーパー・カブロボ・コンテストが開催されます。コンテストは約3ヶ月間の運用成績を競うコンテストですが、この結果とは別に更に長期間の運用に耐えられるだけの安定性を持っているか、などが審査され、予定では10体の優秀ロボットを選出し、実資での投資の、いわば「ファンドマネージャー・ロボット」として働くことになる予定です。そしてそのファンドマネージャーの産みの親であるロボット作成者には実運用であげた利益に対する成功報酬が支払われることになります。 要は「精度の高い投資ロボットを作れば、そのロボットが自分のためにお金を稼いでくれる」わけです!
過去の大会同様、スーパーカブロボコンテストにおいても IBM developerWorks では、特に SDK を使ってロボットをプログラミングした上で参加される方を対象に情報を提供していく予定です。なお、本稿はまだ最終的な仕様が確定していない、スーパー・カブロボ SDK RC3 版を利用して解説しています。最終版では多少の変更が加わることになるかもしれませんが、その点あらかじめご容赦ください。
なお、本記事は2回連載の前編です。
スーパー・カブロボ・コンテストのルール
まず、(6月19日時点での)スーパー・カブロボ・コンテストのルールを簡単に説明します:
- 運用資金は仮想の 5,000 万円で、これを実際の株価を基にした仮想取引市場の中で運用する。
- 投資対象は東証一部から抽出した特定銘柄のみ。
- 注文は前場と後場それぞれの開始時点で可能。成行・指成・指値・逆指値注文が可能。信用取引(空売り注文)も可能
- シミュレーション期間中、外部からロボットに情報を与えることはできない。また運用結果は再現可能である必要があるため、乱数の利用は不可。
また、スーパー・カブロボ・コンテストに参加するロボットは以下の予備審査を通過する必要があります:
-
過去1年間のデータを利用して、作成したロボットのシミュレーションを行い、その結果が以下の基準全てを満たしていた場合、大会へのエントリーが可能。
- エントリー後に登録されたロボットを対象に、大会運営事務局が別の銘柄と期間を用いて、再度1年間のシミュレーションを行い、その結果が以下の基準全てを満たしていた場合、本戦に出場可能。
(エントリー基準)
(1) 運用結果が黒字(5,000万円以上)
(2) 最大ドローダウン率が 30% 以内
(3) 期間中に(売りと買いの合計で)1億円以上の売買取引実績がある
参加者自身が行う必要があるのは太字部分のセルフテストです。では実際にロボットを作って、このテストまでを行ってみることにします。
プログラミング環境の準備
スーパー・カブロボ・コンテストでは、SDK が大きく変更されました。売買のロジック部分だけに限っても過去二回向けに作られたコードはそのままでは動かないはずです。
つまり、過去に参加した方もこのスーパー・カブロボ・コンテスト用に新たにロボットを作り直す必要があるわけです。そこで改めて Eclipse を利用した開発環境を整備する段階から説明します。Eclipse を利用されない方や、Eclipse での環境整備を問題なく行えた方はこの部分は読み飛ばしていただいてかまいません。
ダウンロードする必要があるのはコンパイラである JDK 1.5、そして Eclipse SDK と呼ばれる統合開発環境と、スーパー・カブロボ用の SDK です。JDK 1.5 および Eclipse SDK のインストールについては多くの紹介記事がありますからここで紹介しません。@ITの記事などを参考に導入してください。 またスーパーカブロボ SDK についても zip ファイルを展開するだけです。Eclipse とスーパーカブロボ SDK がそれぞれ C:\Eclipse と C:\kaburobo というフォルダに展開しているものと仮定します。また Eclipse は英語環境のままで利用している前提で以下を説明します。
カブロボ SDK を展開した後、展開フォルダ名を環境変数 KABUROBO_HOME に設定する必要があります。環境変数を設定する方法は Windows であればコントロールパネルの システム→詳細設定→環境変数 を選択し、システム環境変数として KABUROBO_HOME が既に加わっていれば選択してダブルクリック、まだ設定されていなければ新規ボタンをダブルクリックして、
| 変数名 | KABUROBO_HOME |
|---|
| 値 | (カブロボ SDK を展開したフォルダ名 上記であれば c:\kaburobo ) |
|---|
を設定します。
次にスーパー・カブロボ・コンテストに参加させるロボットを開発するためのプロジェクトを準備します。Eclipse を起動し、メニューから File → New → Project を選択して New Project ウィザードを表示し、ここでは Java Project を選択して Next ボタンをクリックします。
次の画面ではプロジェクトの名称を入力します。ここには好きな名前を入力できますが、仮に SuperKabuRoboProject としておきます。またスーパー・カブロボでは JDK1.5 が利用できますから、コンパイラは 5.0 を選択しておきます。ここでもう一度 Next ボタンをクリックします(まだ Finish ボタンをクリックしないでください)。
ここまでの操作で Java プロジェクトが定義されました。通常はこれで終わりなのですが、このプロジェクトにはスーパー・カブロボ用の SDK を組み込む必要があります。そのために次の Java Setting の画面ではまず Libraries タブを選択し、Add External JARs ボタンをクリックします。
すると JAR 選択のダイアログボックスが表示されますから、ここでカブロボ SDK をインストールしたフォルダ(C:\kaburobo など)以下の lib サブフォルダを選び、その中にある hsqldb.jar と skaburobo-sdk.jar の2つのファイルを選択して開きます。
Java Setting の画面に戻り、いま選択した2つの JAR ファイルが Libraries に追加されていることが確認できれば成功です。これでスーパー・カブロボを作るためのプロジェクトの準備ができました。最後に Finish ボタンを押してください。
プログラミングの前にもう一つ準備が必要です。 これから作成するカブロボのプログラムを動作させるにあたり、その動作条件を専用の設定ファイルで指定します。何も設定しないとシミュレーション期間が1年間となっており、簡単なロボットでも一回の動作にかなりの時間を要してしまいますから、プログラム開発中はもっと短い期間に設定しても問題ないと思われますので、その変更をします。 また現在の仕様では実行時の最初に動作条件が表示され、そこで Enter キーを押すことで初めてシミュレーションが開始されるようになっています。これは便利なのですが、慣れてくるとそのまますぐに動作してほしい、と思うことが多くなりますから、この機能を無効に設定しておくことにします。
ロボットの動作を設定するファイルはカブロボ SDK をインストールしたフォルダ(C:\kaburobo)以下の config サブフォルダ内にある robot-config.xml というファイルです。これを書き換えることで動作の変更を指定するのですが、Eclipse を利用して開発する場合はこのファイルをプロジェクトに含めることが可能です。エクスプローラなどで C:\kaburobo\config を開き、robot-config.xml を選択して、Eclipse のプロジェクトまでドラッグ&ドロップします。するとプロジェクト内にこの robot-config.xml がコピーされます。
この robot-config.xml を Eclipse からであればダブルクリックで、そうでなければメモ帳などのテキストエディタで開きます。以下のような内容になっているはずです:
<?xml version="1.0" encoding="UTF-8" ?>
<robot-config>
<robot-class-name>SampleRobot</robot-class-name>
<time>
<start>2004-09-01</start>
<end>2005-08-31</end>
</time>
<user-log>
<console level="5" />
<file level="0" path="log.txt" />
<database level="0" />
</user-log>
<system-log>true</system-log>
<config-confirmation>true</config-confirmation>
<overwrite>true</overwrite>
</robot-config>
|
この内容を以下のように書き換えて保存します。変更箇所は赤字で示しました:
<?xml version="1.0" encoding="UTF-8" ?>
<robot-config>
<robot-class-name>MyRobot001</robot-class-name>
<time>
<start>2005-06-01</start>
<end>2005-06-30</end>
</time>
<user-log>
<console level="5" />
<file level="5" path="log.txt" />
<database level="0" />
</user-log>
<system-log>true</system-log>
<config-confirmation>false</config-confirmation>
<overwrite>true</overwrite>
</robot-config>
|
まず <robot-class-name> タグ内の名称ですが、これはこれからプログラミングするロボットの名前です。別の名前でもかまいませんが、その場合はこの後で同じ名前のロボットを作成するようにしてください。 <start>タグと<end>タグはシミュレーション期間の開始日と終了日を指定しています。当初は 2004/09/01 から1年間が指定されていますが、これですと簡単なロボットでも1回の動作に20分以上かかってしまいますので、普段はこの期間をもっと短いものに(2005年の6月のデータだけでシミュレートするように)変更しておくことにします。なお日時の指定はかならず YYYY-MM-DD フォーマットで記述してください。またセルフテストなどの長期シミュレーションを行いたい場合はこの期間を再度元通りに戻してから実行してください。 この実行結果はかなり長いものになり、コンソールに出力しきれないので、ファイルにも結果を残すよう <file> タグのレベルを 5 に指定します。 最後に <config-confirmation> タグの値を false に変更します。これはシミュレーション実行直前にポーズをかけないことを意味する指定です。
準備はここまで。次はいよいよプログラミングになります。
ともあれ作ってみましょう
スーパー・カブロボになって大きく変更された仕様の1つにスクリーニング処理のための時間が設けられたことがありますが、個人的にはこれはほとんどのケースで使わない(使わなくても変わらない)と思っていますので、今回はスクリーニングは使いません。
では実際に投資を行うロボットを作ってみましょう。上記で作成した SuperKabuRoboProject の部分を右クリックし、New → Class を選択します。
すると New Java Class ダイアログが表示されます。Source Folder にプロジェクト名称である SuperKabuRoboProject が代入されていることを確認して、Name にはロボットの名前である MyRobot001(robot-config.xml の <robot-class-name> タグで指定した名前と同じもの)を指定します。また Superclass には Browse ボタンをクリックしてから jp.tradesc.superkaburobo.sdk.robot.AbstractRobot を指定します。後は特に変更しなくてもかまいませんが、Package について理解されている方はここでパッケージ名を入力してください。この状態で Finish ボタンをクリックします。
するとパッケージエクスプローラ上に MyRobot001.java が追加されたことが分かります。これが投資ロボットの雛形となります。この段階では実質的には何も中身がない状態なので、とりあえず赤字の部分を付け加えます。
import java.util.ArrayList;
import jp.tradesc.superkaburobo.sdk.robot.AbstractRobot;
import jp.tradesc.superkaburobo.sdk.trade.OrderManager;
import jp.tradesc.superkaburobo.sdk.trade.PortfolioManager;
import jp.tradesc.superkaburobo.sdk.trade.TradeAgent;
import jp.tradesc.superkaburobo.sdk.trade.data.Portfolio;
import jp.tradesc.superkaburobo.sdk.trade.data.Stock;
public class MyRobot001 extends AbstractRobot {
static int idx = 0; //. 売買対象銘柄の配列上の位置
static int buysell = 1; //. 注文の種類(1:買い, -1:売り)
@Override
public void order(TradeAgent arg0) {
// TODO Auto-generated method stub
//. 手持ちのポジションを清算するため、ポートフォリオを取得する (1)
PortfolioManager portfolioManager = arg0.getPortfolioManager();
ArrayList<Portfolio> portfolioList = portfolioManager.getPortfolio();
//. 手持ちのポジションがあれば全て決済する (2)
for( Portfolio portfolio : portfolioList ){
portfolio.orderReverseNowMarketAll();
}
//. このシミュレーションで取引できる全株銘柄を取得する (3)
ArrayList<Stock> stocks = arg0.getInformationManager().getStockList();
//. idx 番目の銘柄を取り出す (4)
Stock stock = stocks.get( idx );
//. 取り出した銘柄の単元数を取得する (5)
Integer unit = stock.getUnit();
//. OrderManager オブジェクトを取得して、売買に備える (6)
OrderManager order = arg0.getOrderManager();
//. 最低取引株数(=単元数)分だけ売買する (7)
order.orderActualNowMarket( stock, buysell * unit );
//. 次の取引に備えて idx の値を1つ増やす。 (8)
idx = ( idx + 1 ) % stocks.size();
}
@Override
public void screening(TradeAgent arg0) {
// TODO Auto-generated method stub
}
}
|
Java のプログラムとしてはかなりシンプルなので、解説なしでも多くの方が理解できるのではないかと思います。ただ Java やカブロボ SDK にまだあまり詳しくない方のために解説を加えます。まずこの MyRobot001 ロボットは AbstractRobot というクラスを継承しています。この AbstractRobot がスーパー・カブロボ・コンテストで動作するための最低限の仕様を持ったロボットのクラスです。このクラスを継承することで、実際の投資ロジックを追加するだけでコンテストに参加できるロボットができるようになっています。
その投資ロジックですが、public void order() という関数内に記述します。なお、この order() という関数は一日の前場と後場それぞれの開始時点で1回ずつ、つまり1営業日につき2回実行されます。この order() 関数内ではまず手持ちのポジションがあれば無条件に決済します。この部分は各ポートフォリオを取得して(1)、おのおの決済する(2)、というロジックで実現します。 次にコンテストで売買できる株式全銘柄はあらかじめ公開されていませんが、(3) の方法で Stock というクラスの配列として取得することができます。この order() 関数が最初に実行された時は最初の(配列番号0の)銘柄を、二回目に実行された時は2番目の(配列番号1の)銘柄を取得します(4)。更に (5) の方法で取得した銘柄を売買する準備として、単元数の情報を取得します。 次に (6) で実際の売買命令を発行する OrderManager というクラスのオブジェクトを生成し、(7) で株数を指定して成行注文します。 最後に次の売買にそなえて対象株式を指し示す配列番号の変数を1つ増やします、配列の最後尾まで進んだ場合はゼロに戻します(8)。
Eclipse を使わずにロボットを開発している方であれば kaburobo.bat でシミュレーションを開始できます。Eclipse を使っている場合はプロジェクトに追加した skaburobo-sdk.jar 内にあるメインクラスから実行できるようになっています。
動け、ロボ!
では作成したロボットを動かして、実際にシミュレートしてみましょう。パッケージエクスプローラから skaburobo-sdk.jar を右クリックして、Run As → Java Application を選択します。
すると MyRobot001 が設定ファイルで指定された通りに動作します。指定した期間中、1日に2回、買いと決済を1つずつくり返し執行していきます。ログをファイル出力していた場合には Eclipse のワークスペースフォルダ内にこのプロジェクトと同じ名前のフォルダ(SuperKabuRoboProject フォルダ)があり、その中に log.txt という名前で結果が書き込まれているはずです。これを参照すると以下のような売買経過が分かります:
●● 2005/06/01 16:00 (水) ● スクリーニング処理開始 ●●●●●●●●●●●●●●●●●●●●●●●
【保有資産評価】
取引余力 50,000,000 円
株式評価額 0 円
資産評価額 50,000,000 円
【ポートフォリオ】
所有銘柄はありません。
●● 2005/06/01 23:59 (水) ● スクリーニング処理終了 ●●●●●●●●●●●●●●●●●●●●●●●
■■ 2005/06/02 08:00 (木) ■ 注文処理開始 ■■■■■■■■■■■■■■■■■■■■■■■■■■■■
【保有資産評価】
取引余力 50,000,000 円
株式評価額 0 円
資産評価額 50,000,000 円
【ポートフォリオ】
所有銘柄はありません。
【注文結果】
現物 成行 即時 2914 0 1 枚
■■ 2005/06/02 09:00 (木) ■ 注文処理終了 ■■■■■■■■■■■■■■■■■■■■■■■■■■■■
■■ 2005/06/02 11:30 (木) ■ 注文処理開始 ■■■■■■■■■■■■■■■■■■■■■■■■■■■■
【保有資産評価】
取引余力 49,709,710 円
株式評価額 290,000 円
資産評価額 49,999,710 円
【ポートフォリオ】
銘柄名(コード)| 買付日| 枚数| 購入価格| 評価額
--------------------------------------------------+----------+----------+----------+----------
JT(2914)|2005/06/02| 1| 290,000| 290,000
【注文結果】
現物 成行 即時 2914 0 -1 枚
現物 成行 即時 4063 0 100 枚
■■ 2005/06/02 12:30 (木) ■ 注文処理終了 ■■■■■■■■■■■■■■■■■■■■■■■■■■■■
:
(中略)
:
■■ 2005/06/03 08:00 (金) ■ 注文処理開始 ■■■■■■■■■■■■■■■■■■■■■■■■■■■■
【保有資産評価】
取引余力 49,595,596 円
株式評価額 404,000 円
資産評価額 49,999,596 円
【ポートフォリオ】
銘柄名(コード)| 買付日| 枚数| 購入価格| 評価額
--------------------------------------------------+----------+----------+----------+----------
信越化学工業(4063)|2005/06/02| 100| 4,060| 404,000
【注文結果】
現物 成行 即時 4063 0 -100 枚
現物 成行 即時 4502 0 100 枚
:
(中略)
:
■■最終成績表■■■■■■■■■■■■■■■■■■■■
--●取引データ●--------------------------------------
取引開始日 :2005-06-01
取引終了日 :2005-06-30
運用期間(日) :30
総トレード数 :41
勝ちトレード数 :16
負けトレード数 :25
年間平均トレード数 :0
連続勝ちトレード数 :6
連続負けトレード数 :4
全トレード平均期間(日) :1
勝ちトレード平均期間(日) :1
負けトレード平均期間(日) :1
最長フラット期間(日) :1
トータル約定金額(円) :46089250
--●勝率データ●--------------------------------------
勝率(%) :39.02
最大年間勝ち月数率(%) :0
最小年間勝ち月数率(%) :0
平均年間勝ち月数率(%) :0
--●損益データ●--------------------------------------
トータル純損益(%) :-0.04
勝ちトレード純利益(%) :0.11
負けトレード純損失(%) :-0.14
買いトレード純損益(%) :-0.04
売りトレード純損益(%) :0
平均損益(%) :-0.06
平均利益(%) :0.63
平均損失(%) :-0.5
年間平均純損益(%) :0
最大勝ちトレード(%) :1.4
最大負けトレード(%) :-1.75
--●指標データ●--------------------------------------
平均ドローダウン(%) :0.05
最大ドローダウン(%) :0.1
損益レシオ(倍) :1.17
プロフィットファクター(倍) :0.75
年間平均利益/最大ドローダウン(倍):0
月次シャープレシオ(倍) :0
年次シャープレシオ(倍) :0
新規シグナル発生確率(%) :7
返済シグナル発生確率(%) :7.32
--●エントリー基準●----------------------------------
トータル約定金額 [1億円以上] :不合格
トータル純損益 [ 0%以上] :不合格
最大ドローダウン [30%未満] :合格
■■■■■■■■■■■■■■■■■■■■■■■■■■■
合計ロボット注文処理時間: 00:00:30.218
平均ロボット注文処理時間: 00:00:00.719
合計ロボットスクリーニング処理時間合計: 00:00:08.408
平均ロボットスクリーニング処理時間: 00:00:00.382
総実行時間: 00:01:35.828
|
この結果、2005/06/02 08:00 に株式コード 2914 の銘柄(JT)が1株注文されていることがわかります。また同日 11:30 の段階ではこの時の注文が成立し、ポートフォリオに追加されていることが分かります。更にこのタイミングでは同銘柄を決済する注文(-1株の購入)と株式コード 4063 の銘柄(信越化学工業)を100株新規購入する注文がされていることも分かります。
そしてこのような売買の記録データがずっと続いた最後に最終成績表が追加されます。最終成績の赤字部分を見ると
トータル約定金額: 46,089,250円 ・・(一億円以上が条件なので)不合格
トータル純損益 : -0.04 ・・(プラスが条件なので)不合格
最大ドローダウン: 0.1 ・・(0.3未満が条件なので)合格
という結果が見て取れます。実際には1年間のデータでシミュレートした結果でこの3つが全て合格になるようなロボットを作ることがエントリーの条件になります。試しにこのロボットを 2004-09-01 から 2005-08-31 までの期間でシミュレートしたところ・・・トータル純損益が不合格でした。とりあえずこのロボットはそのままではエントリーできないことになります、残念。
ぜひ参加を!
本記事ではスーパー・カブロボ・コンテストの概要と、ロボットをプログラミングする際の準備からシミュレーションの実行方法までをごく簡単に解説しました。実際の投資ロボットはここで紹介したような単純なロジックではなく、ファンダメンタル要素やテクニカル要素を元に銘柄の決定と売買タイミングを測るものが多くなると思っています(もちろんそうである必要はありません)。基本的なロボット開発の手順はここで紹介したものになりますが、是非投資ロジック部分を改良し、可能ならばみなさんの投資手法をそのままロジック化するなどして、ぜひスーパー・カブロボ・コンテストに参加してみてください。その際に本記事や developerWorks の過去記事がお役に立てば幸いです。
次回(後編)は SDK を使った基本的な情報の取得方法や注文の種類についてを中心に紹介する予定です。
ダウンロード | 内容 | ファイル名 | サイズ | ダウンロード形式 |
|---|
| MyRobot001.java | MyRobot001.zip | 925KB | HTTP |
|---|
著者について  | |  | 木村 桂: 日本IBM ソフトウェア事業 |
記事の評価
|