SONY Neural Network Consoleで日経平均株価をディープラーニング

今回のテーマは日経平均株価

こんにちは、cedroです。

前々回は、オリジナルの画像データセット(指原莉乃さん)を作ってディープラーニングをしました。

今回はオリジナルの数値データセットを作ってディープラーニングしたいと思います。

ずばりテーマは日経平均株価です。

将来の株価を予測をするためには、テクニカルとファンダメンタルの両側からの分析が必要ですが、ファンダメンタルを入れると変数が膨大になるため、今回はテクニカルだけに絞ります。

しかし、株投資歴4年の私から言わせて貰えば、テクニカル分析だけでも、結構予測できますよ。

自分の好きな時だけエントリーすれば良いという条件であれば、テクニカルだけでも7割くらいの精度で予測は出来るのではないかと思っています。

今回のディープラーニングは、1週間の株価チャートを見て翌週が、「下がる」、「小動き」、「上がる」の3つに分類させることにします。

「小動き」を入れたのは、相場が小動きの時に無理にエントリーしても、結局はチャラということが多いです。

なので、「小動き」の時は無理にエントリーせず、ここぞという時だけエントリーすべきだという考え方からです。

データを収集・加工する。

まず、Yahooファイナンスから、過去5年間の日経平均株価を取得します。

データは、始値、高値、安値、終値と4つありますが、使うのはシンプルに終値だけにします。

これにテクニカル要素として、5日移動平均(当日を含む過去5日間の終値の平均)、25日移動平均(当日を含む過去25日間の終値の平均)、75日の移動平均(当日を含む過去75日間の終値の平均)の3つを計算して加えます。

*この株価に、短・中・長期の移動平均線を加えたチャートというのが、テクニカル分析の基本中の基本で、私も良く使います。その内容は、ここでは説明しませんので、興味のある方は、ググってみてください。

この4つのデータを5日毎に区切って1週間分とします。

結果、1週間のデータは5行×4列となります。

 

これだけでは、各データの相互関係が分かり難いので、各データが前週の最終日の終値に対して何%乖離しているかを計算します。

上の表では、1月12日~1月18日までの20個のデータそれぞれを、1月11日の終値(8,448)に対して何%乖離しているか計算しています。

例えば、1月18日の終値の乖離率は、(8,551/8,448)-1=+1.22%となるわけです。

さらに、5年間の全データを確認すると、大体-10%~+10%(ー0.1~+0.1)の範囲に収まっていましたので、各データを10倍して、マニュアルの指示にあるように、おおむねー1.0~+1.0の中に納まるように調整しました。

数値データファイルの作り方

画像データの場合は、適当に切り取った後に、一括して同じピクセルサイズに縮小すれば良かった(指原莉乃をディープラーニングを参照)のですが、数値データはどうやって作るのでしょうか?

ネットで色々調べてみると、EXCELでは作れません(マクロを使うとできるみたいですが、私には無理です)。

これを解決する方法について、さらにネットで色々調べてみた結果、OpenOfficeのCalcを使うのが一番という結論に達しました。

OpenOfficeは、MicroSoft Officと同様なアプリケーションのセットで、Excelに該当するのがCalcという表計算ソフトです。

このCalcを使うと、SONY Neural Network Consoleで読める数値データファイルが作成できます。

しかも、なんと無料なんです。

このリンクからダウンロードして、インストールして下さい。

http://forest.watch.impress.co.jp/library/software/openoffice/

Calcは、ほとんどExcel互換ですので、データ収集の段階からCalcを使うのがおすすめです。

さて、Calcで加工したデータをどうやってSONY Neural Network Consoleが読める数値データにするかですが、

まず、ファイルー新規作成ー表計算ドキュメントをクリックし、新規ファイルを作成します。

1週間分のデータ(5行×4列)をコピーして、新規ファイルの1行A列のところを右クリックし、「形式を選択して貼り付け」を選びます。

すると、上記のポップアップメニューが出ますので、そのままOKを押します。

はい、5行×4列のデータが数値でコピーされました。

次に、ファイルー保存をクリックします。

すると、こんなポップアップメニューが出ます。

ファイル名は自分の好きなファイル名を入力(私は、b1と入力しました)。

ファイルの種類は、最初「ODF表計算ドキュメント(.ods)」が表示されていますが、ここを「テキストCSV(.csv)」に変更して、「保存」を押します。

