<株進捗>8/20-21 株学習の準備2

目次

  1. 学習させる株データの作成
  2. その他

1.学習させる株データの作成

以下の流れのうち赤文字部分の実装を行いました。

  1. [学習フェーズ]以下を指定し、AIに株の値動きを学習させる。
    • 翌営業日の株価を予想するために取り込むデータ数(例:100日分を取り込み次の1日の株価を予想)
    • 各種パラメータ(隠れ層の数(2次元)、学習率、分類器、学習回数)
    • 学習対象データの絞り込み(例:指定した銘柄の値動きと相関が高いものだけを学習データとする)
  2. [学習フェーズ]学習済モデル(いわゆるAI)ができる
  3. [売買フェーズ]以下を指定する
    • [学習フェーズ]でできた学習モデル
    • 適用する売買アルゴリズム(例:予想が10%以上上がっていれば買い)
    • 適用する資産管理ルール(例:総資産の10%は現金として保有する)
    • 売買対象の銘柄
    • 売買開始時期
    • 売買日数
  4. [売買フェーズ]売買プログラムを走らせる
  5. [売買フェーズ]以下のような結果が出力される
    • 売買履歴
    • 最終的な利益
    • (売買履歴をグラフ化したもの)…余裕があれば作りたいです。

以下の2つの仮説を検証すべく、プログラムの改修を行い完了しました。

目標達成の仮説1:学習データを「100銘柄の100日分」とする。
目標達成の仮説2:過去100日のデータから、未来30日分の株価の「最大値」「最小値」を予想する→予想した最大値が、現在価格より10%以上であれば売り注文を出す。

2.その他

・昨日、ブログの更新もしていないのに78アクセス。いつもは10アクセスくらいなのに…

・残タスクは以下のとおりです。

f:id:kurupical:20170822090554p:plain:w600

取り急ぎ#2、#4、#14、#26を片付ければ、トレードのシュミレーションができるはずです。
だいたいのタスクはすぐ完了するのですが、#2がかなりの強敵です…。

・以下にソースコード公開しています。
github.com

<株進捗>8/19 株学習の準備

目次

  1. 株学習データの作成
  2. その他

1.株学習

以下の流れのうち赤文字部分の実装を行いました。

  1. [学習フェーズ]以下を指定し、AIに株の値動きを学習させる。
    • 翌営業日の株価を予想するために取り込むデータ数(例:100日分を取り込み次の1日の株価を予想)
    • 各種パラメータ(隠れ層の数(2次元)、学習率、分類器、学習回数)
    • 学習対象データの絞り込み(例:指定した銘柄の値動きと相関が高いものだけを学習データとする)
  2. [学習フェーズ]学習済モデル(いわゆるAI)ができる
  3. [売買フェーズ]以下を指定する
    • [学習フェーズ]でできた学習モデル
    • 適用する売買アルゴリズム(例:予想が10%以上上がっていれば買い)
    • 適用する資産管理ルール(例:総資産の10%は現金として保有する)
    • 売買対象の銘柄
    • 売買開始時期
    • 売買日数
  4. [売買フェーズ]売買プログラムを走らせる
  5. [売買フェーズ]以下のような結果が出力される
    • 売買履歴
    • 最終的な利益
    • (売買履歴をグラフ化したもの)…余裕があれば作りたいです。

具体的には、昨日に立てた仮説1を検証するための準備を行いました。

目標達成の仮説1:学習データを「100銘柄の100日分」とする。

100銘柄の100日分のデータを学習して、1銘柄の未来の株価を予想するということ、理屈上はできそうなのですが、データが多いのでリソースが足りるのか?ちゃんと学習は収束するのか?など不安は沢山です…。
明日以降は仮説1にあわせた学習プログラムを作ってみて、学習させてみてどうなるか、見てみようと思います。 しばらくはプログラムの改修記録という地味な記事が続きますが、学習プログラムができたら取引結果を公開したいとおもいます。

2.その他

以下にソースコード公開しています。
github.com

<株進捗>8/18 データ学習方法の改良

目次

  1. リファクタリング作業内容の整理
  2. データ学習方法の改良
  3. その他

1.リファクタリング作業内容の整理

コメダにこもって考えました。
f:id:kurupical:20170818225455p:plain

2.データ学習方法の改良

