カブロボ・出陣。

あれだけ勇んでいたカブロボへの情熱もすっかり冷め、
年末年始に実家に帰ったときにじっくりやろうという考えも
こたつに入ったとたん、すっかり忘れた。

で、気づいたら11日の夕方。
最終締め切りも11日の24時。
もう時間ないじゃん。

でもまぁ、せっかくなので記念に参加を、と。
最後にいじったのは10月のはじめ頃だったはず。
適当に試していたコードをこれまた適当にくっつけて提出。

23時50分。
なんとかぎりぎりセーフかな。
1回もプレコンテストには参加しなかったし、
へなちょこ売買するだけだし、ほんとに記念だなぁ。

せっかく最初の頃はちょこちょこいじっていたんだから
もうすこし真面目にやればよかったかも。

| | コメント (0) | トラックバック (0)

BlueJ。

本屋さんで日経ソフトウェア1月号をみたら、
フリーのUMLツールを紹介する特集があって、
BlueJが8ページにわたって紹介されていた。

このBlueJは2ヶ月ほど前、JVM内部でのオブジェクトの状態を
ビジュアルに表示してくれるツールは無いかと探していたときに
見つけて以来、重宝している。

特にオブジェクトインスペクタがいい。
フィールドにどんな値が入っているかとか、
それがオブジェクトへの参照なのか、リテラルなのかが一目瞭然だ。

Java入門者には是非使ってもらいたいツールである。

デフォルトでは英語だが、
設定ファイルをほんのちょっと(2文字)変更すれば日本語化されるので
英語アレルギーの人にも安心だ。
(途中文字化けがあってもたぶん気のせいですw)

PC VIEW の記事も参考になります。

| | コメント (0) | トラックバック (0)

カブロボ・アップデート。

カブロボ運営者ブログによると

パッケージをアップデートしました (Javaプログラミングをされる方用)
以下の通り、kaburobo.zip をアップデートいたしました。
参加者向け情報の中級以上の方へ...からダウンロードしていただけます。

ver 1.1.1 変更履歴
・特定の条件で資金が極端な値になってしまう問題の修正
・MarketSchedule.checkScheduleが正常に動作していなかった問題の修正
・OrderResult.getDateで値が返されなかった問題の修正
・Holdingクラスに購入時金額の平均値を返すgetPriceメソッドの追加
・ルール見直しにともなう、デバッグ用証券会社の修正


だそうです。

早速kaburobo.jarとソースファイルを更新。

気づいた限りでは、この前書いた
SimpleStockOrderクラスのメソッドも使えるようになってました。

kaburobo_1_1.png

だったのが、

kaburobo_1_1.png

のように、
setQuantitiy、setQuantitiyByMoney,setQuantitiyByNumber,setUnitTypeメソッドが使用可能になってた。

でも、IndexInformationクラスのgetDate()メソッドはまだNullPointerExceptionがでるなぁ。
jp.kaburobo.information.StockMarketInformationクラスのgetKapix()メソッドもNullPointerException。
同じくStockMarketInformationのgetKaburobo()に至っては無くなった。
カブロボ平均株価もカブロボ40株指数はこのまま無くなってしまいそうだ。

この調子だとまだまだ出てきそうだなぁ。

う~ん、10月15日のプレコンテストは大丈夫かしら?

| | コメント (0) | トラックバック (0)

カブロボ・自分メモ。

注意

  • 1日1売買しか行えない!
  • 取引対象となる銘柄は、東証日経平均株価指数225銘柄中40銘柄(プレ・本大会で変わる)
  • 売り注文・買い注文いずれも成行と指値が可能
  • 手数料はかからない
  • 空売り可能!
  • コンテスト期間(1ヶ月)中は、2銘柄以上の購入が必要条件

成行・指値

  • 成行注文の場合はすべて終値の価格で売買が必ず成立する
  • 指値が一日の高値と安値の中に収まっていれば、売買が成立したことになる

例) ○月△日 始値:100円 高値:110円 安値:95円 終値:103円の場合
  • 成行 → 103円で売買成立
  • 指値(105円) → 105円で売買成立
  • 指値(115円) → 売買不成立

売買枚数・金額

  • 売買量は金額か株式枚数で指定することが可能
  • 最低取引金額以下の注文は受け付けない
  • 金額指定の場合は最大取引枚数を購入し、端数は戻さる
  • 取引可能残高以上の注文の場合、残高内で購入可能な株式枚数を購入する

例)  ○月△日 A株(売買単位:1000株)終値:103円 売買可能残高200000円の場合
  • 成行 A株1,000株 → 1,000株103,000円で売買成立
  • 成行 A株500株 → 売買単位以下で売買不成立
  • 成行 A株1,500株 → 1,000株103,000円で売買成立
  • 成行 A株200,000円 → 1,000株103,000円で売買成立