そうすると、文字列選択画面になります。

最初「日本語(Windows-932)」が表示されていますが、ここを「Unicode(UTF-8)」に変更して、「保存」を押します。

これで、SONY Neural Network Consoleが読めるb1.scvという数値データファイルが出来ました。

データセットの作り方

過去5年間の週間データ(244個)を見て翌週が、下がる(ー2%以上)、小動き(±2%以内)、上がる(+2%以上)の3種類に分類します。

分類してみると、半分くらいは「小動き」で、「上がる」と「下がる」は少ないです。

3つのデータが均等に収集できるように、それぞれ60個×3=計180個のデータを選ぶことにし、数値データファイルを作成して、フォルダーに分けます。

stock0というフォルダーに、s1.csv~s60.csv という翌週下がる数値データファイルを格納します(sはsellの略のつもり)。

stock1というフォルダーに、k1.csv~k60.csv という翌週小動きの数値データファイルを格納します(kはkeepの略のつもり)。

stock2というフォルダーに、b1.csv~b60.csv という翌週上がる数値データファイルを格納します(bはbuyの略のつもり)。

画像データの場合は、これだけ用意すれば良かったのですが、数値データの場合は、学習用ファイルと評価用ファイルも自分で作る必要があります。

といっても、特に難しいわけではないです。

学習用ファイルや評価ファイルには、使用する数値データファイルの名前ラベルが書いてあるだけです。

ラベルというのは数値データファイルの種類を表すもので、今回は翌週が下がるは「0」、小動きは「1」、上がるは「2」というラベルを付けることにします。

これが、私が作った学習ファイルの一部です(評価ファイルも同様です)。

1行目は項目名。2行目は、フォルダーstock0にあるs1.csvファイルのラベルは「」ですと書いてあります。

こんな感じで、ラベルが「0」、「1」、「2」のファイルを同数書いておけばOKです。これもCalcで書いて下さいね。

今回データは全部で180個ですので、学習ファイルには144個(80%)、評価ファイルには36個(20%)振り分けて記載しました。

学習用ファイルは nikkei_train.csv、評価用ファイルは nikkei_test.csvというファイル名にしておきます。

そして、C:直下にSNNC30というフォルダーを作り、stock0フォルダー、stock1フォルダー、stock2フォルダーと、nikkei_train.csvnikkei_test.csv を格納しておきます。

ここまでできたら、いよいよSONY Neural Network Consoleの登場です。

データセットを読み込ませる

SONY Neural Network Consoleを起動したら、左側のDATASETタブをクリックします。そして、中央上の「Open Dataset」をクリックします。

先ほど、作ったSNNC30フォルダーを表示させ、nikkei_train.csvファイルを選択し、「開く」を押します。

はい、学習用データセットが読み込まれました。

右側の画像をみると、それぞれに、終値、5日、25日、75日の4つの線が並んでいるのが分かります。

評価用ファイル nikkei_test.csv も同様に、読み込ませます。

 

ニューラルネットワークの設計をする

PROJECT画面で、binary_connect_mnist_MLR.sdcprojを開きます。

今回は3分類ですので、ブロックの最後にS(Softmax)とC(CategoricalCrossEntropy)が付いているこのプロジェクトを流用します。

赤丸のボタンを押し、とりあえず nikkei_binary_connect_mnist_MLR.sdcproj というファイル名で、先ほどのSNNC30フォルダーにセーブします。

パラメーターについては、Inputを 1,28,28 → 5,4 に変更。

これは、モノクロ28×28ピクセルの画像から、5行×4列の数値データに変更したという意味です。

その他、2048と書いてあるところは全部とりあえず80に変更。後で、SONY Neural Network Consoleが自動最適化を行ってくれるので、適当です。

そして、DATASET画面にし、プロジェクトのTrainigデータセットを nikkei_train.csv に、Validationデータセットを nikkei_test.csv に入れ替えます。

一旦、セーブしておきます。

そして評価はどうなったか?

CONFIG画面にします。

MAX epochを100、Batch Sizeを18に変更し、Structure Searchのところの「Enable」をチェックして、学習ボタンを押し、自動最適化を開始します。

60回くらいトライさせ、評価をチェックした結果、最も良いニューラルネットワークの構成は、こんな形になりました。

そして、お待ちかねの評価結果は、

