カブロボ

あぁ、もう卒研の終わりも近づいていると言うのに致命的な欠陥を発見

メインプログラムの売買メソッドにバグを発見。 一度株を購入すると、その株を全て売り切るまで新規で購入していないことに今更ながら気づく。 プログラムを見てみると、なぜかif(株を持っていない)新規買い注文;というわけのわからんことになっていた。 i…

やること追加

あたらしい状態を作成する(複数のテクニカル指標を組み合わせたものなど)。 報酬の与え方を見直す。 通常、行動を行って次の状態に移行した段階で学習は行われるのを、5日後に変更する 自分の資産増加を基準にした報酬を使えるレベルにする

複数のテクニカル指標を組み合わせた状態を作成する

大学の研究室で実験を繰り返し自動実行しているので、終わったところまでの結果を回収する 新しい状態クラスを作る(今は移動平均乖離率とRSIのみ) 複数のテクニカル指標を組み合わせた状態を作成する 1は保留で2は先ほど完了、なので3を今から作成する…

今日やること、そして今後やること

大学の研究室で実験を繰り返し自動実行しているので、終わったところまでの結果を回収する その結果を考察する 新しい状態クラスを作る(今は移動平均乖離率とRSIのみ) Rオシレーター 順位相関指数(RCI) ディレクショナル・ムーブメント(DMI) HLバンド …

初めてのjava.util.Properties、パラメータをコードに書くのは止め!

参考URL JavaでHello World プロパティファイル編 カブロボシステムで実験を行うにあたって、実験ごとに変更するパラメータの値をコードに直接書くのはいかがなものかと考えたので、外部ファイルから値を読み込むようにしました。 幸い、Javaにはそういうと…

今日やること

実験の設定をフィールドに持つクラスを作る そのクラスをいじるだけで、色々な実験が出来るようにする。 行動を「買う」「売る」の二つから、「買う」「待つ」「売る」の三つにした場合でも実験する。

状態RSIで報酬はtanh関数を用いた学習結果

強化学習の設定 強化学習方法:Actor-Critic 状態:RSI(相対力指数)を0〜100で1区切りずつ(計100個) 報酬:資産評価額の前日比を求めた値をxとし、tanh(1000*x)を報酬とする。 取引銘柄:新日本製鐵[5401] 取引期間 開始日: 2005-01-05 終了日: 2006-12…

細かい演算がうまくいかない