売り注文

  • 売り注文には「現物売り」と「空売り(信用取引)」の2種類がある
  • 現物売りは保有している株を売ること
  • 空売りでは株式を保有していなくても取引可能残高内で株式を売ることができる
  • 空売りをすると証券売却分だけ手持ち金は増えますが、手持ち金がロックされるので実質的に取引可能な取引可能残高は減少する
  • 空売りした分の証券を返済すれば、ロックは解除される

銘柄リスト表示


//銘柄リストの表示
Stock[] stocks = investmentAgent.getStocks(); // 銘柄リストの取得
System.out.println("証券コード:銘柄:業種");
for(int i=0;i<stocks.length;i++){
StringTokenizer st = new StringTokenizer(stocks[i].getName()," ");
String brand = st.nextToken();
String typeOfIndustry = st.nextToken();
System.out.print(stocks[i].getCode()); //証券コードの表示
System.out.print(":");
System.out.print(brand); //銘柄の表示
System.out.print(":");
System.out.println(typeOfIndustry); //業種の表示
}

StockクラスのtoStringメソッドによる表示は
Stock[銘柄コード,銘柄 業種]
(例)Stock[9766,コナミ 情報・通信業]




注文





Stock[] stocks = investmentAgent.getStocks(); // 銘柄リストの取得
SimpleStockOrder stockOrder = new SimpleStockOrder();

//買い注文(成行)
stockOrder.setStock(stocks[0]); // 注文の銘柄を設定
stockOrder.setTradeType(StockOrder.BUY); //買い注文
stockOrder.setLimitType(StockOrder.MARKET); //成行

// //売り注文(指値)
// stockOrder.setTradeType(StockOrder.SELL); //売り注文
// stockOrder.setLimitType(StockOrder.LIMIT); //指値
// stockOrder.setLimit(305); //指値を305円に設定

stockOrder.setQuantity(1); // 注文を1単位株に設定
investmentAgent.order(stockOrder); // 注文の発行


javadocを見る限り、SimpleStockOrderクラスでは数量だけでなく金額による注文も出来るはずなんだけど、
setUnitTypeメソッドやsetQuantityByNumberメソッドなどが使えない。
なんで??




銘柄指標データ





Stock[] stocks = investmentAgent.getStocks(); // 銘柄リストの取得
InformationManager infoManager = investmentAgent.getInformationManager();
Calendar date = Time.getTime(); // 直近の日付を取得

// 直近の日付から1日分の銘柄指標データを取得
List list = infoManager.getIndexInformation(stocks[0], date, -1);
IndexInformation index = (IndexInformation) list.get(0); // 一つ前のデータ

System.out.println(stocks[0]); //銘柄表示
System.out.println("売買単位の枚数:" + index.getTradingLotSize());
System.out.println("日付:" + index.getDate().getTime());
System.out.println("始値:" + index.getOpeningPrice());
System.out.println("終値:" + index.getClosingPrice());
System.out.println("高値:" + index.getHighPrice());
System.out.println("安値:" + index.getLowPrice());
System.out.println("出来高の枚数:" + index.getTurnover());
System.out.println("一株株主資本:" + index.getBps());
System.out.println("一株配当:" + index.getDividend());
System.out.println("配当利回り:" + index.getDividendYield());
System.out.println("EPS(一株利益):" + index.getEps());
System.out.println("PBR(株価純資産倍率):" + index.getPbr());
System.out.println("PER(株価収益率):" + index.getPer());
System.out.println("ROA(株価純資産倍率):" + index.getRoa());
System.out.println("ROE(株主資本利益率):" + index.getRoe());
System.out.println("年初来高値の日付:" + index.getYearsNewHighDate().getTime());
System.out.println("年初来高値:" + index.getYearsNewHighPrice());
System.out.println("年初来安値の日付:" + index.getYearsNewLowDate().getTime());
System.out.println("年初来安値:" + index.getYearsNewLowPrice());

IndexInformationクラスのgetDate()メソッドを使うとNullPointerExceptionが発生。
なんで!?


国内外証券市場データ


InformationManager infoManager = investmentAgent.getInformationManager();

// 直近の国内外証券市場データを取得
StockMarketInformation marketInfo = infoManager.getStockMarketInformation();
// System.out.println(marketInfo.getKabuRobo().getClosingPrice());//株ロボ40株価指数
// System.out.println(marketInfo.getKapix().getClosingPrice());//株ロボ平均株価
System.out.println(marketInfo.getNikkei225().getClosingPrice());//日経平均225
System.out.println(marketInfo.getTopix().getClosingPrice());//東証株価指数

カブロボ40株価指数とカブロボ平均株価(KAPIX?)が取得できない
うむぅ~


空売り(信用取引)

持ち株がない(足りない)状態で売り注文を出すだけ。 普通の売り注文と同じ。

移動平均乖離率


Stock[] stocks = investmentAgent.getStocks(); // 銘柄リストの取得

