<為替分析>11/21 ディープラーニングで為替分析(2)

今日書くこと

  • 結果
  • 結果検証
  • 考え方
  • システム化

結果

以下の条件で行いました

  • 取引期間: 2013/1/1〜2017/11/1

結果ですが、正解率が56.8%となりました。

結果検証

今回はじきだした正解率56.8%は優位性があるのか、単なるマグレなのか、について考察します。

デタラメに上がるか下がるかを予想した時の正解率を計算すると、99%の確率で45.9%(597回)〜55.1%(702回)に収まります。
つまり、56.8%という数字は優位性のある数字と見て間違いないと思います。
また、今回ハイパーパラメータのチューニングはほぼ全くしていないため、オーバーフィッティングにはなっていないと思います。

cf.計算根拠:区間推定
2.3 区間推定/信頼区間

考え方

  • 入力データは、予想したい日から過去20日分の為替データ。具体的には以下の通り。
  • 出力は、「翌日上がるか下がるか」。(上がれば買い、下がれば売り)

システム化

まあまあ良い数字が出たと思っています。
ということで、実用化に向けて以下を行いたいと思っています。

  • 取引判断の自動化
    • 毎日自動でデータ取得し、取引を判断する。(1日1回)
  • 取引判断通知の自動化
    • 自分のSlackに通知する。
  • (最終的には)取引の自動化

今回は、AWSとSlackの疎通をやりました。

AWSから自分のSlackに通知を送るまで

まず、AWSを開設しました。
学習はせず推論のみをさせるので、一番しょぼいt2.microにしました。

次に、以下を参考にAWS上にプログラムをのっけました。
qiita.com

で、テストしてみる・・・。
f:id:kurupical:20171121185023p:plain:w400

うまくいきました!

今後

ディープラーニング界隈では、多分ディープラーニングよりもその周り(環境の構築など)のスキルが必要になってくると思うので、この際頑張ってこのシステムを完成させてみようと思います。
インフラ周りは、素人同然ですが・・・。

<為替分析>11/14 ディープラーニングで為替分析(1)

久しぶりのブログ更新です。
半月ほどブログをほったらかしにしていたのですが、毎日20アクセスくらい入ってくるのは嬉しいですね。

cartpoleも完成して、目標がなくなってしまい手が止まって半月。
ニートをこじらせてました。
このままだと社会復帰できなさそうなので、手頃なチャレンジをしてみようと思います。

サマリ

  • チャレンジ内容
  • 背景
  • 具体的にやること

チャレンジ内容

ディープラーニングで為替分析をやってみます。
AIで株をやることと比較すると、以下のような特徴がありそうです。

  • FXが優位
    • データが取りやすい。株はデータが整備されていない。(株式分割など)
    • 場代の割合が株と比べて少ない。
  • 株が優位
    • ライバルの数。株は個別銘柄で勝負するので小規模な銘柄はライバルが少ないですが、FXはそうはいかなさそうです。ドル円とか無理ゲーそう。

背景

以下記事を読み、僕もやってみたくなりました。
qiita.com

本記事の最後のシリーズでは、機械学習で正解率58%を達成しています。
(200強のサンプルで正解率58%は統計的に優位性があると言えます。過学習の可能性は否定できませんが)

記事の中で特に印象深かったのは

  • 移動平均線などのテクニカル指標を入力データにしていたこと

でした。
テクニカル指標自体に意味があるというより、投資家がテクニカル指標を見て投資判断をする以上、テクニカル指標は相場形成に意味をなすという考えでした。

具体的にやること

チュートリアルとして、以下データを単純なニューラルネットワークに通すプログラムを書いてみます。

データを見てみる

過去10年のドル円データを取得し、1日の値動き(前日始値〜当日始値)のヒストグラムを作ってみました
pythonで作れよって話ですが、Excelが簡単だったので楽してそっちで・・・)

f:id:kurupical:20171114233243p:plain

1日値動きの平均は0.5(50pips)程度です。
手数料(0.3〜0.4pips)を考慮すると、手数料の割合は1%弱。
カジノのルーレットのハウスエッジより良い数字だと思います!

<メモ>DeepLearning ニューラルネットワークのチューニング観点

これまで株価予測(RNN)、強化学習(DQN)、画像認識(DNN)と3つやってみました。

これまでの経験で、どのハイパーパラメータをチューニングすると効果があるのかメモしました。

※ほとんど主観と断片的な知識で語っているので、間違いがあればご指摘ください。

