はじめに

この文書の目的は、多くの方が身近に使うことができるMicrosoft社のExcelLiblinearという機械学習用のライブラリを組み合わせることで、一般の方が機械学習を用いて金融市場の分析を行なうことができるよう支援することです。

機械学習の手法について

紹介する機械学習の手法はSVMsupport vector machine)という手法です。様々な情報を組み合わせて、分類問題(※)などに利用されます。

※例えば、文書内に出現する単語の頻度等から、その文書がどの分野について言及している文書が判定する、など。

本文書の流れ

本文書では、例題を提示し、その問題を解くためには、付属のExcelファイルやLiblinearをどのように組み合わせれば可能かを解説していきます。

関連プログラムの入手方法

関連プログラムの入手先は、巻末の「プログラムのダウンロード方法」に記述しました。

著者へのコンタクト

↑ twitterアカウントです。

このブログ経由でフォローしてくれた方は是非一言ツイートくださいませ。

仮想通貨や日本株の自動取引システムを構築したりしているので、情報交換などできたらうれしいです。

何人か集まればオフ会等も企画します。

例題:SVMで為替市場の上げ下げを予測するモデルを構築する

ここでは、SVMsupport vector machine)を使って、為替市場の上げ下げを予測するモデルを構築してみましょう。Excelファイルのシート「makeDataSet」を開いて下さい(画像1)。

学習データの生成

シートには約1年分のドル円の日足データがあります(画像1)。これを例にして、モデルを構築していきます。なお、付録のExcelシートには後述するワークシート関数が既に記述された状態になっています。

画像1:

教師データの用意

まずは、予測の対象となるデータである「教師データ」を用意します。

ここでは、為替の上げ下げを予測するモデルを作るので、上げれば1,下げれば0となるワークシート関数を記述します(画像2)。SVMを使って市場が「上げる/下げる」の二値分類の問題として解けるかどうかを試してみます。

画像2:

予測の対象は、1日先の値動きとするので、ここではワークシート関数が記述される行の次の行を参照して計算していることに注意してください。

特徴量データの用意

特徴量とは、学習データの持つ特徴を数値化したものです。

機械学習では、この情報と教師データの関係を学習し、その経験測を用いて将来の為替の値動きを予測することになります。したがって、特徴量は教師データに対して何等かの影響を持つ値を入力することが望ましいことになります。

 

この例では、簡単のために
・当日の価格変動(G列)
・前日の上げ下げ(H列)
・前日の高値を当日の終値が上抜けしたか(I列)
・前日の安値を当日の終値が下抜けしたか(J列)
の4つの特徴量を用意しました。

なお、これらの値は0~1の間で定義づけることが必要です。この手続きを正規化と言います。

以上が全て記載されたのがシート「makeDataSet」に記載されています(画像3)。

次にDataRangeStartPointとDataRangeEndPointを指定します。
これは教師データと特徴量が記載されたレンジを数字で指定するものです。

この例では全てのデータが揃う始点はF15、終点はJ1059です(画像3、画像4)。

画像4

それに対応するF15(6列目の15行目)、J1059(10列目の1059)に対応する値を、それぞれB2~C3に記述します(画像5)。また、同じように「Output file name」が記述されていることを確認してください(拡張子は必ず.txtとします)。

画像5

以上で学習データ生成の準備が整いました。

この状態で「Make Train DataSet」のボタンを押して下さい。

すると、ディレクトリLiblinear内に学習用データが出力されます(画像6)。

画像6-1

画像6-2

モデルファイルの生成

続いて、シート「Train」に移動してモデルを構築します(画像7)。

画像7:

セルB1にはSTEP1で作ったモデルファイル名を入力して下さい。
ここでは、liblinearではいくつかの種類のモデルを構築することが可能ですが、ここでは
L2-regularized L2-loss support vector classification (dual)
というモデルを作ってみます。

