Gin04ghデータ分析業務、予測モデル開発などを担当しています。勉強してきた技術などを適当に書いていければと思います。Python、R、SAS、JavaScript、PHP、Rubyらへんが得意です。不労所得を目指します。やっては見たものの、結果として、エージェントの設計により、あまり面白くない結果になってしまった感が否めないため、「してみたかった」系タイトルです。今回は以下のアルゴリズムで、株価のデータから、システムトレードをするエージェントを学習させてみました。Replayこれらのアルゴリズムについては、以前、下記の記事でも紹介しました。Q-Network(DQN)を、やっぱり離散的な状態を返す簡単なゲームでなく、連続的な状態のゲームにも適用してみたいと思い、久しぶりにまた勉強しました。最近の深層強化学習の研究を見てみたところ...また、実装にはChainerを使いました。Chainerには、深層強化学習向けに派生したライブラリとして、ChainerRLもありますが、今回も勉強のため、自分で実装してみています。Dataset」を使いました。今回もKaggleのカーネルにも実装を公開しています。https://www.kaggle.com/itoeiji/deep-reinforcement-learning-on-stock-dataGitHubにも手法ごとに下記にまとめました。https://github.com/Gin04gh/datascience/tree/master/kaggle_dataset_huge_stock_market_dataset後述しますが、今回は可視化ライブラリにPlotlyを使っており、これの可視化結果はGitHub上では確認できません。必要なライブラリを読み込みます。iplot_mplinit_notebook_mode()可視化には、Plotlyを使ってみました。notebook上でも、グラフをマウスでぐりぐりと操作できるので、面白いです。興味のある人は、Kaggleのカーネルで遊んでみて下さい。追記(2018-04-15)Plotlyについてまとめた記事を公開しました。).push({});Plotlyというマウスでぐりぐりと動かせるようなインタラクティブなグラフを生成するライブラリがあります。notebook上で可視化して遊んだりしていますので、これについてまとめます。Python...今回扱うデータについて確認します。Datasetでは、データは銘柄ごとにファイルが分かれており、それぞれ日次の株価データが格納されています。試しに、今回は「Google」の株価データの中身を確認してみます。data.index.max())data.head()このデータを元に学習・評価をさせるため、データを学習期間と評価期間に分けます。date_split)次に、強化学習を行う上では環境が必要ですので、アルゴリズム化します。今回はまず試してみたいというレベルでしたので、下記のように非常に単純なケースを考えてみます。保持している株の数エージェントは、その日における建玉評価額を参照できるエージェントは、直近90日分の株価の増減値を参照できるこれらを元に環境クラスを下記のように作ってみます。done簡単なコードですので、十分に中身を追えると思います。過去90日分の株価の増減値をリストで格納していますので、観測される状態は長さが91のベクトルということになります。行動は、保持(何もしない)=0、買い=1、売り=2の行動数3で、売りを選択した場合に、その時の利益を報酬として受け取ります。用意していましたが、結局今回は最後まで取引させ続けてみるということで、特に使いませんでした。参考までに、少し適当に行動させて返却値を見てみると、以下のような感じです。np.random.randint(3)print(env.step(pact))実装DQN論文は下記になります。LearningDQNのアルゴリズムについて、以前の記事で紹介しておりますので、こちらを参照して下さい。Q-Network(DQN)を、やっぱり離散的な状態を返す簡単なゲームでなく、連続的な状態のゲームにも適用してみたいと思い、久しぶりにまた勉強しました。最近の深層強化学習の研究を見てみたところ...Chainerで実装した結果が下記のコードになります。total_rewardsこれを学習させてみて、エポックごとにロスと報酬がどのように推移していくか、確認してみます。関数を用いて行動させてみます。'DQN')毎日エージェントが何かしら行動をしますので、色を分けて行動を可視化させてみました。ローソク足の色が、グレーは「保持」(何もしなかった)、シアンは「買い」、マゼンタは「売り」を表しています。タイトル部分に、学習データ期間と評価データ期間で分けて成績を書いています。報酬の「+1」や「-1」を繰り返し取得した後の合計となります。実際の株価の価格で最終的な損益価格を表しています。評価データでは最終的にプラスの利益を出していますが、何かあまり、意味のある行動を学習したようには見えませんでした。DQN深層強化学習のアルゴリズムを改良してみます。論文は下記になります。DQNでの教師信号:実装は下記になります。loss.dataloss.backward()optimizer.update()とするだけで実現できます。学習をさせてみた結果は下記になります。利益を出すようになりました。この時点で「あ」と思ってしまいます。「これは、とりあえず買っておいて、評価がプラスになったら売るというのを繰り返しているだけじゃ...」そう考えると、エージェントの設計から、そりゃそう行動するように学習してしまうよな、と余計に感じてしまいましたが、ひとまず次のアルゴリズムに行ってみます。DQN論文は下記になります。関数の更新は、1回につき、1つの行動に対してのみ更新するようになっていました。分解して学習させることで、状態価値観数については毎回更新できることで、結果として収束が早くなります。実装は下記になります。関数のみを上記のようにごっそり変更すればOKです。用意するレイヤーについては問題ないと思いますが、順伝播のところで、上記の論文の数式を実行するように色々とやっています。学習をさせてみましたところ、とにかく買いまくって上がったら売るを永遠と繰り返しています。シミュレーションの設計をちゃんとやるべきであったなーと反省です。アルゴリズムの勉強をしたく、最後までやっちゃいます。Replay論文は下記になります。Replayでは、経験からランダムに選んで学習してきています。そこで、より学習に役立つ経験を優先して学習させたいというモチベーションが発生します。(パラメータの更新幅とみなせる)を用いて表して、経験サンプリングすることを考え、TD誤差の大きい経験を優先して学習させられるようにします。経験サンプリングに関しては若干ややこしいのですが、どうやら、TD誤差の大きい経験を降順に並べるバッチサイズ分、降順に並べた経験を区切るそれぞれの区間から適当に経験を選ぶということを考えるようです。実装は下記になります。若干成績が落ちましたが、変わらず、とりあえず買っておいて上がったら売るを繰り返しているようです。保持を選択しているのはなぜでしょうか。その他のデータでの結果これまでの感想通り、結果としては、ルールベース的な学習をしてしまったようでした。今回のGoogleの株価は、ずっと上昇傾向にありましたので、もしかしたらランダムな行動を取っても、割りと利益を出しそうな気もします。そこで、そうでない株価データも学習させてみた場合の様子についても、確認してみました。Twitter1つ目はTwitterの株価データです。