今日は以下の赤文字部分の改良をしました。

  1. [学習フェーズ]以下を指定し、AIに株の値動きを学習させる。
    • 翌営業日の株価を予想するために取り込むデータ数(例:100日分を取り込み次の1日の株価を予想)
    • 各種パラメータ(隠れ層の数(2次元)、学習率、分類器、学習回数)
    • 学習対象データの絞り込み(例:指定した銘柄の値動きと相関が高いものだけを学習データとする)
  2. [学習フェーズ]学習済モデル(いわゆるAI)ができる
  3. [売買フェーズ]以下を指定する
    • [学習フェーズ]でできた学習モデル
    • 適用する売買アルゴリズム(例:予想が10%以上上がっていれば買い)
    • 適用する資産管理ルール(例:総資産の10%は現金として保有する)
    • 売買対象の銘柄
    • 売買開始時期
    • 売買日数
  4. [売買フェーズ]売買プログラムを走らせる
  5. [売買フェーズ]以下のような結果が出力される
    • 売買履歴
    • 最終的な利益
    • (売買履歴をグラフ化したもの)…余裕があれば作りたいです。

学習の仕方は現在1つで。「過去100日分を取り込み、次の1日の株価を予想。」
指定した過去100日分の株価だけで予想できるほど単純ではないと思っています。
また、学習モデルに30日先を予想しようとすれば

①1日〜100日               → 101日目の株価を予想
②2日〜100日+予想した101日        → 102日目の株価を予想
③3日〜100日+予想した101〜102日     → 103日目の株価を予想



㉚30日〜100日+予想した101〜129日     → 130日目の株価を予想

上記のようになり、日が進めば進むほど、「取込データのうち学習モデルが予想したデータ」の割合が高くなり、先になればなるほど精度が悪くなるのは目に見えていました。
ということで、どうすればよいか考察しました。

まずは、成果目標の見直し。

目標:年利10%

そのうえで、2つの仮説を立てました。

目標達成の仮説1:学習データを「100銘柄の100日分」とする。
(※100日分、100銘柄の各値は要チューニング)
これまでは学習データとして1銘柄の100日分を用意していましたが、これではデータ不足であると思っています。ということで、学習に使うデータをもっと増やして、精度が高くなるか確かめます。
参考:
qiita.com
この記事では、28つの為替レートを学習データとして、1つの為替レートを予想しています。
※RNNではなく、ベーシックなNNを使っています。

目標達成の仮説2:過去100日のデータから、未来30日分の株価の「最大値」「最小値」を予想する→予想した最大値が、現在価格より10%以上であれば売り注文を出す。
(※100日、未来30日、10%は各値は要チューニング)
次に…そもそも、成果目標は「株価を予想すること」ではなく、年利10%を実現することです。
ですので、キレイに未来のチャートの形を予想することは絶対ではないです。
値動きの幅さえわかれば売買は可能でしょう。

この2つを実装する(+将来的に他の仮説を検証する)ためには、1.で挙げたソースのリファクタリング(機能単位に分割)が必須です。今のソースだとかなりテストがし辛いです。

3.その他

ソースコードは以下で公開しています。
github.com
・またDeepLearningのところに戻ってこれて、テンションあがってきました。
・Qiitaとかに書き込みしている人は、どれくらいの時間で完成させているのか気になります。1記事でキレイにまとめあげているので…

<株進捗>8/17 資産管理クラスの作成完了。株売買プログラム骨組み完成!

目次

  1. 資産管理クラスの作成
  2. 骨組み完成
  3. 今後の予定

1.資産管理クラスの作成

株を買う判断をする前に、そもそも資産の面(主にリスク)でこの株を買っていいのか?を判断する機能の実装です。 赤字部分を作成しました。

・総資産の10%は現金を保有すること。
・1つの銘柄に総資産の20%以上ぶっこまないこと。
・1つの銘柄を買った場合、そこから7日間は同じ銘柄を買わないこと。

正直、あと2つはすぐに作れると思うので、気晴らしに作ろうと思います。

2.骨組み完成!

