テストエンジニアが機械学習してみた備忘録

広島とジト目が好きなテストエンジニアが機械学習に手を出した備忘録。

シストレとMCMC

1ヶ月ぶりの更新になってしまいました…

何をやっていたかというと、株のトレードシステム(いわゆるシストレ)を組んでました。

機械学習を使って勝率の高いトレードシステムを作りたい」というのは多くの先輩方が試していることだと思いますが、多少ぐぐったところで有効な手法がパッと出てくるわけではないです。まぁ、実際にそれで設けている人が、何のメリットもないのに手法を公開することなんてまずないと思いますし。

we.love-profit.com

その辺りの厳しさは上記の記事にもまとまっています。 個人的にも「個別の株価を予測する」というアプローチはあまり上手くいく気がしなかったため、 最初は機械学習全く関係なく取り組もうと思ってました。

元々、2〜3年くらい前に株には興味を持っていて、チャート分析とかテクニカル指標とかの話は本読んで勉強したり、実際にトレードしたりということはしていました。その時、各指標やチャートのサインを見て手動で銘柄選定したり、各種計算取引の記録はエクセルを用いていたのですが、当然手動だとあたりをつけた銘柄しか確認できませんし、各種入力がめんどくさいので、自動化したいなという要求はありました。*1

当時はついでにWebアプリの勉強もしようということで欲張ってWeb化目指したのですが、UI部分の作成にモチベーション上がらなすぎてそのまま挫折していました…そして「CUIで十分じゃね?」という当たり前のことに気づいたので再開。

アプローチ

ざっくりとまとめると以下の通りです。

  • 各テクニカル指標やチャートから見えるサインを調べる
  • 各銘柄を買った(or 空売りした)場合の目標価格と損切り価格を算出する
  • 調査したサインと算出した価格を元に勝率の高そうな銘柄に対してアクションを取る

ここで、スコア算出時のパラメータ(各指標の重みや価格算出時の係数など)をどのように決定するかが課題になります。どう考えても手動では無理なので、過去のデータにシステムを適用して、結果を見て、パラメータを微調整して、また過去のデータに適用して結果を見て…ということを繰り返すシミュレーションを作り、最高の結果が得られたパラメータを採用することにしました。

つまり「過去の株価を元に特定のルールで取引した結果を返すモデル」を用意して、そこにパラメータをいろいろ変えながら突っ込んで、1番良い結果を得られたパラメータを採用する、というアプローチです。

ここまで考えたところで、機械学習も雑に言えば「尤度関数を最大化するパラメータを求める」という問題なので、これって結局機械学習に近いことしてるのでは…?と思い至りました。

MCMCを調べてみる

そこで、パラメータの推定には機械学習の手法を参考にしようと思いましたが、 よく聞く確率的勾配降下法などの手法は微分などの演算が必要になります。 今回のモデルは数式で表されているわけではないので、微分を用いた手法は適用できません。 さてどうしようかと思い緑本を読んでいると、このように複雑な統計モデルへのあてはめに威力を発揮するのがMCMCと紹介されていました。

試しにメトロポリス法でのシミュレーションを書いてみたところ、初期値では損失を出していましたが、 パラメータ調整が進むにつれて良い結果が得られるパラメータを出力してくれるようになりました。

we.love-profit.com

そういえば、冒頭で紹介したこの記事にも

株式市場は「過分散」であるということを肝に銘じなければなりません。この点からベイズ推定のアルゴリズム(要するにMCMC)は幾分有利となる可能性があります。結果のパフォーマンス測定に検定やAICを使うようでは、全く分かっていないというしかありません。

とあるので、大外しはしていないのではないか…と思っています。

雑感

1番時間がかかったのは「銘柄選定して発注して、保有分に対する処理をして…」というトレードの操作シミュレートする部分でした。また、1回のシミュレーションに時間がかかると数をこなせないので、最適化を試みたりした点はいい経験になったかなと…

まとめ

MCMCも、冒頭で紹介した記事に書かれている内容もまだ理解しきれているわけではないので、これを機にいわゆるベイズ的な理論部分も深めていきたいなと思います。最後に、あまり細かいこと書いている記事ではありませんが、投資はあくまで自己責任でお願いします。

*1:自動化しないと感情に左右されて結果は出なかった、ということも理由の1つです