<その他>8/25 ペアプログラミングやってみた

ペアプログラミングやってみた

  1. 経緯
  2. やったこと
  3. やってみて印象に残ったこと
  4. 感想

自分のメモ書きとして。

1.経緯

東京の同期が帰省していた時にご飯食べに行きました。
ペアプログラミングとかしてみたいと言ったらスカイプIDを教えてくれたので、やってみました。

2.やったこと

「株予測プログラムにログ機能を追加する」のを私がコーディングし、それを見てもらうことになりました。
売買プログラムが「なぜ売買したのか(株の値動きから株価をどう予想し、どういうアルゴリズムに基づいて売買を決定したのか)」のログを取るという機能です。

3.やってみて印象に残ったこと

  • プログラム構造の考え方
    • オブジェクト指向になってない/何をやっているかわからないクラスがある。
      オブジェクト指向は、それぞれのクラスで「責務」が明確になっていることが大事。
      無意識にやろうとしていたことを言葉にしてもらうとなるほどーってなります。ここは今後も意識していこう。
    • いいプログラム=機能カスタマイズ時に影響範囲が少ないプログラム(=「責務」が明確である)
  • 生産性の違い
    • お互いがわからないこと(pythonでstatic変数を書く、等)を調べて実装するまでのスピードが全然違う。
      自分は「実際のプログラムに組み込みながら検証する」、同期は「とにかく簡単なコードを書いて実装する」
      後者のほうがよさげ。
    • 単純に俊敏さが違うなと感じました。みるみるうちにテストコードが完成していくのを唖然と眺めているときも。
      自分は結構手が止まってしまう時間が多いので…
      その他、プログラム的に細かいところはいろいろあったのですが主に思ったのはこのくらいです。

4.感想

  • 自作(コピペなし)2000行のコードを説明するというのがあまりない経験で新鮮でした。
  • 調べものや簡単な実装など簡単な作業をするときは自分と同期で同時に行うのですが、自分とやり方が全然違ったりして勉強になりました。
  • 設計について語るのが単純に楽しかったです。
  • 実作業はあまり進まなかったです。自分のプログラムの説明から入ったのですが、説明下手だったり設計にツッコミどころが多くグダグダしてしまいました。。

<株進捗>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の勉強」とのバランスを考えつつ進めていきたいです。