ニューラルネットワークのノード数と層の厚み

重要度: ★★★★★

層が多ければ多いほどよいというものではなく、問題の複雑さを考慮に入れて決めるのがよさそうです。

例えば、単純な画像認識(mnist/手書き数字文字。28x28pxの画像)では、ノード数100×2層よりノード数30×2層のほうが学習スピードが高かったです。

一方、強化学習(cartpole)ではノード数16×3層では学習が収束せず、ノード数100×3層で学習が収束しました。ノード数200×3層だと、収束しませんでした。

ノード数や層が多ければ多いほどニューラルネットワークの表現力が強くなります。
その分、過学習してしまうみたいです。
なので、簡単な事象はニューラルネットワークの層やノード数を少なくするのがよいかもしれません。

学習率

重要度: ★★★

論文に書いてある学習率をそのまま使えば、概ね大丈夫そうです。
あまりここをチューニングする意味はなさそうです。

ニューラルネットワークの重み・バイアスの初期値

重要度: ★★★

分類問題の場合は、何も考えず「標準正規分布(平均=0,標準偏差=1)」でよさそうです。

回帰問題の場合は、「出力層で出力される値」に応じて重み付けを初期化する必要がありそうです。

cartpole(強化学習、回帰問題)の場合、出力層は-1〜1の間を想定していました。
この場合に重みの初期値が「標準正規分布(平均=0,標準偏差=1)」だと、出力層は-1〜1の値に収束しません。(ニューラルネットワークは掛け算なので、層を重ねるごとに数字が大きくなるためです)
この場合は、1以上の値と1以下の値がバランスよく散らばるような値に初期化してあげるとよいと思います。
cartpole問題は、平均=0,標準偏差=0.1で初期化してうまくいきました。

損失関数

重要度: ★

ほぼ、誤差二乗和法が最強です。 分類器の場合はCrossEntropyかな?

その他

  • Batch Normalization
  • Dropout

などニューラルネットワークの学習を効率化させる方法は、あまり組み込んでいないので語れないです。恥ずかしながら…

<その他>10/24 Microsoft主催の「DeepLearningLab」に行ってきた

Deep Learning Lab コミュニティ イベント 第4回(オンライン配信あり!) - connpass

コレに行ってきました。
話は結構ビシネス寄りで、とても勉強になりました。

聞いたことを箇条書きで記事にしました。
(1.取ったメモ内の自分の考えは青文字で書いてます)

1.取ったメモ

1-1.ビシネス

  • AI導入時にエンジニアが経営者に質問すべきこと

    • 1.何を予測したいですか
    • 2.費用対効果はあいますか
    • 3.(持っているデータは)エクセルのカラムに落ちているなど、均一化されていますか
      課題:建物から劣化度を判定したい
      クリアするための画像が「画素数」「撮影時の距離」「天気」などがバラバラだと、(現状の技術では)分析できない。
    • 4.AI化しようとすることに対して、定量評価できていますか
      課題:人材評価をAIに判定させたい
      現在はどういう定量的なデータに基づいて人材を評価しているかを示してもらわないと分析できない。
  • AI導入の業務フロー

  • ソフトウェア工学の「機械学習版」が必要になってくる。 観点はおおよそ以下の通り

    • 再利用 (フレームワーク間の変換とか)
    • 品質の担保
      • メンテナンス性 「機械学習システムは、高金利クレジットだ」と言われる。
        従来の業務システムと比較して、将来的なメンテナンスが非常に大変。
        (1つ変えれば全部変わる。Change anything change everything)
      • 脆弱性
        停止標識にうまいことシールを貼ると、AIが「制限速度40km」標識と誤判定してしまう。
    • 要求の厳密化
      • 効用と安全性のバランスを定量的にする必要がある
        例)自動運転で絶対事故を起こさないAIを作ってくださいと言われたら、「動かないAI」を実装するしかない 例)「AIにコーヒー取ってきて」と指示すると、スタバで並んでる客を銃殺してコーヒーを取ってくるかもしれない
  • AIが導入されない理由=AIはブラックボックス。(なぜそう判断したのか、説明してくれない)
    ディープラーニングが注目した箇所を示すような仕組みを作った。ヒートマップなど

  • AI導入において一番必要大事なのは「データマネジメント」
    今あるデータでAI導入ではなく、これからAIを導入するためにどういう形でデータを集めるかをマネジメントする。

