normalian blog

Let's talk about Microsoft Azure, ASP.NET and Java!

Microsoft Azure の Machine Learning を利用して日経平均株価を予測してみる~その①まずは作ってみる~

Microsoft Azure にて Machine Learning がリリースされてから大分経過したのはご存知の方も多いと思う。話題にあがることは多いので知識として知っている方は多いと思うが、実際に利用したことのあるかたは実は少ないのではないだろうか?
実際に手を動かす方が理解は容易であるため、最近 20,000 円台を回復しつつまた下がった日経平均株価を予測するサンプルの作成を通して Microsoft Azure の Machine Learning(以下、Azure ML)の利用方法を学習したいと思う。

念のための注意となるが、今回のサンプルの結果を見て株や金融商品の売買をすることは控えて頂きたい。機械学習自体は歴史も長く奥の深い分野であり、今回紹介する内容は「Azure ML の利用方法をサンプル作成から紹介する」ものであって「機械学習を利用して日経平均株価を高精度で予測する」ものではない。

作成するサンプルの概要

今回は 日経平均プロフィル-日経の指数公式サイト- に公開されている過去15年分の日経平均株価のデータを利用し、翌日の日経平均株価を予測するサンプルを作成する。

上記のデータを利用し、機械学習の Web サービスを作成するが、入力と結果は以下になる。

Azure ML の管理画面である Azure Machine Learning Studio からの動作イメージは以下になる。
f:id:waritohutsu:20151216163046p:plain

以下のうち、Scored Labels 列の値である 19053.57… が予測した日経平均株価の値となる。
f:id:waritohutsu:20151216163108p:plain

Azure Machine Learning Studio を開く

手順は省くが、まずは Microsoft Azure の管理ポータルから Machine Learning を選択して以下の管理画面に到達してほしい。
f:id:waritohutsu:20151216163128p:plain

学習用データを Azure Machine Learning Studio に登録

日経平均プロフィル-日経の指数公式サイト- より日経平均株価のデータが日次で CSV 形式として保存されている nikkei_stock_average_daily_jp.csv を取得する。
CSV ファイルには データ日付, 終値, 始値, 高値, 安値 しか項目がないので、Excel でファイルを開き、前日終値, 前日始値, 前日高値, 前日安値列を追加して 終値, 始値, 高値, 安値の値を1日分ずらしてコピーする。
前日のデータが存在しなくなる初日データ(サンプル作成時は 2012/1/4 日)行は削除し、データ最終行にある「本資料は日経の著作物であり、本資料の全部又は一部を、いかなる形式によっても日経に無断で複写、複製、転載または流布することができません。」の文章が記載されている行も削除する。

最終的な形式は以下のようになるイメージだ。最後に、秀丸等でファイルを開きなおし、 Shift-JIS 形式になっているデータを UTF-8 形式に保存しなおせば完了だ*1
f:id:waritohutsu:20151216163143p:plain

Azure Machine Learning Studio を開き、[New]-[FROM LOCAL FILE]を選択する。
f:id:waritohutsu:20151216163201p:plain

以下の画面の様に作成した CSV データを選択し、Azure ML にデータセットを登録する。
f:id:waritohutsu:20151216163211p:plain

登録したデータからモデルを学習する

管理画面の[NEW]-[EXPERIMENT] から Blank Experiment を選び、からのシートを作成する。以下の画面が表示されればOKだ。
f:id:waritohutsu:20151216163350p:plain

次に、画面左の[Saved Datasets]-[My Datasets]から先ほど登録した日経平均株価CSV データを選択し、ドラッグアンドドロップで移動して作成する。

作成後、データセットの真ん中下側にある丸を右クリックし、Visualize を選択すると以下の画面が表示され、正常にデータが読み込めていることが理解できる。
f:id:waritohutsu:20151216163417p:plain

次に、学習には不要である データ日付, 始値, 高値, 安値列を削除する。前日のデータを利用して終値を計算するため、これらの列は不要なためだ。
[Data Transformation]-[Manipulation] から Project Columns を選択し、ドラッグアンドドロップでシート上に配置する。さらに、データセットの真ん中下側にある丸を左クリックし、そのままマウスをドラッグして Project Columns につなぐ。以下のような画面になれば成功だ。
f:id:waritohutsu:20151216163453p:plain

このままではどの列を選択するかを指示できていないため、画面右の Launch Column Selector を起動して必要な列だけピックアップするため、以下の様に設定する。
f:id:waritohutsu:20151216163503p:plain