これは上げ下げの二値分類に適しているモデルのひとつです。
それを指定するため、セルB2では「2」を入力してください。

また、-vの値は、過学習を回避するための機能です。
例えば、-vの値を3とすると、データを三分割し、2/3のデータを使って学習し、残りの1/3で精度を検証するということを行います。

次に構築したモデルを出力する際のファイル名をB6で指定します。ここでは「svm_.model」としました。セルB1~B3、B6まで入力が終わったら、「Make Model」のボタンを押して下さい。

すると、次のように出力されます(画像8)。

画像8:

Best Cはモデルを構築する際に使用したパラメータです。
このExcelのプログラムでは、liblinearで最適なパラメータを探索したのちに、そのパラメータを使用してモデル化まで自動的に行っています。

モデルの上げ下げを52.25%で予測することが出来るモデルが出来たようです。

予測値の出力

続いて、構築したモデルに基づいて実際に予測値を算出してみましょう。
シート「Predict」に移動してください。

ここでは、今までの手順で構築したモデルと学習データと同じフォーマットの未知データ(学習に使用していないデータ)を使って予測をしてみます。

画像9-1

入力するデータは、Data range start pointとData range end pointです。ここで予測に使用するデータが記述されたセルの範囲を指定します。シートでは13行目のF列目~J列の間に未知データが記述されています。これを踏まえ、それぞれのセルに正しい値を入力してください。

画像9-2

なお、未知の将来画像9-2でいうところの2017/8/18の翌日2017/8/19の上げ下げを予測したい場合、F13の値は0もしくは1の任意の値を適当に(例えば、F列は全て0を入力しておくなど)入力していて構いません。

また、画像9-2左上の表、Input fileは、加工した未知データを書き出すテキストファイル名です。Model fileはSTEP2で作成したモデルファイルを指定し、Output fileは予測結果を書き出すテキストファイル名を指定します。Forecast resultは、モデルと未知データに基づいて予測した結果、つまり0か1か(上げるか下げるか)が出力されます。

必要な情報を記述した後、「Predict」ボタンを押して下さい。

すると、Forecast resultのセルに0が返りました。モデルは「翌日下げる」と予測したようです。

続いて、シート「PredictLongTerm」に移動してください(画像10)。
前の説明では、予測の対象を1日に限定しましたが、同じ方法で長期間におけるモデルの予測精度を評価することも可能です。

画像10

このシートは、今まで例としてきたモデルを使って、学習データには含まれない期間の約1か月のデータを使用して、予測を試みてみます。A1~C3の設定が変わっていることに注意してください。Rowが11~33まで広げてあります。また、学習データではF列に教師データを生成しましたが、ここでは0に統一しています。

Predictボタンを押すと、M列の「Forecast result」に予測結果が出力されます。その正解不正解を評価しているのがO列の「Correct/incorrect」です。

プログラムのダウンロード方法

本書で解説しているプログラムは、GoogleDriveもしくは、DropBoxからダウンロードが可能です。以下のリンクからダウンロードをお願いします。また、他社サービスを利用して共有しているため、リンクのURLが突然変更される可能性もあります。その場合、速やかに対処しますので、事象を確認された方は下記のメールアドレスまでご連絡下さい。

Dropbox
https://www.dropbox.com/s/1x3ylah2cgvtoqj/ML_Trading.zip?dl=0

GoogleDrive
https://drive.google.com/open?id=0B0eyjk4N-h2sNnRmbTNkUzdCWm8

お断り

Liblinearは完全に無保証なプログラムです。万が一、使用上の不明点、不具合などが観察されたとしても著者は責任を負いかねます。

 

Copyright (c) 2007-2017 The LIBLINEAR Project.
All rights reserved.

Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:

1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.

2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.

3. Neither name of copyright holders nor the names of its contributors may be used to endorse or promote products derived from this software
without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

Copyright(Liblinearのライセンスについて)