精度は47.22%です。

えー、何それ、全然ダメじゃんという感じですが、実践を考えるとそうでもないんです。

y:label=0のところを見ると、y’_0=6、y’_1=4、y’_2=2となっています。

これは、どういう意味になるかと言うと、翌週下がる場面が12回あったら、6回は下がると正解し、4回は小動きと間違え、2回は上がると間違える、ということです。

しかし、4回の小動きはエントリーしませんので、この分を除くと。8戦して6勝2敗で、勝率75%ということになります。まずまずではないでしょうか。

同様に、翌週上がる場面が12回あったら、6戦して4勝2敗で、勝率は67%です。これも、まあまあ。

小動きの場面が12回あると、3回下がると間違えて、2回上がると間違えています。しかし、小動きなので損益はほぼチャラか、損失があっても限定的でしょう。

当初思っていた、小動きの時はエントリーしないなら、テクニカルだけでも7割くらいの精度では予測できそうという直感に近い結果となりました。

まあ、データが180個とすごく少ないので、たまたまである可能性もありますが。

自らルールを見つけ出すのは本当に革新的な技術だ

今回、株価と移動平均線のチャートを読み込ませてディープラーニングさせた訳ですが、テクニカル分析のルールは何1つ教えていません。

しかし、あたかもテクニカル分析のルールを覚えたような結果を出して来る。

翌週の株価が「下がる」、「小動き」、「上がる」それぞれのチャートの中にルール(特徴量)を自ら見つけ出しているんでしょうね。

今さらながらですが、形だけを見てそこからルール(特徴量)を見つけ出すというのは、本当に革新的な技術だと思います。

チャート分析には様々なものがありますが、この分野はディープラーンングと相性が良さそです。

では、また。

4 件のコメント

  • こんちには。
    大変興味深く拝見させていただきました。
    お忙しいところ申し訳ありませんが、一つ質問させてください。
    今回の投稿は、日経平均の過去データを使いNNCに学習、ディープラーニングをさせると理解しています。
    そして、評価用データで検証したところ上記47%の正解率を得たと理解しています。
    そこで、今週のデータが出揃ったところで、実際に翌週エントリーするかどうかはどうやって判断するのでしょうか?
    例えばYラベルの無い今週のデータを、NNCに読み込ませてプログラムを走らせるような作業を行うのでしょうか?
    (データを読み込ませ走らせると、来週は「0」の下がるを表示してくるとか?)
    興味はあるのですが、まだNNCを触っていないので突拍子もないような質問で申し訳ございません。
    よろしくお願いいたします。

    • はしもとさんへ
      コメント大変ありがとうございます。
      はい、その通りです。
      今週のデータが出揃ったところで、実際に来週エントリーするかは、今週分だけのデータと評価ファイルを作成して、SONY Neural Network Consoleに登録します。
      このとき、yラベルは「2」にしておいて下さい(2にしておかないと表示範囲が0,1だけになってしまいます)。
      そして、学習済みのプロジェクトのValidationをこれと入れ替えて評価ボタンを押せば結果が出ます。
      ちなみに、今実際に今週分でやってみましたら、来週は「1」と出ました。つまり来週は「小動き」という予想です。
      今後とも、よろしくお願いします。

      • cedroさん、おはようございます。
        そして、早速のご回答ありがとうござます。
        私も、別データを用意し挑戦してみようと思います。
        8月にソニーがNNCを公開した際急に興味が湧き、コード作成が不要とは言いつつNNの基礎は学ぼうと初心者用の本を読んでいたところなのです。
        また、ネットで探しても画像を使ったレビューは沢山あったのですが、テキストデータを使ったものは殆どなく大変参考になりました。

        • はしもとさん、おはようございます。

          私もソニーのNNC紹介の動画を見た瞬間恋に落ちてしまいました(笑)。
          それ以降、週末はマニュアルとWebでの情報を元にNNCと戯れています。
          このブログは、私の試行錯誤の結果です。参考にして頂ければ、大変うれしいです。

          ソニーのNNCは、普通の人が使えるディープラーニングだと思っています。もっとWebで色々な情報があふれてくると良いですね。

          はしもとさんのオリジナルデータの結果が分かりましたら、ぜひ教えて下さい。
          今後とも、よろしくお願いします。

  • コメントを残す

    メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

    日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)