1-2.技術

  • 白黒映像をカラーにする ridge-i.com

  • 超解像
    16×16pxの画像を、32×32pxなど解像度を高くする技術。
    (防犯カメラから犯人の顔を割り出す、等で使えそう)

  • 機械学習をやってくれるプラットフォーム
    azure.microsoft.com

1-3.よもやま話

  • ディープラーニングに数学的素養はいらない!

    • 中高生に対して4時間で画像の識別器を実装する講習を実施、成功した。
    • 中高生でもできるのだから、ディープラーニングに数学的素養はいらない。
    • ニューラルネットワークは電卓みたいなもの。電卓の仕組みを知らなくても電卓は使いこなせる。
      →実感としては、数学的素養(微分積分線形代数)がなくても出来ると思います。ただ、チューニングするときに数学的素養がある人とない人だと、かかる時間に差がでるんじゃないかなと思っています。
      (今後、チューニングすら数学的素養が要らなくなる仕組みが出てくる可能性は否めません)

      「深層学習に必要なのは経験とセンス」
    • 深層強化学習のチューニングは、「ねずみに芸を仕込むのと一緒」ではないか。
      →深層強化学習(cartpole)のチューニングはハイパーパラメータや報酬をいじくり回す時間が多かったので、すごく共感しました。
  • 「AIで人の仕事が奪われる」ではなく、「AIが人手不足を助ける」という考え方を持っている。 (もちろん一定数の仕事はなくなる。車ができたら馬車がなくなったように。)

  • AIが過大評価されている。(何でも出来ると思っている経営者が多い)

2. 所感

  • 教育ビジネス AIの教育ビジネスが結構流行っているなと感じました。登壇していた企業のうち3分の1は何らかの教育ビジネスを持っていたように思います。
    www.kikagaku.co.jp

  • DeepLearningの技術的な参入障壁は低い DeepLearningは「数理的な素養がある程度必要」であるから技術者の参入障壁が高いと思っていたのですが、実はそうでもないのかも、と改めて実感しました。
    5ヶ月勉強してみて、「ある程度のDeepLearningのAI作るだけなら誰でもできるんじゃないか?」と薄々は感じていましたが、やっぱりそうですね。
    とくに、ニューラルネットワークは電卓だ」という言葉にしびれました。
    今は論文でどんどん新しいニューラルネットワーク(電卓)が出てきているので、それを如何にして見つけて使うか、というのがひとつ大事なことなのかもしれません。

  • AIが出てくることで新たに生まれる仕事、いろいろありそうです。

    • 教師データ作成の仕事(例:1億枚の画像を犬と猫に仕分ける)
    • AIの教育
    • AIコンサルタント
    • arxivにあるAI論文の和訳サービス(これめっちゃやってほしい)

    などなど…。

3.感想

  • 技術方向に行きたい!と思ってAI分野に突入した部分もあるのですが、結局「何に使うのか」を考えることが大事なのは変わらないですね。

  • インフラ面も少し勉強しないといけない気がしてきました。HadoopとDocker?
    麻雀してる場合じゃない。

  • 懇親会に行きました。
    宇宙飛行士の配偶者と北海道ドライブに行った話を聞いたのがめちゃくちゃ面白かったです。
    宇宙すげー。
    あと業界の闇が深い。

<メモ>ゼロから作るDeepLearningの章立て

本記事の目的

「DeepLearning初心者による初心者のための読書会」参加者に向けた記事です。
随時修正予定です。

本記事は、書籍「ゼロから作るDeepLearning」のアジェンダです。

書いてあること

  • 各章が終わると何ができるようになるか

※私自身は文系でDeepLearningの素人であるため、記載内容にあまり自信がありません。。間違い等あれば指摘いただけると幸いです。

更新履歴

  • 10/24 初版(「何ができるようになるか」を記載)

1章 Python入門

何ができるようになるか

  • DeepLearningを実装するために必要なPythonのライブラリが習得できます。

DeepLearningでは演算が大量に発生するため、数値計算を効率的に行うための拡張モジュールであるNumpyが必須です。

2章 パーセプトロン

何ができるようになるか

パーセプトロンニューラルネットワークの簡易版であるため、ここから勉強するとニューラルネットワークが理解しやすいです。

3章 ニューラルネットワーク

何ができるようになるか

4章 ニューラルネットワークの学習

何ができるようになるか

  • ニューラルネットワークの学習」により、(分類器*1)を実装できるようになります。その結果、手書き文字の分類ができるようになります。

