レベル: 中級 鳥海 不二夫, , OCSolutions
2006年 1月 13日 前回のコラムでは、カブロボコンテストの概要と、サンプルロボットの作り方、および最も簡単なカブロボの作成方法をお伝えしました。今回はカブロボを作る上での基本技術である、情報取得方法、売買注文の方法および、コンテストへのロボットの登録方法についてお伝えしていきます。
情報収集
カブロボ・コンテストがスタートして一ヶ月近くになりますが、みなさんのカブロボの調子はいかがでしょうか?筆者のロボットは、途中で一度チューンアップのため売買停止したため、今ひとつな成績です。残念。でもまだ後二ヶ月ありますから、これから巻き返してくれることを期待しています。
さて、前回のコラムでは、カブロボ・コンテストの概要と、サンプルロボットの作り方、および最も簡単なカブロボの作成方法をお伝えしました。 今回はカブロボを作る上での基本技術である、
および、
についてお伝えしていきます。
銘柄情報
さて、カブロボというからには株を売買しなければいけません。しかし売買するためには何を売買できるかが分からなければいけないわけで、銘柄情報を取得することが先決です。というわけで早速、売買可能銘柄の一覧を取得してみます。一覧を取得したいときは、InvestmentAgent#getStocksを使います。
では早速前回作ったFirstRobotのrunメソッドを書き換えて売買可能な銘柄一覧を取得してみましょう。
public void run(InvestmentAgent agent) {
Stock[] stocks = investmentAgent.getStocks();
for(int i = 0; i < stocks.length; i++){
System.out.println(stocks[i].getCode()+"\t"+stocks[i].getName());
}
}
|
では、早速実行してみましょう。
■1日目2005/04/01 金 終了時の所持金額
総資産 = 手持ち資金+所有株式時価総額 = 5,000,000円
手持ち資金(運転可能金額 + ロック金額) = 5,000,000円
運転可能金額 = 5,000,000円
ロック資金 = 0円
単純計算年率利益率 0.0%
○ロボットの銘柄評価
2001 日本粉
2261 明乳
2282 日ハム
2502 アサヒ
2503 キリン
2802 味の素
中略
9501 東電
9503 関西電
9531 東ガス
4689 ヤフー
9735 セコム
9737 CSKHD
実行時間: 0.3 秒.
以下略
|
と表示されれば成功です。第二回コンテストは日経225銘柄中100銘柄が取引可能ですので、ここにも100銘柄表示されたはずです。 このように、InvestmentAgent#getStocksは銘柄情報クラスStockの配列を返します。このStockは主に銘柄名と銘柄コードを結び付けているクラスです。このStockは各銘柄情報を取得するときや、値動きチャートを取得するとき、さらには株の売買をするときにも必ず使うことになりますので、Robot#runメソッドでは必ずInvestmentAgent#getStocksでStock配列を取得しておきましょう。 さて、Stock#getCodeで銘柄コードを、そしてStock#getNameを使って銘柄名を取得しています。ちなみに、なぜかカブロボSDK1.0ではStock#getNameで取得できる銘柄名の文字列に銘柄の後ろに業種名もついていましたが、2.0から業種名は書かれないようになりました。よかったよかった。 しかし、銘柄情報といって名前やコードが取得できたって、株の売買には何の役にも立ちません。そりゃ、最初からある特定の名前の企業を買うと決めていれば話は別ですが、それはなんとなくカブロボ・コンテストの趣旨とは違う気がします。まあ、愛社精神だしまくりで自分の勤めている会社だけは何があってもとりあえず買っておくというのもありかもしれませんが。ちょっとインサイダーくさいけど。 というわけで、もっと役立つ情報を取得してみましょうか。
株価指標情報
株価指標データといわれる、株の売買の目安となる指標が世の中には存在します。 例えば、実際の売上に対して株価が高いか低いかを判断する材料となるPERや、純資産に対して株価がどの程度かを示すPBR、もちろん株価の値動きも重要な情報となります。せっかくある指標です、使わないのはもったいないですよね。嬉しいことにカブロボSDKにはこれらの情報を簡単に取得する方法が用意されています。というわけで、早速これらの情報を取得してみましょう。
public class FirstRobot implements Robot {
public void run(InvestmentAgent investmentAgent) {
Stock stock = investmentAgent.getStocks()[0];
Calendar calendar = Time.getTime();
System.out.println(stock.getName());
InformationManager im = investmentAgent.getInformationManager();
IndexInformation indexInformation = im.getIndexInformation(stock);
System.out.println("一株株主資本:"+indexInformation.getBps());
System.out.println("配当利回り:"+indexInformation.getDividendYield() );
System.out.println("一株利益:"+indexInformation.getEps());
System.out.println("PER(株価収益率):"+indexInformation.getPer() );
System.out.println("PBR(株価純資産倍率):"+indexInformation.getPbr() );
System.out.println("ROA(総資産利益率):"+indexInformation.getRoa());
System.out.println("ROE(株主資本利益率):"+indexInformation.getRoe());
System.out.println("売買単位:"+indexInformation.getTradingLotSize());
System.out.println("前日の終値:"+indexInformation.getClosingPrice());
}
}
|
このソースで重要なのは、赤字の部分です。カブロボSDKでは、主だった情報を管理するクラスInformationManagerがあります。このクラスを利用して、
- 株価指標データ
- 各銘柄の業績データ
- 為替データ
- 国内外証券市場データ
等を取得することが出来ます。 今回は、各銘柄の株価指標データが欲しいので、IndexInformationを取得します。ここでは、直前のデータのみ取得していますが、数日分のデータを取得することも出来ます。それについては、チャートデータの取得でお送りしますので、しばしお待ちを。 さて、上記コードを実行すると、
■1日目2005/04/01 金 終了時の所持金額
総資産 = 手持ち資金+所有株式時価総額 = 5,000,000円
手持ち資金(運転可能金額 + ロック金額) = 5,000,000円
運転可能金額 = 5,000,000円
ロック資金 = 0円
単純計算年率利益率 0.0%
○ロボットの銘柄評価
日本粉
一株株主資本:543
配当利回り:1.46
一株利益:27.77
PER(株価収益率):17.72
PBR(株価純資産倍率):0.91
ROA(総資産利益率):5.74
ROE(株主資本利益率):2.67
売買単位:1000
前日の終値:478
|
こんな表示が出てきたと思います。株初心者には何のことだかよくわからない表示の連続かもしれませんが、わかる人には貴重な情報です。
たとえば、この銘柄のPERに着目してみましょう。PERとは、株価収益率で、「株価が一株当たりの売上の何倍か」を表しています。たとえば総株数100万株の企業の売上が1億円だったとします。このとき、一株あたりの売上は100円ですよね。で、もし株価が1000円だったとしたら、PERは1000/100=10となるわけです。一般にPERでは、株価が割高か割安かを計ることができるといわれています。PERが高ければ割高ですし、PERが低ければ割安です。 この銘柄のPERは17.72ですから、株価は一株あたりの売上の18倍近い値をつけているようですね。これを割高と見るか割安と見るかは難しいところです。一般に、同業種内の平均PERよりも高ければ割高、安ければ割高と判断することが多いようです。 なお、これらの数値の意味については、証券用語解説集 - 野村證券や松井証券 Q&A > 用語集などでご確認ください。 IndexInformationを利用することで、これ以外にも様々な情報を取得することが出来ます。詳しくはIndexInformationのドキュメントをご覧ください。
チャート取得
さて、先ほど銘柄株価指標の取得方法をお伝えしましたが、一日分のデータだけ取得できてもしょうがないですよね。とくに、株の値動きを見たい場合、直前の終値だけ取得できても何の意味もありません。ある程度まとまった期間の情報が必要です。 そんな時は、期間を指定してIndexInformationを取得します。
public class FirstRobot implements Robot {
public void run(InvestmentAgent investmentAgent) {
Stock stock = investmentAgent.getStocks()[0];
Calendar today = Time.getTime();
InformationManager im = investmentAgent.getInformationManager();
List iiList = im.getIndexInformation(stock, today, -10);
Iterator it = iiList.iterator();
while(it.hasNext()){
IndexInformation ii = (IndexInformation)it.next();
System.out.print(ii.getDate().get(Calendar.DATE)+"日:");
System.out.println(ii.getClosingPrice());
}
}
}
|
ここでのポイントは、
getIndexInformation(stock, today, -10); |
です。このメソッドは、today日から10取引日前までの銘柄指標データIndexInformationを格納したListを取得します。ちなみに、負の数字であれば、以前の情報を取得することが出来ますが、正の数字を入れるとその日より後の情報が取得できます。過去の日付から順を追ってデータを取得したい場合には正の数字を引数に入れましょう。ただし、どちらの場合にもデータはListの先頭から日付が古い順に格納されます。 最後に取得したすべてのIndexInfor
mationから各取引日の終値を表示しています。では、早速結果を見てみましょう。
■4日目2005/01/04 火 終了時の所持金額
総資産 = 手持ち資金+所有株式時価総額 = 5,000,000円
手持ち資金(運転可能金額 + ロック金額) = 5,000,000円
運転可能金額 = 5,000,000円
ロック資金 = 0円
単純計算年率利益率 0.0%
○ロボットの銘柄評価
17日:439
20日:435
21日:437
22日:445
24日:458
27日:464
28日:466
29日:476
30日:479
4日:478
|
無事10取引日前からのデータが取れているようです。これを利用すれば、自作のチャートを作ることも出来ますね。 もちろん終値だけではなく、始値、高値、安値、場合によってはPERの日々の変化を見ることだって出来ます。日々のPERの変化に何の意味があるかは分かりませんが。
以上、色々な情報の取得方法について見てきました。これらの情報を上手に使うことによって、買いたい銘柄、売りたい銘柄を決めるアルゴリズムを作ることこそが、カブロボ・コンテストの醍醐味です。是非、皆さんも独自のアルゴリズムで儲かる銘柄を探し出してみてください。 無事探し出せたら、いよいよ次は株の売買です。
売買
さて、銘柄情報から買うべき株が決まれば、次は注文を出さなければいけません。注文を出さなければ、ただの予想で終わってしまいます。予想がいくら当たっていたって、一銭も儲かりません。人間不思議なもので、予想が当たったのに株を買っていないと、本当は損をしていないのにもかかわらず、なぜか損した気分になって悔しい思いをしてしまいます。そんな悔しい目に遭わないようにも、ちゃんと注文して株を買っておきたいところです。
さて、注文を行うには、StockOrderクラスを使います。 StockOrderクラスは、注文表のようなものだと思って下さい。StockOrderに必要事項を記入の上、InvestmentAgentに発注すると、注文表にかかれている銘柄を購入してくれるという仕組みです。その注文表の書き方が少し複雑ですが、順を追って説明していきますので、ご安心を。 流れを始めに説明すると、
- 買い注文か売り注文か決定
- 指値注文か成り行き注文か決定
- 注文単位が金額か、株の単位数か決定
- 購入数を決定
- 注文銘柄を決定
となります。では、早速注文を出すプログラムを作成してみます。とりあえず、今回は簡単のため「初日に適当な銘柄を全財産を使って購入する」という戦略で注文してみましょう。
public class FirstRobot implements Robot {
public void run(InvestmentAgent investmentAgent) {
Stock[] stockArray=investmentAgent.getStocks();
Stock targetStock = stockArray[0]; //適当な銘柄を購入
long targetPrice = 5000000; //価格はど~んと500万円。
StockOrder order = new SimpleStockOrder();
order.setTradeType(StockOrder.BUY); //買い注文
order.setLimitType(StockOrder.LIMIT); //指値注文
order.setLimit(500); //指値を設定
order.setUnitType(StockOrder.MONEY); //金額単位に設定
order.setQuantity(targetPrice); //購入金額を設定
order.setStock(targetStock); //購入対象を設定
investmentAgent.order(order); //発注
}
}
|
先にプログラムの中身を見ていきましょう。お楽しみの結果はプログラムの解説が終わってからです。ワクワクしながら待っていてください。
StockOrder order = new SimpleStockOrder(); |
まず、注文表を作成します。注文表クラスはStockOrderであり、今回利用するのはシンプルな注文表SimpleStockOrderです。名前にはなんのひねりもありません。 ちなみに、SimpleStockOrderはStockOrderをimplementsしているだけなので、もっと複雑な注文をしたい方は、ComplexStockOrderとか適当にクラスを作ってStockOrderをimplementsすれば複雑な注文もこなせます。とはいえ、基本的にはこのSimpleStockOrderを使うだけで十分です。 さて、注文表を作ったら、早速注文を行いましょう。注文を行う場合、以下の事を決定しなければいけません。
- 買いか売りか
- 指値注文か成り行き注文か
- 金額単位の注文か、株数単位の注文か
- 購入対象
まずは買い注文か売り注文かを決定します。
order.setTradeType(StockOrder.BUY); //買い注文 |
今回は買い注文を出すので、引数がStockOrder.BUYですが、売り注文を出す場合は、引数をStockOrder.SELLに変更します。
order.setLimitType(StockOrder.LIMIT); //指値注文
order.setLimit(500); //指値を設定
|
次に、成り行き注文か指値注文かを決定します。今回は特に価格にこだわらず購入したいため、成り行き注文にしていますが、引数をStockOrder.MARKETにすれば、指値注文になります。 さて、指値注文をするときはSimpleOrder#setLimit指値の値段を設定しなければいけません。一方成り行きのときは、setLimitを設定してはいけません。setLimitを設定した場合、あらためてsetLimitType(StockOrder.MARKET)を行わない限り、自動的に指値注文となってしまいます。 なお、指値注文の場合は、次の日の株価が指値以下にならない場合、すなわち次の日の安値が指値以上の場合は購入を見送ることになります。いくらであっても確実に購入したい場合は、成り行き注文にしましょう。
次に、購入量を決定します。購入量は、
の好きなほうを選べます。今回は金額単位で購入しますので、targetPrice=500万円まで購入できるだけ購入します。
order.setUnitType(StockOrder.MONEY); //金額単位に設定
order.setQuantity(targetPrice); //購入金額を設定
|
もし、購入金額で一単位も購入できない場合は、購入を断念します。一方、株数単位で購入する場合、
order.setUnitType(StockOrder.NUMBER);
rder.setQuantity(1);
|
とします。 ただし、このとき注文は一株単位ではなく、一売買単位ということに注意しましょう。たとえば、売買が1000株単位で売買されている銘柄であれば、注文数1で1000株購入されることになります。もし売買単位が1000株の銘柄を1000単位注文すると100万株も購入することになってしまいます。一株1円だって買えません。そんなことのないように気をつけましょう。 ちなみに、今回注文している銘柄(日本粉)は1000株単位で売買されるので、この例だと1000株購入します。 なお、売買単位は、IndexInformation#getTradingLotSize()で取得可能ですので、あらかじめ確認しておくとよいかもしれません。
最後にどの銘柄を購入するかを決定します。
order.setStock(targetStock); //購入対象を決定 |
以上で注文準備は終了です。後は、この注文表をInvestmentAgentに渡します。
investmentAgent.order(order); //発注 |
これで発注が終わりました。 では、お待ちかねの結果です。じゃ~ん。
FirstRobot start
■1日目2005/05/01 日 終了時の所持金額
No Data
実行時間: 0.015 秒.
■2日目2005/05/02 月 終了時の所持金額
総資産 = 手持ち資金+所有株式時価総額 = 5,000,000円
手持ち資金(運転可能金額 + ロック金額) = 5,000,000円
運転可能金額 = 5,000,000円
ロック資金 = 0円
単純計算年率利益率 0.0%
○ロボットの銘柄評価
購入: 2001 日本粉 5000000pts 指値: 500
【注文処理結果】
銘柄名|銘柄コード| 枚数| 購入価格| 前日比
------------------------------+----------+----------+----------+----------
日本粉| 2001| 10000| 495| -3
【ポートフォリオ】
銘柄名|銘柄コード| 枚数| 購入価格| 前日比
------------------------------+----------+----------+----------+----------
日本粉| 2001| 10000| 495| -3
実行時間: 1.219 秒.
中略
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
【最終結果】
あなたのロボットによる、該当期間の運用成績は、こちらです。
総資産 = 手持ち資金+所有株式時価総額 = 4,930,000円
単純計算年率利益率 -25.0%
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
FirstRobot end
総実行時間:10.109 sec.
|
結論だけ見ますと、最終的な評価額は4,930,000円です。なんと、7万円のロスですね。とほほ。 ちなみに、詳細を見ますと、まず初日は取引がなかったので、次の日、2日目2005/05/02 に、日本粉の株を500万円分指値500円にて購入しようとしています。その結果、495円で1万株の購入に成功しました。 つまり、いきなり全額費やして日本粉株を買おうというカブロボ君の心意気は余すところなく達成されましたわけです。結果は大敗北ですが。
売り注文の場合も、StockOrder#setTradeTypeの引数をStockOrder.SELLに変更すれば他は同じです。もちろん、金額指定で売り注文を出すことも出来ます。 ただし、指値注文した場合は、株価が指値以上になった場合、つまり高値が指値以上の場合にしか注文が成立しないことに気をつけましょう。
以上で、購入方法についての説明は終わりです。最初に説明した銘柄情報を元に、売買銘柄を決定し、売買を行えば、立派なカブロボの完成です。 それでは最後に、注文についてまとめておきます。
| メソッド | 意味 | 引数 | 引数の意味 |
|---|
| setTradeType() | 買いか売りか | StockOrder.BUY | 買い注文 | | StockOrder.SELL | 売り注文 | | setLimitType() | 成り行きか指値か | StockOrder.LIMIT | 指値 | | StockOrder.MARKET | 成り行き | | setUnitType() | 購入単位 | StockOrder.MONEY | 金額単位 | | StockOrder.NUMBER | 株数単位 | | setQuantity() | 購入数 | long値 | 購入数 | | setStock() | Stock | Stock | 銘柄 | | setLimit() | 指値指定 | long値 | 指値 |
大会への登録
せっかく作ったカブロボです。大会に参加しないと意味がないですよね。というわけで、最後は自作ロボの大会サーバへの登録方法です。
ZIPファイルの作り方
自慢の自作カブロボをコンテストへ参加させるには、ソースコード一式をコンテスト主催者が指定する形式でまとめ上げ、提出する必要があります。具体的にはJavaで書かれたソースファイルをZIP形式で圧縮する必要があります。 ここでは、このZIPファイルの作り方をご紹介します。Eclipseを使っていれば比較的簡単に作成可能ですので、サクサクっと作ってしまいましょう。
まず、プロジェクトで右クリック→エクスポートを選択します。次に、「ZIPファイル」を選び「次へ」をクリック。
図1. ZIPファイルの作成
目的のプロジェクトにチェックを入れて、「宛先ZIPファイル」で適当なフォルダに好きな名前で保存してください。ここでは、C:\kaburobo.zipとしておきます。
図2 プロジェクトの選択
このとき、かならずソースコードのみがZIPファイルに含まれるように注意します。それから、
- 「ZIPフォーマットで保管」を選択
- ZIPとして圧縮するファイルをソースファイルに限定します。
この例ですと、プロジェクト直下にあるjavaファイルを選択します。
- オプションの「選択したディレクトリのみ作成」を選択します。
これで準備完了。 ここで、終了ボタンを押せばもうZIPファイルの完成です。この例ですと、C:\にkaburobo.zipというファイルが出来ているはずです。
ロボットの登録
zipファイルを確認したら、カブロボ・コンテストのページへ行き、ログインします。 管理ページから「ロボットの設定・コンテストへの参加」へ移動し、まだ未設定のロボットの「設定」を選択します。 次に、ロボット設定ページの一番下にある「★自作ロボット」の登録をクリックします。
図3 設定ページ
ここで、「送信するファイル」で先ほど作ったZIPファイルを選択します。今回の場合は、C:\kaburobo.zipを選択します。 ロボットのクラスは、Robotをimplementsしたクラスのパッケージを含めた名前を書きます。ここで書き間違えると、ロボットが正しく動かないので注意しましょう。この例ですと、パッケージ無しで「FirstRobot」を指定しています。 最後にソースファイルのエンコーディングを指定しましょう。Windowsなら、大抵Shift-JISになると思います。
さて、ここまでやれば、後は送信ボタンを押すだけです。 「ロボットの登録が完了しました」と表示されればアップロード成功です。 もし、ここでコンパイルエラーが表示された場合は、登録失敗です。Java5の機能を使っていないか、コンパイルエラーがないかどうかなど、確認してみてください。
大会への参戦
ロボットの登録が終了したら、大会に参加しましょう。 「ロボット一覧」ページへ移動し、先ほど登録したロボットがあることを確認してください。きちんと登録してあれば、
| ロボット1 | 自作ロボット | 停止中 | 設定 | 試運転 | このロボットで大会に参加する | | ロボット2 | 未設定 | 停止中 | 設定 | ― | ― | | ロボット3 | 未設定 | 停止中 | 設定 | ― | ― | | ロボット4 | 未設定 | 停止中 | 設定 | ― | ― | | ロボット5 | 未設定 | 停止中 | 設定 | ― | ― |
と表示されているはずです。 ここで、登録済みのロボットの「このロボットで大会に参加する」をクリックします。確認画面の後、このロボットが稼動を始めます。 ロボット一覧ページで、自作ロボットが「運営中」になっていることを確認しましょう。
さあ、これでコンテストの参加は終了です。後は、あなたのカブロボが取引する様子を毎日一喜一憂しながら見学しているだけです。もし、大儲けするようだったら大喜び。もし、大損するようだったら、本当の取引じゃなくて良かったと胸をなでおろしましょう。
次回予告
さて、次回は各種テクニカル分析を使って値上がりしそうな銘柄を探し出す方法についてお送りする予定です。 お楽しみに。
著者について  | |  | 鳥海不二夫さんは、書籍「株ロボを作ろう」の著者で、第1回大会にて6位入賞(自作ロボとしては第3位)の実績をお持ちです。 |
記事の評価
|