レベル: 中級 木村 桂 (kimuc@jp.ibm.com), ソフトウェア事業, IBM
2007年 3月 23日
前回はカブロボをプログラミングするための準備作業の手順を紹介しました。前回の内容を一通り済ませていない方は、以下を参照する前に
前回の内容
を参照しておいてください。では何はともあれ「習うより慣れろ」ということで、実際にカブロボを作ってみましょう!なお、この原稿を記述している現在ではまだ作成したカブロボをコンテストに登録することはできません。コンテストの登録作業開始後であれば登録できますので、ご了承ください。
カブロボ初号機
前回紹介した環境設定が終わっている状態の Eclipse
を起動します。(細かな違いはあるかもしれませんが)Kaburobo
というプロジェクトが追加された、以下のような起動画面になります。
ここでパッケージ・エクスプローラのプロジェクト名部分を右クリックして、New → Class を選択します。
"New Java Class" というダイアログが表示されます。ここでは Source folder が
"Kaburobo"(ご自身で指定したプロジェクト名)であることを確認した上で、
-
Name 欄にはカブロボの名前(好きな名前を付けましょう。以下の例では developerWorks
にちなんで "DwRobot01" と付けています)
-
Superclass 欄には
"jp.tradesc.superkaburobo.sdk.robot.AbstractRobot"
を指定
-
"public static void main(String args[])" にチェックを付ける
を指定して "Finish" ボタンをクリックします。なお、本紹介記事では全ての例で Package
には何も指定しませんが、Java
のパッケージについて理解されている方はパッケージの区別目的で指定いただいても構いません。その場合は適宜ご自身の指定内容にあわせて読み替えてください。
すると元の画面に戻り、パッケージ内に今指定したロボット名に ".java"
という文字列が付いたファイルが追加されているのが分かります。また画面中央部には追加されたロボットのプログラムコードが表示されているはずです。これがこれから作っていくカブロボの雛形となるプログラムです。
人工知能を実装
上記で作成したロボット("DwRobot01")はカブロボとして必要な、注文やデータ参照などの機能をもってはいますが、まだ何も行わない、いわば「ただ起きているだけ」のロボットです。実はこのままでも動作するのですが、「起きているだけ」の動作ではつまらないので、簡単な投資のロジックを追加してみましょう。
ここからは少しずつプログラミング中心の作業になっていきます。Eclipse を使っている場合は画面中央にある
"DwRobot01.java"(皆さんが自由に付けたロボット名)
のタブ部分をダブルクリックして、プログラム画面を以下のように大きくしておくと、プログラミングの作業が容易になります(もう一度同じ箇所をダブルクリックすると元に戻ります)。 なお誤って×印をクリックしてプログラミング部分の画面を消してしまった場合は、パッケージエクスプローラからロボットプログラム(この例であれば
"DwRobot01.java")をダブルクリックすることで再度表示できます。
ではこの状態で以下のようにプログラムコードを変更します。以下の
赤字
で書かれた部分を追加で入力してください。
青字
については直接入力しても構いませんが、
赤字
を全て入力後に画面内でマウスを右クリックして Source → Organize
Imports を選択すると自動的に入力されます。また緑字の部分はこの後の説明での便宜上付けているだけですので、入力していただかなくても構いません。赤字と青字全て入力が完了したら保存(メニューから File
→ Save)してください。
DwRobot01.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.TradeAgent;
import jp.tradesc.superkaburobo.sdk.trade.data.Portfolio;
import jp.tradesc.superkaburobo.sdk.trade.data.Stock;
public class DwRobot01 extends AbstractRobot {
@Override
public void order(TradeAgent arg0) {
// TODO Auto-generated method stub
//. 手持ちのポジションを清算するため、ポートフォリオを取得する (1)
ArrayList<Portfolio> portfolioList = arg0.getPortfolioManager().getPortfolio();
//. 手持ちのポジションがあれば全て決済する (2)
for( Portfolio portfolio : portfolioList ){
portfolio.orderReverseNowMarketAll();
}
//. このシミュレーションで取引できる全株銘柄を取得する (3)
ArrayList<Stock> stockList = arg0.getInformationManager().getStockList();
//. 個別に銘柄を1つずつ取得して単元株数ずつ買い注文を入れる (4)
for( Stock stock : stockList ){
//. 取り出した銘柄の単元数を取得する (5)
Integer unit = stock.getUnit();
//. 最低取引株数(=単元数)分だけ売買する (6)
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
//. 便利に実行するためのおまじない (7)
String[] arg = { "-n", "DwRobot01" };
RobotDriver.main( arg );
}
}
|
では、今赤字で追加した上記投資ロジックの説明を順を追って行います。投資ロジックといっても、この段階ではまだ利益を得るための根拠はなく、買い注文と決済(売り)注文を繰り返すだけのロジックになっていますので、注文を行う際の参考程度と考えてください。
まず、このロボットが実行されると毎営業日の前場と後場が始まる直前に public void
order(上記の紫字)と書かれたメソッドのコードが実行されます。また毎営業日の後場終了後の夜に public
void screening
と書かれたメソッドのコードが実行されます。後者はスクリーニング目的で利用するのですが、今回後者は使いません。 また前者は前場および後場の始まる直前に呼び出されて、ここでそれぞれ前場・後場の注文を行います。今回は前場・後場を特に区別せずに注文する内容にしています。では実際に中身を見てみましょう。
order メソッドが実行されるとまず (1) および (2)
が順に実行されます。が、この2つは既に持っているポートフォリオのポジションを決済するための処理になります。当然のことですが、最初に実行した段階では何もポートフォリオを持っていませんから、少なくとも一回目は何も実行されません。(1)
と (2) の内容説明については後述します。
次に (3)
に注目します。この1行はカブロボの開発・テスト環境の中で対象となる株式全銘柄(当初はテスト用の50銘柄、変更可)のリストを取り出して、stockList
という名前の変数に代入しています。この時点ではまとめて取得しているだけなので、どのような個別銘柄が含まれているのかはまだ分かりません。そして
(4) で stockList リストから1つずつ個別銘柄を取り出して stock
という変数に代入し、それぞれの銘柄に対して以下で紹介する (5), (6)
の処理をするように繰り返しで命令しています。
個別銘柄を取り出した後、まず (5) でその銘柄を取引するための単元株数を取得して、その値を unit
という変数に代入しています。そして (6) では個別の銘柄を示す変数 stock と、その銘柄の単元株数
unit をパラメータ指定して「成行買い(orderActualNowMarket)」を指示しています。(4)
で説明したようにこれを全ての銘柄に対して繰り返し行って order
メソッドは終了します。したがって(売買停止やストップ高など、買い注文が成立しないような自体にならなければ)全ての銘柄を単元株数ずつ買っているポートフォリオを形成して
order メソッドは終了となります。
ここで重要なことは、このロボットは「自分が今からどの会社の株を買おうとしているのかを意識せずに注文している」ということです。もちろんこの後で「特定の銘柄コードのものだけを買う」という処理を追加することはできますが、そのような選別の処理を追加しない限りロボットは銘柄の選り好みをしてくれません。この点を注意してください。
次にこの order
メソッドが実行される時(つまり半場後)はポートフォリオが形成されている状態で実行されることになります。したがって
(1) や (2) も実行されることになります。(1) は (3)
と似ていますが、全個別銘柄ではなく、自分が取得している全ポートフォリオのリストを取り出して、portfolioList
という変数に代入しています。そして (2) では (4)
で行ったようにポートフォリオの全リストから1つずつ取り出して portfolio という変数に代入します。また
(3) では (6)
で行ったように個々のポートフォリオを「全株を成行決済(orderReverseNowMarketAll)」するよう命令しています。したがってここでも特殊な事情がない限りは全てのポートフォリオを決済することになります。そしてその後上記で説明したような
(3) ~ (6) の買い注文処理をもう一度行う、という流れになります。
あと (7) については「(このロボットを)簡単に実行するためのおまじない」だと思ってください。注意が必要なのは
String args = { "-n", "DwRobot01" };
と書かれたうちの、2つ目の文字列です。この例では "DwRobot01"
と記述していますが、ここにはみなさんが作成したカブロボの名前を入力するようにしてください。
このような注文を各営業日ごとに(前場と後場の)2回、ひたすら繰り返す、それが今作成した DwRobot01
です。必ずしもまだ「おりこうさん」とはいえない、危なっかしいカブロボですが、「買う&売る」という注文の基礎の基礎だけは身に付いた状態になりました。
初号機、発進!?
いよいよ、ロボットを動かしてみる時がやってきました! とはいえコックピットに乗り込んだり、仲間と合体したりする必要はありません。カブロボはそれなりに躾ができているので、スイッチ一つでとりあえず動いてくれます(自分の思い通りに動いてくれるかどうかは皆さん次第ですが・・・)。では発進です!
まず Eclipse
のパッケージエクスプローラが表示されている画面に戻ります。プログラムコードが全画面表示されている場合はロボット名が記述されたタブの部分をダブルクリックして元の画面構成に戻します。
ここから、作成したカブロボのファイルを右クリックで選択し、Run As → Java
Application を選択します。これでカブロボの起動スイッチが入ります!
なおプログラムコードを作る際に、「おまじない」と紹介した上記の (7)
を記述しなかった場合や、記述したんだけどうまくいかない、という人は以下の(本来の)方法での起動を試みてください。パッケージエクスプローラから
"skaburobo-sdk.jar" と書かれた横の + 印をクリックして展開し、その中から
"jp.tradesc.superkaburobo.sdk.driver" という箇所を探し、更にその横の +
印をクリックして展開します。更にその中の "RobotDriver.class"
と書かれた箇所を右クリックし、ポップアップするメニューから Run As → Java
Application を選択します。この方法でもカブロボを実行することができます。
カブロボは雄叫びと共に・・・ ではなく、とても静かに起動してくれます。聞こえてくるのはハードディスクのアクセス音程度です(笑)。画面右下の
"Console" と書かれたタブの中に実行中の様子が次々に書かれていきます。
ここでも実行の様子を最大表示することができます。"Console"
と書かれた部分をダブルクリックすると、この部分が全画面表示に切り替わります。また同様にして再度ダブルクリックするともとの画面に戻ります。また
"Console"
と書かれた右側には赤いインジケータが点灯して、現在実行中であることを示しています(全ての実行が終わるとこのインジケータは消えます)。
戦い(?)終えて
皆さんのカブロボは無事に起動してくれましたか? 起動後しばらくすると全ての処理を終え、以下のような画面を出してカブロボは停止します。インジケータも消えています。街中で突然止まったりしないので、ソフトウェアのロボットは後片付けが楽チンです。
まずは最終結果を見てみましょう。止まった画面を少しだけ上にスクロールさせると、以下のような最終結果が出力されているはずです:
カブロボ停止後の Console の内容
■■最終成績表■■■■■■■■■■■■■■■■■■■■
--●取引データ●--------------------------------------
初期資産額(円) : 50,000,000
最終資産額(円) : 37,560,830
取引開始日 :2004-09-01
取引終了日 :2005-08-31
経過日数(日) :365
運用日数(日) :245
総トレード数 :11,866
勝ちトレード数 :5,111
負けトレード数 :6,755
勝率(%) :43.07
年間平均トレード数 :8034
全トレード平均期間(日) :0
勝ちトレード平均期間(日) :0
負けトレード平均期間(日) :0
最長フラット期間(日) :1
トータル約定金額(円) :12,701,859,300
--●損益データ●--------------------------------------
トータル純損益(%) :-24.88
勝ちトレード純利益(%) :37.75
負けトレード純損失(%) :-37.23
買いトレード純損益(%) :0.52
売りトレード純損益(%) :0
平均損益(%) :0
平均利益(%) :0.7
平均損失(%) :-0.52
年率換算利回り(%) :-24.88
最大勝ちトレード(%) :8.57
最大負けトレード(%) :-4.25
--●指標データ●--------------------------------------
平均ドローダウン(%) :13.97
最大ドローダウン(%) :25.21
損益レシオ(倍) :1.34
プロフィットファクター(倍):1.01
リスクレシオ(倍) :-0.99
年率シャープレシオ(倍) :-6.54
年率ボラティリティ(%) :3.8
■■■■■■■■■■■■■■■■■■■■■■■■■■■
|
上から順に見ていきましょう。取引データとしては初期資産額は5千万円で、最終資産額は約 3756
万円。取引開始日が 2004/09/01 で終了日は
2005/08/31、とあります。これはつまり「2004/09/01
に5千万円の資金で投資を開始し、一年後(2005/08/31)に資産は約 3756
万円になった」ということです。この期間については(もしも)この日からこの日まで投資をしていたら、というシミュレーションの期間を示しています。 カブロボ初号機の
DwRobot01 くん、(何も考えずに作ったとはいえ)涼しい顔で一年間に約 1250
万円も食いつぶしてくれました。戦い終えたというよりは、ひたすらに暴れまくった感があります。なかなかの大物の予感です(苦笑)。
もう少し詳しく見てみると、この1年間の総トレード数は 11,866。そのうち 5,111 で利益を出し、残りの
6,755 では損益になりました。また1年間のトータル約定金額はなんと約 127
億円!証券会社にとっては嬉しいロボットですね。
損益データを見ると、トータルの純損益は約 25% マイナスになったことが分かります。全トレード中、最大の勝ちは
+8.57%、最大の負けは -4.25% だったことも分かります。また指標のデータからは最大ドローダウンが
25.21 %
とかなり大きめだったことが分かります。またシャープレシオやボラティリティについても記載されていて、一応この最終結果を見るだけでもどのようなロボットだったのか、大まかに分かるようになっています。
では、この最終結果を更に上にスクロールしてみましょう。
カブロボ停止後の Console の内容
■■ 2005/08/31 11:30 (水) ■ 注文処理開始 ■■■■■■■■■■■■■■■■■■■■■■■■■■■■
【保有資産評価】
取引余力 9,077,981 円
株式評価額 28,488,000 円
資産評価額 37,565,981 円
【ポートフォリオ】
銘柄名(コード)| 保有日数(取得日)| 株数| 取得株価| 現在株価| 評価額| 評価損益
---------------+-----------------+---------+-----------+-----------+-----------+--------------------
積水ハウ(1928)| 0日(2005/08/31)| 1000| 1,195| 1,199| 1,199,000| 4,000 (0.3%)
キリンビ(2503)| 0日(2005/08/31)| 1000| 1,097| 1,115| 1,115,000| 18,000 (1.6%)
JT(2914)| 0日(2005/08/31)| 1| 318,000| 318,000| 318,000| 0 (0.0%)
東レ(3402)| 0日(2005/08/31)| 1000| 505| 508| 508,000| 3,000 (0.6%)
信越化学(4063)| 0日(2005/08/31)| 100| 4,420| 4,450| 445,000| 3,000 (0.7%)
:
:
【注文結果】
現物 成行 即時 1928 0 -1000 株
現物 成行 即時 2503 0 -1000 株
現物 成行 即時 2914 0 -1 株
現物 成行 即時 3402 0 -1000 株
現物 成行 即時 4063 0 -100 株
:
:
■■ 2005/08/31 12:30 (水) ■ 注文処理終了 ■■■■■■■■■■■■■■■■■■■■■■■■■■■■
|
これは 2005/08/31
の午後、つまり処理期間中の最後の注文処理を行ったときの内容になります。実際にはこの前に約1年分の注文処理内容がずっと記録されています(おそらく最初の方はスクロールアウトして出力バッファにも残っていないはずです)。
この結果を見ると、(約1年間の売買を繰り返した結果)2005/08/31 11:30
の時点で、保有資産は取引余力として約 908 万円余っています。また株式資産を約 2849
万円分所有しており、合計の資産評価額は約 3757
万円になっていることが分かります。 またこの時点でのポートフォリオの一覧が表示されており、取得株価や評価額、損益などが個別に分かります。 更にこのタイミングでこれらポートフォリオを全て決済するような成行注文が出されていることもわかります。これよりも前の出力結果を見ると分かりますが、DwRobot01
はこのような処理を毎半場ごとにひたすらずっと繰り返して実行していました。その結果が・・・というわけです。
なお、今回は 2004/09/01 から 2005/08/31 までの期間データを使い、元金 5000
万円を持った状態から動作させましたが、これらの期間や元金の数値等は robot-config.xml
内で指定することで変更できます。再度 Eclipse の画面に戻り、パッケージエクスプローラ内の
robot-config.xml をダブルクリックすると、以下のような箇所が見つかるはずです:
:
:
<robot-class-name>SampleRobot</robot-class-name>
<time>
<start>2004-09-01</start>
<end>2005-08-31</end>
</time>
<asset>50000000</asset>
<each-stock-limit>10</each-stock-limit>
<short-trade>true</short-trade>
<data>data50</data>
<user-log>
<console level="5" />
<file level="0" path="log.txt" />
<database level="0" />
</user-log>
<system-log>true</system-log>
<config-confirmation>false</config-confirmation>
<overwrite>true</overwrite>
</robot-config> |
ここを例えば、
<time>
<start>2005-01-01</start>
<end>2005-06-30</end>
</time>
<asset>10000000</asset>
と書き換えて再度ロボットを起動すると、元金 1000 万円を持った状態で 2005/01/01 から
2005/06/30
までの間動作する、というシミュレーションが実行されることになります。他のパラメータにも色々意味はありますが、それらはおいおい説明していくつもりです。まずはこれらの値を適宜変更して動作を試してみてください。
ちなみにカブロボ SDK に付属する検証用データでは 2004年1月5日から
2006年12月29日までの株価データが含まれています。カブロボ SDK
を使ってこれらの期間内で動作検証を行うことができます。またスーパー・カブロボ・コンテスト本戦においては、このパラメータに実際の(コンテスト期間中の)日付が設定されて、実際の株価を使って動作することになります。
弐号機では
結果的にはただの乱暴者だった初号機 DwRobot01
ですが、「株を買う」操作と「決済する」操作によってとりあえず株式市場で存在感(?)を見せてくれました。次回はやたらに注文するのではなく、「上がりそうな株を選んで買う」、「下がりそうな株を選んで決済する」というインテリジェンスを加えたカブロボを作りながらそのロジックを紹介してみるつもりです。
著者について  | |  | 木村 桂: 日本IBM ソフトウェア事業 |
記事の評価
|