この章まで終わると、自分で質の高いデータを集めさえすれば任意のデータを分類できます。
ただし、時間がすごくかかります。「数値微分」を用いてニューラルネットワークの演算するため、計算量が多くなるためです。
(より処理速度の早いニューラルネットワークの実装→5章で)
(より少ない回数で学習ができるニューラルネットワークの実装→6章で)

5章 誤差逆伝播

何ができるようになるか

4章では「数値微分」という考え方を用いてニューラルネットワークの学習を行っていましたが、5章は「誤差逆伝播法」という考え方に変わります。
誤差逆伝播法にはデメリットもありますが、処理速度の速さからこちらが主流だそうです。

6章 学習に関するテクニック

何ができるようになるか

7章 畳み込みニューラルネットワーク

  • 画像処理に特化した、より良いニューラルネットワークを実装することができます。
    (※私もちゃんと理解できていないです…)

8章 ディープラーニング

*1:入力データをグループ分けする。
(例)

  • 手書き文字の画像を入力データとし、その画像に書いてある数字が「0〜9」であるかを出力する。
  • 画像を入力データとし、その画像が「犬か猫か」を出力する。
  • 音声を入力データとし、その音声が「英語か日本語か」を出力する。
  • 過去30日分の株価を入力データとし、翌日の株価が「上がるか下がるか」を出力する。

  • <基礎学習>10/22 【完成】cartpole問題を強化学習で攻略する7 (+雑記)

    以下の記事の続きです。
    kurupical.hatenablog.com

    cartpoleについては、以下の記事を参照ください。
    kurupical.hatenablog.com

    1.やったこ

    Q-Tableの更新のされかたをデバッグしながら、Q-Tableが-1〜1の間に収まらなくなったらバグとみなしていろいろなパラメータをチューニングしていました。

    デバッグをするうちに1行明らかなバグを発見したので修正しました。

    そして動かしてみました。

    f:id:kurupical:20171022220614p:plain:w500 f:id:kurupical:20171022220623p:plain:w500 f:id:kurupical:20171022220619p:plain:w500

    3回やって3回とも、1000epoch以内に学習が完了(timestep>195)しました!
    (グラフが見づらいですが、右上のところで赤線が195を超えています)

    唐突なゲームクリアに唖然としました。
    クリア後も動かし続けると…
    f:id:kurupical:20171022221731p:plain:w500
    Q-Tableの値が発散(-1〜1の間にならない)し、再びアホになります。
    Q-Tableの出力値を制限することでうまくいくのかもしれません。
    (出力層の活性化関数にSigmoid関数を使うとか)

    僕の半分くらいの時間で学習が完了したという記事もあります(以下)が、もうこれでゲームクリアでいいでしょう。
    www.mochitam.com

    長い戦いでした。

    2.感想

    多分、途中で発見した2個のバグが学習できない原因のほとんどだったと思います。
    ですが、そのバグにたどり着くまでにかなり余計な回り道をしてしまいました。
    その余計な回り道が、結果的にかなり勉強になったのでよかったです。

    3.今後やりたいこと

    せっかくあと1ヶ月ニートなので…

    3-1.このチャレンジのまとめ

    1本の記事でまとめたいです。
    「DeepLearning/TensorFlowを知っている人が、DQNソースコードを書けるまで」 というテーマでsかね。

    3-2.AIや機械学習に関する知識

    AIや機械学習に関して、浅く深く知識をつけていきたいです。 ジャンルで言えば

    • 画像認識
    • 時系列分析
    • 強化学習

    はやりましたが

    は全然やっていないので、勉強したいです。

    あとは、機械学習といえばコレ!らしい本

    を読破したいです。(これはかなり厳しそうですが)

    3-3.AIや機械学習に必要な前提知識

    周辺知識が足りない気がしています。

    ココらへんの勉強もしてみたいです。
    特に統計学

    全部はできないので、優先順位をつけてやっていきたいですね。

    4.雑記

    4-1.GitHubソース公開

    GitHubにソース公開しています。 github.com

    4-2.誤差逆伝播vs遺伝アルゴリズム

    遺伝アルゴリズムについて、以下スライドで勉強しました。

    www.slideshare.net

    読んで思ったのが、DeepLearningの重み付け調整に、誤差逆伝播の代わりに遺伝アルゴリズム使ったらどうなるんだろう?ということです。
    だれか試してみてください。笑

    4-3.AlphaGoやばい

    ainow.ai

    AlphaGoは「プロ棋士の定石をベースにしてそこから強くしていく」のですが、AlphaGo Zeroは「自分対自分の対戦を繰り返すことで強くしていく」らしいです。
    AlphaGo Zeroはたった72時間学習しただけで、AlphaGoを超えたそうです。

    すごすぎます!
    ゲームにおける強化学習は、もはや人間の知見すら不要ということですね…。

    <基礎学習>10/19-20 cartpole問題を強化学習で攻略する6(+雑記)

    以下の記事の続きです。
    kurupical.hatenablog.com

    cartpoleについては、以下の記事を参照ください。
    kurupical.hatenablog.com

    考察

    Q-Tableをデバッグ→チューニング

    報酬を-1〜1にClippingしているのに、Q-Table(報酬の期待値)が-1〜1の間になっていません。
    誤差逆伝播しながらQ-Tableが修正されていくのかもしれませんが、最初の値が大きいのはよくなさそうです。
    TD誤差の式にargmax(Q(s',a'))が入っているので、Q-Tableの初期値がおかしいと誤差逆伝播も正しく動かない気がすします。

    ということで、ニューラルネットワークの重みの初期化をいろいろ試してみました。

    正規分布

    stddev=1.0(標準正規分布)だと、Q-Table(output)の初期値が大きくなる(-100〜100)。
    ので、stddevをチューニングした。

    # initial = tf.truncated_normal(shape, mean=0.0, stddev=1.0)
    initial = tf.truncated_normal(shape, mean=0.0, stddev=0.1)
    

    一様分布

    initial = tf.random_uniform(shape, minval=-1, maxval=1)
    

    重み付けを-1〜1にして4層のニューラルネットワークを組んでいるのに、何故か出力の絶対値が1を超えてしまうのが不思議。-1〜1の間のランダムな数字を掛け算して、1超えるってありえないですよね?
    biasはゼロで初期化してるので、余計な数字が足されていることもないはずです。

    Huber損失を導入

    学習の収束が早くなるみたいで。
    Huber損失 - Wikipedia

    結果

    学習の結果、ゲームクリアできました。
    しかし、同じ条件でもう一度学習させてみたがゲームクリアには至らず。
    重み付けの値がたまたま良かったためにゲームクリアに至っただけみたいでした。

    まぐれじゃなく、毎回ゲームクリアできるようになるまで、頑張ってみたいです。

    雑記:強化学習は人間味があって面白い

    強化学習で使われる「ε-greedy法」って、人間の「好奇心」モデルそのものだなあと思います。
    「εーgreedy法」とは、簡単に言うとAIがゲームを学習するときの方針決定のやり方です。

    ざっくり説明すると… AIがゲームを学習するとき、最初は何もわからないのでランダム動く確率(ε)は100%です。(ε=1.0)
    AIはランダムに動いていくなかで、最適な手段がわかってきます。AIは、学習の経過によりランダムに動く確率を減らして、すでに学習した最適な行動(greedy)を取るように調整をします。(例 : ε=1.0 - 0.0001 * 試行回数)
    最適な手段を取りつつも、そこが局所的な最適解である恐れがあるのでランダムに動いて更に良い解がないかを探っていきます。

    強化学習はこんな感じでAIがゲームを攻略していきます。

    これって人間の好奇心と似てませんか?

    例1)職場の近くのランチを探すとき
    最初は何が美味しいかわからないのでランダムな店に入ります(ε=1.0)が、ある程度わかってくると決まった店にしか行かなくなります(ε=0.0)。

    例2)赤ちゃんが大人になるまで
    最初はランダムに動きながら(レゴを食べたりするし、コンセントに針金を突っ込んだりする (ε=1.0)、大人になるまでには解を見つけて(それが最適解なのか局所的な解なのかは不明ですが)いつのまにか自分の脳内ネットワークで編み出した解に従ってのみ行動するようになります(ε=0.0)。

    僕のεは今いくつなんだろうな〜なんて思いながら過ごしています。
    今日はわざとεを上げて、店に入っても普段食べたことのないものを食べるようにしてみました。
    オムライスはケチャップじゃなくてミートソースを、コーヒーじゃなくて紅茶を選びました。
    オムライスは美味しかったのですが紅茶は失敗に終わりました。(やっぱり口にあわない)
    こうやって苦い経験やいい経験をしながら自分のなか最適解を見つけるとともにεが下がっていくんですね。

    とまあこんな感じで、強化学習はすごく人間味があって面白い分野だなと思います。
    こじつけが入ってるところもあると思いますが笑。

    雑記が長くなってしまいました。