TechnicalAnalysisManager technical = investmentAgent.getTechnicalAnalysisManager();
InformationManager info = investmentAgent.getInformationManager();


// 25日分の銘柄指標データを取得
List indexList = info.getIndexInformation(stocks[0], Time.getTime(), -25);

// 配列に変換
IndexInformation[] index = (IndexInformation[])indexList.toArray(new IndexInformation[0]);

// 25日移動平均乖離率を取得
List cpList = technical.getConversionPremium(index, null, 25);

// 直近の移動平均乖離率を取得
ConversionPremium cp = (ConversionPremium)cpList.get(cpList.size()-1);

System.out.println("日付:" + cp.getDate().getTime());
System.out.println("移動平均乖離率:" + cp.getConversionPremium());
System.out.println("移動平均値:" + cp.getMovingAverage().getMovingAverage());
System.out.println("集計日数:" + cp.getMovingAverage().getDays());


3点チャージ

3点チャージ法による「買いシグナル」「売りシグナル」検出。
public void run(InvestmentAgent investmentAgent){ //分析日数 final int cpDma = 26; //移動平均乖離率 final int rsiDma = 14; //RSI final int vrDma = 25; //ボリュームレシオ Stock[] stocks = investmentAgent.getStocks(); // 銘柄リストの取得 for(int i=0; i<stocks.length;i++){ boolean cpBuySignal = false; boolean rsiBuySignal = false; boolean vrBuySignal = false; boolean cpSellSignal = false; boolean rsiSellSignal = false; boolean vrSellSignal = false; System.out.println(stocks[i]); double cp = getCP(investmentAgent,stocks[i],cpDma).getConversionPremium(); double rsi = getRSI(investmentAgent,stocks[i],rsiDma).getRsi(); double vr = getVR(investmentAgent,stocks[i],vrDma).getVR1(); System.out.print("移動平均乖離率 :" + cp); if(cp < (-15) ){ System.out.println("\t\t○"); cpBuySignal = true; }else if(cp >= 15){ System.out.println("\t\t☆"); cpSellSignal = true; }else{ System.out.println(); } System.out.print("相対力指数(RSI) :" + rsi); if(rsi < 25 ){ System.out.println("\t\t○"); rsiBuySignal = true; }else if(rsi >= 70){ System.out.println("\t\t☆"); rsiSellSignal = true; }else{ System.out.println(); } System.out.print("ボリュームレシオ:" + vr); if(vr < 70 ){ System.out.println("\t\t○"); vrBuySignal = true; }else if(vr >= 250){ System.out.println("\t\t☆"); vrSellSignal = true; }else{ System.out.println(); } // すべてに買いフラグが立ったら、買いシグナル if(cpBuySignal && rsiBuySignal && vrBuySignal){ System.out.println("\t\t\t\t***** 買いシグナル *****"); } // すべてに売りフラグが立ったら、売りシグナル if(cpSellSignal && rsiSellSignal && vrSellSignal){ System.out.println("\t\t\t\t***** 売りシグナル *****"); } } } public ConversionPremium getCP(InvestmentAgent investmentAgent,Stock stock, int dma){ TechnicalAnalysisManager technical = investmentAgent.getTechnicalAnalysisManager(); InformationManager info = investmentAgent.getInformationManager(); List indexList = info.getIndexInformation(stock, Time.getTime(), -dma); IndexInformation[] index = (IndexInformation[])indexList.toArray(new IndexInformation[0]); List cpList = technical.getConversionPremium(index, null, dma); return (ConversionPremium)cpList.get(cpList.size()-1); } public RSI getRSI(InvestmentAgent investmentAgent,Stock stock, int dma){ TechnicalAnalysisManager technical = investmentAgent.getTechnicalAnalysisManager(); InformationManager info = investmentAgent.getInformationManager(); List indexList = info.getIndexInformation(stock, Time.getTime(), -(dma+1)); IndexInformation[] index = (IndexInformation[])indexList.toArray(new IndexInformation[0]); List rsiList = technical.getRSI(index, null, dma); return (RSI)rsiList.get(rsiList.size()-1); } public VolumeRatio getVR(InvestmentAgent investmentAgent,Stock stock, int dma){ TechnicalAnalysisManager technical = investmentAgent.getTechnicalAnalysisManager(); InformationManager info = investmentAgent.getInformationManager(); List indexList = info.getIndexInformation(stock, Time.getTime(), -(dma+1)); IndexInformation[] index = (IndexInformation[])indexList.toArray(new IndexInformation[0]); List vrList = technical.getVolumeRatio(index, null, dma); return (VolumeRatio)vrList.get(vrList.size()-1); }

あってるのかどうかはわからない。
つーか、移動平均乖離率がめったに±10%超えないよ。
シグナルなかなかでない・・・・。

参考にしたページ 「3点チャージ投資法

| | コメント (0) | トラックバック (3)