<株進捗>8/23 株学習の準備(完了)、シュミレーション起動

目次

  1. 学習させる株データの作成(昨日の続き)
  2. シュミレーション実行!!
  3. 今後やりたいこと
  4. その他

1.学習させる株データの作成(昨日の続き)

昨日の記事(以下)の続きをやりました。

昨日まで以下の2つの仮説を検証すべく、学習フェーズのプログラムの改修を行っていました。

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

これでトレードシュミレーションできる・・・と思いきや。
上記改修により売買フェーズも改修が必要になりました。
そりゃそうですよね。

ということで、赤文字部分の改修を行っています。

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

結構時間がかかっていますが、今度こそコレが終わればトレードシュミレーションができるはずです。。

ごりごりと200行弱修正しました。
「複数銘柄から1銘柄を予想する」という考え方を受け入れる設計をしていなかったので、大変でした。
きっと試行錯誤するだろうからといろんなワガママを受け入れられるように設計したつもりでも、全然ダメですね。。

2.シュミレーション実行!!!

学習モデルも適当、予想する銘柄も適当ですが、とりあえず1本通ったのが嬉しくて流してしまいました。

  • 学習させたデータ:
    • 時価総額100億以下の銘柄9つ(1408,1770,1418,1768,1776,1400,1420,1724,1711)の2015年〜2016年
  • 取引期間:2016年12月31日から30営業日
  • 初期資金:1000万円
  • トレードアルゴリズム
     ★「先30営業日の値動きの最大値」について…
       現在の10%以上上がると予想 → 買う
       現在の10%以上下がると予想 → 売る    それ以外 → 何もしない
  • 資産管理ルール
    • 総資産の10%は現金で持つ
    • 1銘柄の総額が総資産の10%を超えてはならない
    • 1銘柄を7日間で2度以上買ってはならない

結果…
f:id:kurupical:20170823214141p:plain:w500

12/31に1000万円でスタートし、2/13に1008万円になりました。やったー。
※とりあえず1本流れただけで、この結果が正しいかも検証していません・・・。笑 目標は、年利10%(どのくらいの期間で?などかなり漠然としていますが笑)。

3.今後やりたいこと

  • ログ機能の追加
    取引の根拠など、過程をすべてログファイルに出力させるようにします。
  • パフォーマンスチューニング
    いろいろな学習モデル、トレードアルゴリズム、資産管理ルールでバックテストをします。
    わくわくが止まりません・・・!
  • 有意性の検証
    統計学的に、「どの程度のデータでどの程度の結果がでれば有意性があるのか?」を検証したいです。
    統計学さわりしか知りませんが・・・
  • (将来的に)オンライン処理対応
    毎日勝手に予想してくれるようにしたいです。
  • (将来的に)サイトに予想公開
    オンライン処理対応が終われば。

4.その他

  • 今日のプログラミングは正直やっつけ仕事でした。
    本当は頭で考えてから手を動かすべきなのですが、トライアンドエラーでやってしまいました。
    嫌だなと思っていたところをゴリゴリと推し進めることができたのですが、プログラムの質は全然よくないと思います。
    仕事で残業40H超えるとトライアンドエラー・無思考になっちゃってたなあと思い返しました。
    本当に悪い癖だと思います。
  • トレードアルゴリズム、資産管理ルール、アイデア募集中です!!
  • 以下にソースコード公開しています。(そろそろ説明書作らないと・・・)
    github.com

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

目次

  1. 学習させる株データの作成
  2. 雑多なタスク
  3. その他

1. 学習させる株データの作成に伴う改修

昨日まで以下の2つの仮説を検証すべく、学習フェーズのプログラムの改修を行っていました。

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

これでトレードシュミレーションできる・・・と思いきや。
上記改修により売買フェーズも改修が必要になりました。
そりゃそうですよね。

ということで、赤文字部分の改修を行っています。

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

結構時間がかかっていますが、今度こそコレが終わればトレードシュミレーションができるはずです。。

2. 雑多なタスク

残していた雑多なプログラムを終えました。

  • 資産管理ルールの追加
    • 1銘柄の保有資産が、資産全体のN%以上になってはいけない(Nは調整可能)
    • 1銘柄をN日間の間に2度以上買うことはできない(Nは調整可能)
  • 学習対象データの絞り込み
  • 学習データの範囲指定(2016年までを学習し、2017年でテスト等、未知データに対するパフォーマンスをみたいので)
    などなど…

3. その他

・今日はめんどくさいと思っているところを結構片付けられたので満足です。
・以下にソースコード公開しています。
github.com

<株進捗>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