学習〜売買プログラムの骨組みが完成しました。
これで、株価を学習→売買プログラムで売買テスト→結果の表示 ができるようになりました。
使い方をざっくり言うと…

  1. [学習フェーズ]以下を指定し、AIに株の値動きを学習させる。
    • 翌営業日の株価を予想するために取り込むデータ数(例:100日分を取り込み次の1日の株価を予想)
    • 各種パラメータ(隠れ層の数(2次元)、学習率、分類器、学習回数)
    • 学習対象データの絞り込み(例:指定した銘柄の値動きと相関が高いものだけを学習データとする)
  2. [学習フェーズ]学習済モデル(いわゆるAI)ができる
  3. [売買フェーズ]以下を指定する
    • [学習フェーズ]でできた学習モデル
    • 適用する売買アルゴリズム(例:予想が10%以上上がっていれば買い)
    • 適用する資産管理ルール(例:総資産の10%は現金として保有する)
    • 売買対象の銘柄
    • 売買開始時期
    • 売買日数
  4. [売買フェーズ]売買プログラムを走らせる
  5. [売買フェーズ]以下のような結果が出力される
    • 売買履歴
    • 最終的な利益
    • (売買履歴をグラフ化したもの)…余裕があれば作りたいです。

3.今後の予定

「とにかく一連の流れを作成し(なんとなく)動かす」ことを目標にやってきました。
次は今まで目をつぶっていた以下2点を行います。

  • 各フェーズの機能強化
    各フェーズがかなり荒削りです。[学習フェーズ]学習対象データの絞り込みの考え方が甘々だったり、[売買フェーズ]で指定する売買アルゴリズム・資産適用ルールがそれぞれ1個しか作られていなかったりと…。特に学習フェーズは大事なところなのでしっかり取り組んでいきます。
  • ソースのリファクタリング
    [学習フェーズ]は設計せずゴリゴリ作ったので、ソースコードが汚くテストがしづらい作りになってしまっています。このあたりも、学習のテストをしながら改善していきたいところです。

上記がある程度終われば、Webサイトを作成して株価予想を公開しようと思っています。
Webサイトを1から構築はRuby on Railsで写経しながらやった以来なので、これも楽しみです。
自分のやりたい「AIの勉強」とのバランスを考えつつ進めていきたいです。

<株進捗>8/16 売買成績の算出

目次

  1. 売買成績の算出
  2. 資産管理クラスの設計+ちょっと作成
  3. コミットログ

1.売買成績の算出(trade_test.py)

今日は以下の赤文字部分を実装しました。

①学習モデルを用意 (完了)
②学習モデルの読み込み (完了)
③現在日付の設定 (完了) →2017/1/1からスタート

 ★④〜⑦を、2017年度分データのすべてが読み込み終わるまで繰り返し
 ④現在日付から過去N日分のデータを基に、M日分の株価を予測 (完了)
 ⑤予測した株価を基に、売買の判定を行う(完了)
 ⑥(売買があった場合、株の購入記録を残す)(完了)
 ⑦現在日付を1日進める。(完了)
⑧売買の成績を算出する

実装して、銘柄1301を2017/1/3から30日間売買テストしました。
売買基準は以下の通り。
・過去100日のデータから、30営業日先までの株価を予想する
・30営業日までに「10%上がる」と予想している場合は翌営業日の初値で買い
(・指値、逆指値を設定していますがこの機能はまだ実装していません)
(持ち金100万円スタート)

30日後、保有している株の一覧は以下の通り
f:id:kurupical:20170817000113p:plain:w300
見にくいですが、「price」が買った値段、「date」が買った日です。
ご覧のとおり、毎日買い判断が出ているので、毎日購入しています。
1日目に「30営業日までに10%上がる」と予想するならば、2日目も状況が大きく変わらない場合は同様の予想をするはず。結果的に毎日「買え!買え!!」と命令され、爆買いします。

そして結果が以下の通り。
f:id:kurupical:20170817000200p:plain:w300
moneyが保有現金、total_profitが利益、total_assetが資産合計になっています。
moneyがマイナスになっています。

上記のように、無限に同じ株を買ってしまう・現金がマイナスになっても買ってしまう…等の問題を防ぐためには、「資産管理」の実装が必要です。

2.資産管理クラスの設計+ちょっと作成(AssetManager.py)

資産管理ルールをいくつか考えています。(一部は僕の投資ルールをそのまま適用しています)
・総資産の10%は現金を保有すること。
・1つの銘柄に総資産の20%以上ぶっこまないこと。
・1つの銘柄を買った場合、そこから7日間は同じ銘柄を買わないこと。
売買判断を行う前に、資産管理の面でこの株を買うのが適正であるかどうかを判定します。
すべての判定をクリアした場合のみ、株が購入できる仕組みにします。

