euniclusいつからかシステムトレードソフトを作ってみたいと思うようになりました。そのためにまずは株価の動向を予測するプログラムを作ってみたいと思います。以下の書籍の一部を参考にしました。learningこの書籍の後半で株価を終値を予測するサンプルが紹介されていました。これに倣いプログラムを実装してみたいと思います。株価を予測すると言っても方法はいろいろあると思います。今回は線形回帰モデルを使い具体的な値を求めることで株価を予測しますが、その場合学習させるためにいろいろとパラメーターを準備する必要があります。今回実装するモデルでは37個の特徴量が必要になります。この特徴量を入力されたデータから抽出します。今回使用するヤフーファイナンスからダウンロードできるcsvのフォーマットは以下のような構成です。Close,Volume1996-08-09,14.250000,16.750000,14.250000,16.500000,15.264661,16015001996-08-12,16.500000,16.750000,16.375000,16.500000,15.264661,260900...そしてこのデータから以下の37個の数値を抽出します。実装やることがそこそこ多いのでひとつずつやっていきたいと思います。上で記載したヤフーファイナンスから株価データをもらいます。どんな企業の株価データでも問題ないと思います。時々「null」という単語が含まれている場合があります。手動で消してから処理に通します。csvからデータを持ってくるソースコードです。単純に一行ずつ配列に入れているだけですね。次は特徴量の抽出です。先ほど挙げた37個の値を生成します。そのソースコードがこちらです。線形回帰で特徴量を抽出する場合少なくとも365日分以上のデータが必要になります。株価データの初めから366番めを予測するデータの先頭とします。featuresそしてこの関数から呼ばれる関数たちです。len(data)これで特徴量を抽出出来ました。ひとつ問題があります。特徴量をそれぞれ正規化します。それを行う処理がこちらです。特徴量の標準偏差を計算します。ちなみに平均と標準偏差はすべてのデータの同じ種類の特徴量の平均と標準偏差です。特徴量データが100個あり「過去5日間の終値」の平均を求める場合、100個の「過去5日間の終値」の平均を求めるということです。ターゲットパラメーター(正解の値)も同じように正規化します。やっていることは上とほぼ同じです。実際に入力データ(特徴量)から株価を予測する処理です。データと重みの内積を計算し結果を返します。その結果が予測した値ということです。valueそして誤差を求める関数です。重みを更新する関数です。そのテストコードです。適当な作りですが、このあたりは人によって違ってくるのかなと思います。役に立ちそうな値を出力するようにしています。{}".format(error))これを実行する訓練10000回ごとに誤差が表示されます。10000回終了したらテストに入ります。テスト時に以下のような情報を表示するようにしました。0.142329891088今回はAppleの株価データを使用しました。訓練データ9000個に対してテストデータは700個ほどです。訓練データが少なすぎるとうまく学習できません。個数に関してはうまく調整する必要があると思います。書籍だけではなくネットでもいろいろ調べたのですが、ピンとくるものが見つかりませんでした。特徴量抽出など間違っていそうな部分があるので、テストの結果が本当に正しいものなのか正直疑問です。株価の予測について今回試した方法だけではなく他にもいろいろあるんですかね。一応学習はしているし、予測もまったくの的外れではないんですよね。これからいろいろ調べて機能を拡張していきたいと思います。