きのうは以下のコードで終了しましたが、まともな結果がでないなど色々いじっているうちに public double calcReward(double action, Stock stock) { double reward = 0.0; AssetManager am = AssetManager.getInstance(); TimeManager tm = TimeManager.get…

報酬の条件を資産評価額の増減によって判断させる

現在の報酬条件では、ある銘柄の購入価格(始値)と終値を比較し、実行した行動が「購入」、「売却」かによって変えている。 public double calcReward(double action, Stock stock, InformationManager im) { double reward = 0; //株の購入価格はその日の…

報酬がうまくいかない

シグモイド関数のような曲線を描く関数で、−1〜1までの値が得られるものはないかなと探していたらtanh関数が見つかったのでそれを利用したのだけれど、いつも同じ値が出てしまいまともに学習されない。 今日はもう遅いので、明日検証する。 public double …

適格度トレースは難しい

適格度トレースは良くわからんので、つま先でつついてはみるけど踏み込まないのが続いていました。がしかし、こんな感じに学習させたらいいんじゃない?と考えていたことが、適格度トレースに似ているようなのでちょっと真面目に読んでみました。 http://www…

Thread.sleep()を使ってカブロボを繰り返し実行できるかな?

「自動的にプログラムを繰り返し実行する」機能はUWSCで実現しましたが、もしかしてThread.sleep()を使えば出来るんじゃね?と思い以下のコードで実験してみた。 public static void main(String[] args) { String[] arg = { "-n", "RSIRobo2" }; for (int i…

RSI10刻み(状態数10)での学習結果

昨日寝る前に朝まで学習させようと思ったけれど、すぐに収束したので止めた結果のグラフ。 繰り返し4回目でBuy&Hold教に入信したらしく、総トレード数がほぼ1になっています。状態数を減らすとただでさえ酷い学習に磨きがかかりますね。ただ、資産評価額の…

2年間を218回繰り返した強化学習結果

大学に行っている間に上記の学習をさせていたので、その結果を書いておく 強化学習の設定 強化学習方法:Actor-Critic 状態:RSI(相対力指数)を0〜100で1区切りずつ(計100個) 報酬 買:買ったその日の終値が高ければ+1、そうでなければ-1 売:打ったその…

フリーソフトUWSCでプログラムの繰り返し自動実行

UWSC 上のソフトを使ってとりあえず10回繰り返してみました。スクリプトの記述はExcelのマクロっぽいですね。vbもこんな感じなのかな。 RunEclipse.uws ACW(GETID("Java - RSIRobo2.java - Eclipse SDK","SWT_Window0"),-4,-4,1288,1032,0) BTN(LEFT,DOWN,19…

今日は研究室集合の日

理系で卒業研究中なのに、週一回しか大学に行かないってのもおかしな話だよな。まあ家でプログラム組んでるほうがはかどるからいいんだけどね。今日は自動で繰り返し機能をつけたいと思います。 TODO 同じ期間の学習を繰り返すことが出来るようにする。(例…

13回実験を繰り返して学習を進めた結果

1回目の学習結果 終了時資産評価額:50331213 勝ちトレードの純損益%:1.7739999999999998 負けトレードの順損失%:-0.848 最大負けトレード%:-8.49056603773585 最大勝ちトレード%:11.838790931989925 勝率%:61.05263157894737 総トレード数:95 …

インスタンスの書き出し読み込みがうまくいった

うまくいっている模様。後は、実験を繰り返すごとに学習が進んでいることが確認できれば確信できるねぇ。

あまりに酷くて

//何枚マイナスしたかを数える int minus = 0; //注文株数が正しくなるように調整する while (orderQty > sumStockHold) { orderQty = orderQty + minus * stock.getUnit(); minus--; } //注文株数はactionに基づいているので、株数を減らした分action値も減…

昨日終わったはずのところで、バグが出た…

ここの37845, -1000株売却が原因だな…。5000株をちゃんと処理できてないのか。 【前場】ID:37845, 保有株数:1000 現物保有額:429000 5000株売ります 37845, -1000株売却 【後場】ID:37845, 保有株数:2000 【スクリーニング】ID:37845, 保有株数:2000

既にインスタンスを出力してるのかしていないのか

すでにインスタンスが保存されている場合とされていない場合で分けるために、フォルダの中にあるファイルの名前を調べる必要があるので、java.io.Fileを使用する。今まで使ったことがあるのは PrintWriter fout = new PrintWriter(new BufferedWriter(new Fi…

Serializableの実装

本日の題名に書いた機能をつけるため、今日も1日がんばろう。 この機能の実装にはJavaにあるjava.io.Serializableインターフェースを使う。Serializableは自分の持っている書籍での解説が皆無なので以下のサイトを参考にする。このインターフェースを実装す…

ちゃんと学習できました。明日からのTODOリスト

最後まで実行できました。ようやく次に進めます。 と言うわけでTODOリストで今後の予定を再確認します 売買最小単位株の単純売買ではなく、複雑な売買を出来るようにする 同じ期間の学習を繰り返すことが出来るようにする。エピソードの繰り返し(例:2005年…

↑「if文の条件文の不等号が間違えてた…」っていうのが間違えてた

そのままでよかった。 で、結局原因がわかりました。メソッド内でリストの先頭要素を取得&削除していたのに、そのあとメソッド呼び出しもとの方で、また先頭要素を呼び出していたためnullになっていた。 そして、それを直したプログラムを実行したらエラー…

ようやくわかってきた

if文の条件文の不等号が間違えてた…。 下が直したの public int subtractStockHold(Integer tradeID, Integer orderQty) { int stockHold = portfolioMemo.get(tradeID); if (stockHold > orderQty) { //stockHold < orderQtyになっていたのを修正。 } else …

while文内にはないとか言っておきながら、そこに原因が

【前場】ID:36721, 保有株数:1000 現物保有額:256000 2000株売ります 1:売却TradeID:36721 2:売却TradeID:36721 3:売却TradeID:36721 4:売却TradeID:null java.lang.NullPointerException at jp.tradesc.superkaburobo.sdk.trade.PortfolioManager.…

まだバグがとれませーん。今日中にこのバグは取りたいんだけどなー

調査範囲を変える。 いままでリストの中に入ってたのに、注文の段階になってnullになるのはなぜ 以下のif分岐内にあることは確かである。さらにwhile内はどうやら原因をもってないようなので、その前のif内を調べる。 else if (act[0] == Agent.SELL) { if (…

昼飯を食いに大学へ

下のメソッドを追加して出力したけど、よくわからん。バグとり終わらんので、軽い運動をかねて自転車で大学へ飯を食いに行く。 Enum型でswitch文を書こうとしたら、なぜかEclipseが拒否してきた。めんどくさいのでif文で書く public void printStockHold(ACM…

PortfolioMemoのバグとりを行う

java.lang.NullPointerExceptionになってるので、tradeIDリストの中身を適宜出力して、原因を突き止める