次に、モデル向けの学習データ、学習精度を確認するためのデータに分割するため [Data Transformation]-[Sample and Split] の Split Data を選択してシートに配置し、以下のように Project Columns と接続する。
f:id:waritohutsu:20151216163521p:plain

今回は特に Split Data の設定はしないが、必要な場合は振り分けの Random Seed や分配率等を変えても良いだろう。

次に学習するモデルを配置する。まずは [Train] から Train Model をシート上に配置し、モデルに利用するアルゴリズムである線形回帰(Linear Regression)をシート上に配置し、それらを以下のように配置する。
f:id:waritohutsu:20151216163605p:plain

ここでさらに Train Model を選択し、画面右から Launch column Selector を押して予測する列を選択するが、今回は当然「終値」を選択する。ここまでで、実サンプルデータを利用してモデルに学習させるボックスの配置は完了した。

次に学習したモデルを評価するためのボックスを配置する。画面左より Score Model と Evaluate Model を選択し、以下のように配置する。Split データの一部を学習のために利用し、残ったデータをモデル評価のために利用しているのが理解できると思う。
f:id:waritohutsu:20151216170117p:plain

あらかた完成したので、画面下より[Save]-[Save As]を選択して任意の名前で保存する。次に、シートを実行するために [RUN] を押下する。
私が試した際には1分ほどで完了したが、以下の画面の様に各ボックスに緑のチェック印がついていれば完了だ。
f:id:waritohutsu:20151216170127p:plain

Evaluated Model の真ん中下を右クリックし、Visualize を選択すると以下のようにモデルに対する評価を確認できる。
f:id:waritohutsu:20151216170139p:plain

それぞれ、作成したモデルの正確さを評価する値になる。

Mean Absolute Error 145.023541
Root Mean Squared Error 204.021175
Relative Absolute Error 0.046778
Relative Squared Error 0.002936
Coefficient of Determination 0.997064

上記のうち、特に Root Mean Squared Error Coefficient of Determination から以下が理解できる。

  • Coefficient of Determination:1 に近いほどモデルの精度が高いため、今回はモデルの精度が良い
  • Root Mean Squared Error:二乗平均平方根の値であるため、予測値と実際の値とのかい離が大きいと思われる

上記から、予測精度は悪くないが、外した場合の誤差が大きいということが読み取れる。株価予測としては数値の誤差が大きいことに不安を感じるものの、ここまでで学習モデルの完了だ。

Web サービスとして公開する

学習したモデルを利用し、Web サービスとして他アプリと連携できるかたちで公開する。画面下より [Predict Web Service - Recommended] を押下する。シート内でごにょごにょとボックスが動いて以下の形になるはずだ。
f:id:waritohutsu:20151216170241p:plain

Web Service Input が Project Column につながっているが、このままだと不要なデータも引数として入力する必要があるので以下の形に変更し、さらに Project Column から「終値」を選択列から除外する。
f:id:waritohutsu:20151216170255p:plain

あとは [Run] で実行した後に [DEPLOY WEB SERVICE]を選択することでAzure Machine Learning Studio で Web サービスとして登録される。
無事に Web サービスとして登録されると以下の画面が表示される。
f:id:waritohutsu:20151216170303p:plain

上記の[Test]ボタンを押下すると引数を入力する画面が表示されるので、冒頭でスクリーンショットを利用して紹介した通り、日経平均株価の予測ができる。

考察について

2015年12月10日までのデータを利用して実際に試した結果は以下となった。

  • 予測値:19053.57
  • 実際の値:19,230.48

本来日経平均株価を予測するためには、NYダウ平均、為替、先物、原油価格等の様々なパラメータ値はもちろんのこと、政治的な要因も大きく絡むために今回利用したパラメータだけではデータが少なすぎることが原因だと思われる。
本サンプルの拡張としては「パラメータ値を増やす」はもちろんだが、「今回利用した Linear Regression だけでなく異なる回帰アルゴリズムの利用を検討する」といった方法も考えられる。

予測精度そのものは改善の必要があるが、慣れている人間ならば上記のサンプルを20分~30分程度で作成することが可能な点も含め、Microsoft Azure の Machine Learning が容易に利用できることが理解できたと思う。

是非皆さまも利用を検討して頂きたい。

*1:UTF-8にしないとAzure Machine Learning Studio で文字化けする