テクニカル分析

http://kaburobo.jp/howto/makerobot.html#6

テクニカル分析は TechnicalAnalysisManagerクラスを使って行うことができます。
このクラスでは以下のテクニカル分析を行うことができます。
その他のテクニカル分析を行う場合は、自分で計算するコードを記述する必要があります。

移動平均

移動平均乖離率

ゴールデンクロス/デッドクロス

MACD

RSI 

ボリュームレシオ


直近のRSIでソートする例(長いな。。。)

public class TestRobot3 implements Robot{

    public void run(InvestmentAgent agent) {

        MyStockManager manager = new MyStockManager(agent);
        MyStock[] mystocks = manager.searchByLastRSI();
        
        for(int i=0; i<mystocks.length; i++){
            MyStock mystock = mystocks[i];
            System.out.println(
                    mystocks[i].getStock()
                    + "," + mystock.getLastRSIValue()
            );
        }
    }

    class MyStockManager{
        private InvestmentAgent agent;
        public MyStockManager(InvestmentAgent agent){
            this.agent = agent;
        }
        public MyStock[] searchByLastRSI(){
            Stock[] stocks = agent.getStocks();
            MyStock[] mystocks = new MyStock[stocks.length];
            for(int i=0; i<stocks.length; i++){
                mystocks[i] = new MyStock(agent, stocks[i]);
            }

            Arrays.sort(mystocks, new Comparator(){

                public int compare(Object o1, Object o2) {
                    double p1 = ((MyStock)o1).getLastRSIValue();
                    double p2 = ((MyStock)o2).getLastRSIValue();
                    if(p1 == p2){
                        return 0;
                    }else if(p1 < p2){
                        return -1;
                    }else{
                        return 1;
                    }
                }
            });
            return mystocks;
        }
    }
    
    class MyStock{
        private InvestmentAgent agent;
        private Stock stock;
        private RSI[] rsis;
        public MyStock(InvestmentAgent agent, Stock stock){
            this.agent = agent;
            this.stock = stock;
            calcRSI();
        }
                
        private void calcRSI(){
            Calendar time = Time.getTime(); 
            List infoList = agent.getInformationManager().getIndexInformation(stock, time, -20);//過去20日(適当な日数)
            PriceData[] infos = (PriceData[])infoList.toArray(new PriceData[0]);
            TechnicalAnalysisManager tech = agent.getTechnicalAnalysisManager();
            List rsiList = tech.getRSI(infos, "", 9);//9日RSI
            rsis = (RSI[])rsiList.toArray(new RSI[0]);
            
        }
        
        public Stock getStock(){
            return stock;
        }
        
        public double getLastRSIValue(){
            return rsis[rsis.length-1].getRsi();
        }
    }
}


TechnicalAnalysisManager#getXXXメソッドでは、PriceDataのtype(String型)を渡すメソッドが
ありますが、このtypeは通常の株価の実装IndexInformationの場合は、無視されるようです(何をわたしても一緒)。StockMarketInformationの場合、引数で日経の価格、ダウの価格など、いろいろ変わります。


参考:PriceDataインターフェイスのクラス階層
(Iはインターフェイス、Cはクラス)

(I)PriceData
   (C)ExchangeInformation
   (C)FutureInformation
   (I)StockPriceData
      (C)IndexInformation
      (C)StockMarketInformation


カブロボと直接関係はないですが、Listから配列への変換は、

List#toArray(ArrayType[])

メソッドが便利です。引数のArrayType[0]はちょっと奇妙に感じますが、
こういう風に書いておくと、ちょうどいいサイズの配列を返してくれます。


配列のソートは、

Arrays.sort(Object[], Comparator)

が利用できます。
引数にComparatorインターフェイス(の実装クラス)をわたします。