【株+機械学習】ぜかましプロジェクトが辿った軌跡

スポンサードリンク

こんにちは。ふぁんたです。

「機械学習で株価を予測する、全自動で稼いでくれるマシーン こと ぜかまし プロジェクト」を立ち上げて、コードを書き始めてだいたい1年弱が経とうとしています。

思えばいろいろあり、「もうこれ以上の改修は望めないだろう」、と思うたび新たなアイデア、方向性が湧き出てきたのをよく覚えています。

ですが、1年もずっと似たようなことをやっていると、もうそろそろ枯れ果てるんじゃないかという思いがでてきましたので、今までどういう考えでやってきたのかをまとめようと思います。

2018年5月頃 思い立つ

それまでずーっと、株価をコンピューターで計算できたら素晴らしくね?という発想自体はあったのですが、そもそもプログラミングがなかったこと、そんなことをしなくても金銭的に不自由なく(仕送りで)生きていけた環境にあったことなどから、全く手を付けずにいました。

それが就職で変わり、自分の時間ができたときに、自分のプログラミング力を向上させるため、機械学習についても親しくなれるため、あわよくば稼げるシステムを構築するため、という一石三鳥のシステムを思いつき、実行に移すことを決意しました。

 

最初の構想としては、「今が高値なのか、安値なのかは、過去数十日のデータを見ればわかるはずなので、それを判断基準とする」といったようなものでした。

それを実装するのにだいたい3ヶ月かかり、更にその方針で取引した場合、どれぐらいの利益が出るのかのシミュレーションと、勝敗の平均利益、勝率を割り出すプログラムにするのにもまた2ヶ月ほどかかりました。

結果としては、今までの報告会でも説明したとおり、「勝率73%、100万円を8000万にするシミュレーション結果を叩き出した銘柄もあれば、2万しか持って帰ってこなかった結果になったのもある」というようなものでした。

初めて明かすような気がしますが、勝敗の平均利益は7%ほどでした。

 

この結果を受けて、8000万は素晴らしいが、2万は恐ろしいと感じ、(ずっと続く機械学習ブームもあるので、)過去のデータから最適な取引を算出し、それを教師データとして学習させるという方向に向き始めました。

 

2018年11月、機械学習を志し、寄り道。

大学の研究の関係で、機械学習にほんの少しだけ理解があり、嫌な思い出もまたあったのですが、これを使わない訳にはいかない、何ならこの勢いで嫌な思い出を払拭してしまおうという気持ちもあったので、手を出すことに極めました。

まず、過去のデータから最適な取引を算出、正解のラベルとしてデータを保存しておきました。最低値で買って、最高値で売るというようなデータは、見れば作ることができます。ここを機械的にやりました。

それに加え、広めの区間の中で最大値や最小値ではなくとも、極値(近所では最強という値)のところも存在するかもしれないし、そこで取引をしてもいいんじゃないか?という発想が降りてきたので、そういった取引も行うような、複数のラベルを作成しました。

その傍ら、「機械学習をするには特徴量の選択が大事」という、どこかで聞きかじっただけのような文言を信念に、高値と安値を判断するために途中で使用した数字を15個ほど特徴量として学習させるようにしました。

それらを毎回計算するのは面倒だと感じたので、存在は知っていたけど使ったことのなかった「データベース」に手を出し、SQL文を勉強しましたが、学習用のパソコンのスペックが足りなかったのか、1行insertする時間がどんどんかかってくるようになったので、データベースは使わないようにする方針になりました。

余談ですが、C#においてはLinQのコードがSQL文にかなり似通っているので、競技プログラミングなどでも非常に役に立ち、勉強してよかったと思っています。

 

厄介なのが機械学習の方で、今まであまりパッケージやらモジュールやらを使わずにコードを書いてきた弊害か、どうすればC#で機械学習ができるのか、ということを考え始めてしまいました。

結局、TensorFlowの使い方はよくわからず、pythonのscikit-learnというパッケージ(?)で機械学習の第一歩を踏み出しました。ほんでもってpythonの勉強もちょっとしました。

機械学習をすると決めてからまず始めたのは、今までの特徴量だけでは足りないという思いからの、新規プロジェクト作成でした。

今までに使っていた高値安値判断の副産物では特徴量として弱いと考え、今まで株の世界で有用だと考えられてきた値を特徴量として扱おうという方針を決めました。

あえて今までのコードを使わず新規プロジェクトに切り替えた理由はもう一つあり、すべての命令をmainに書き込むポンコツプログラマが、勉強してクラスとかインスタンスとかは使えるようになってきたから、かっこよくかけるならそうしたい、というものでした。