3.コミットログ

今日はこれだけやりました。
f:id:kurupical:20170817001440p:plain:w300

その他

ソースコードは以下で公開しています。超ざっくりのReadmeも作りました。
もしよろしければご覧ください。アドバイス等も大歓迎です。
github.com

<株進捗>8/15 売買プログラムのテスト

目次

  1. 売買プログラム実装
  2. 売買プログラムのテストコード作成
  3. 雑感

1.売買プログラム実装(trade.py)

今日は以下の赤文字部分を実装しました。

①学習モデルを用意 (完了)
②学習モデルの読み込み (完了)
③現在日付の設定 (完了) →2017/1/1からスタート

 ★④〜⑦を、2017年度分データのすべてが読み込み終わるまで繰り返し
 ④現在日付から過去N日分のデータを基に、M日分の株価を予測 (完了)
 ⑤予測した株価を基に、売買の判定を行う
 ⑥(売買があった場合、株の購入記録を残す)
 ⑦現在日付を1日進める。

⑧売買の成績を算出する

設計ミスが少しあったので、一部書きなおしたりしつつ…。
売買履歴・保有している株の一覧などが出力できるようになりました。

2.売買プログラムのテストコード作成(test_trade.py)

テストコードを作成中です。
具体的には、予測可能な簡単な関数(1次関数、2次関数)を株価データとし、正しく予測に従って売買ができるかをテストするものです。 「設定ファイルを入力にして繰り返しテスト」ができるようにしました。
テストするたびにソースコードをいじりたくないので…。
テストはできるようになりましたが、結果の検証方法は設計がまだです。

3.雑感

・本質のディープラーニングから離れてしまっているので早く戻りたいのですが、プログラム作成は目に見えて出来上がっていくのが見えて楽しくて、なかなか戻れません。笑
学習データを60銘柄程度にすると、損失関数(ざっくり言うと学習の進捗を表すもの)がNanになってしまうという致命的なバグの修正が待っているので…
GitHubのissueでタスク管理をするようにしたのですが、これが結構やりやすいので続けてみようと思います。

GitHubソースコード公開しています。
今日は以下を修正しました。
(いつか、README的なドキュメント書かないと…)
trade.py
test_trade.py

github.com

<株進捗>8/14 売買アルゴリズムの作成

目次

  1. 売買アルゴリズムの作成
  2. GitHubを使いこなす(Issue管理)
  3. 雑感

1.売買アルゴリズムの作成

株売買のパフォーマンス計測ができるまでの流れを以下にまとめてみました。

①学習モデルを用意 (完了)
②学習モデルの読み込み (完了)
③現在日付の設定 (完了) →2017/1/1からスタート

 ★④〜⑦を、2017年度分データのすべてが読み込み終わるまで繰り返し
 ④現在日付から過去N日分のデータを基に、M日分の株価を予測 ←今日はここ
 ⑤予測した株価を基に、売買の判定を行う ←今日はここ
 ⑥(売買があった場合、株の購入記録を残す)
 ⑦現在日付を1日進める。

⑧売買の成績を算出する

売買の判定アルゴリズムをサンプルで1つ作成しました。端的にいうと以下の通りです。
「基準日の終値と、予測したM日分の終値の最大値を比較し、N%以上上がっていたら買い、N%以上下がっていれば売り」

アルゴリズムは複数種類作って、パフォーマンスを確かめたいと思っています。

2.GitHubを使いこなす(Issue管理)

今日は会社のスーパー同期とご飯に行きいろいろ話して(というか教えてもらって)、その中で参考になるところがあったので取り入れることにしました。
Issueでタスク管理し、GitHubのコミットはタスク単位でやることにします。
(今更感が半端ないですが…)
そうすることで、自分がやるべきタスクが見えやすいかなあと。

3.雑感

・お盆休みいろんな人と飲みに行ったのですが、「ブログみてるよ!」と言っていただき(特に同業者のかた)とてもモチベがあがりました。
・実績公開ということで、一連のプログラム実装が終わったらWebに予想を公開するプロジェクトも平行してやろうと思います。ちょっと前にかじったRailsを使って実装する予定です。