この頃になると、競技プログラミングの調子も出てきていたので、例えば「終値の60日分の平均」を毎回算出するにあたって、「60日分の終値を毎回足し算して、60で割ったものを「平均」とする」というような実装ではなく、「長さ60のListと、その和を保持する変数を使って、尺取法的に平均を求める」というようなコードが書けるようになっていました。

 

困ったのは、機械学習の知識に乏しいこと、使えそうな特徴量の種類があまりにも多すぎること、特徴量として使えるはずの式が明らかにおかしい(無限大になりうるとか)、元データが途中で出来高(その日売買された株数)の取得を諦めていること、などが挙げられました。

 

機械学習の知識は機械学習を使う段になってから悩めば良いと考え、特徴量の種類の多さは目をつぶって力技で実装しました。

NaNを示しうる特徴量は、その計算の意図を読みながら修正し、出来高を使う特徴量については諦めました。OBVとか。

 

それで、実装をひーひーいいながら完成させたのですが、機械学習のコードが良くわかりませんでした。

 

わからないと諦めるよりはいいと思い、ちょっと昔にかじった、Azure Machine Learning Studioを使ってみることにしました。

 

勘違いで一喜一憂、一憂、一憂。

Azureはわかりやすかったです。ハイパーパラメータの調整まで行ってくれるすぐれものでしたが、その分学習時間がかかるのが玉に瑕なやつです。

新規プロジェクトに切り替える前にやったコードを思い出しながら作成した学習用ラベルで、新たな特徴量を試すのですが、「複数(≧3)のクラスを分類する深層学習」と「2つのクラスを分類する深層学習」を取り違えたことが原因で、作成したモデルの正答率が跳ね上がりました。99.5%です。

まだあまり機械学習に明るくなかった自分は、少し疑いながらもプロジェクトの成功を祝いました。すごいものを作り上げてしまった、と。

 

しばらくしてミスに気づき、がっくりと肩を落としたのをよく覚えています。

 

バラエティーに富んだ学習の末、怠けて痛い目を見る

「別に買うべきでも売るべきでもないデータの数が多すぎる」ことに気づきました。Twitterに相談したら、「不均衡データ」というワードを教えていただきました。きちんと勉強している人には勝てない…

で、「取引タイミング候補にはならないデータ」を全部除外し、「最低値と最高値」「極値」「取引タイミング候補にはなるけどそこで売り買いすると損になるデータ」みたいな分類をさせるようにしました。ここまでゴッチャゴチャになるとコードの保守が困難です。

 

それらのデータを使って、「極値での取引を不正解にする手法」と「そうでない手法」を両方試すため、抽出したデータのラベルを置き換えるプログラムを書こうと決心し、プロジェクトを立ち上げ直した前のコードから持ってきて、その部分を作り上げました。

 

その結果、極値での取引を不正解とはしない手法が、ものすごい確率で正しいタイミングで取引ができる、という結果を示していました。

 

これが前回、中間発表会で出してしまったデータです。

プロジェクトを立ち上げ直した前のコードと、今回のコードでは扱わなければならない特徴量の数が異なり、ゆえに正解ラベルのインデックスが異なり、答えが学習用データに混入するという事故を引き起こしました。すいません。

 

今、何をしているか

これだけいろんなことをやっても、次から次へとアイデアが湧き出てくるんですよね。

今行っているのは

・安定している銘柄(=東証一部)のみにデータを絞っての学習

・取引タイミング候補にはならないデータを全部外したところ、データ数が10万ない事に気づいたので、手法を決定木からサポートベクタマシンに変更して学習してメモリエラーって出てきて泣く

・グリッドサーチを用いた、他クラス分類決定木のハイパーパラメータの最適化(この記事を書いている後ろで動いている、一時間ぐらい経ってるのに終わる気配がない)

というような内容で、今後の展望としましては、

・遡るデータ量を増やす(800日ぐらいじゃ全然足りない?)

・「勝率が」73%だった、という特徴量に勝つには、予測結果での勝率を出さなければいけない

・混同行列(クラスがどう分類されたかを表す行列)を見ると、「すべての取引タイミングで売りも買いもしない」というポンコツモデルが高い正解率を叩き出しているので、その問題の解消

→(考えられる方法としては、それこそ不均衡データの扱い方に沿う方法、PとRを正しく理解して、他クラス分類決定木の学習においてどちらを重視するか変えられるハイパーパラメータぐらいあるだろ、という慢心とともに進む方法を考えている)

ということをやろうかなと、ぼんやり考えております。

 

このプロジェクトしかできない日はこれを進めて、余裕があるときにVRゲーム作成とか機械学習を自分で作っちゃうとか情報工学を一度再復習するとか、そういうプロジェクトを進められればいいなと考えております。

スポンサードリンク