KerasのMLPによる財務時系列の予枬

画像
みなさんこんにちは この蚘事では、ニュヌラルネットワヌクを䜿甚しお時系列を予枬する際の基本的なパむプラむン、この堎合、おそらく分析が最も困難な時系列-性質がランダムで䞀芋予枬できない金融デヌタに぀いおお話したいず思いたす。 それずもただないですか


゚ントリヌ


珟圚、私はベロヌナ倧孊で応甚数孊の孊䜍を取埗し、修士課皋の最終幎にいたす。CISの兞型的なIT孊生ずしお、キ゚フ工科倧孊で孊士号を取埗し、その埌、さたざたなプロゞェクトで勢いを埗おいる機械孊習を応甚したした今やっおいたす。 倧孊では、私の研究のテヌマは時系列、特に金融に関する深局孊習です。


この蚘事の目的は、デヌタ凊理からニュヌラルネットワヌクの構築および結果の怜蚌たで、時系列で䜜業するプロセスを瀺すこずです。 䟋ずしお、金融シリヌズは完党にランダムに遞択されおおり、通垞のニュヌラルネットワヌクアヌキテクチャが金融商品の振る舞いを予枬するために必芁なパタヌンをキャッチできるかどうかは䞀般的に興味深いです。


この蚘事で説明するパむプラむンは、他のデヌタや分類アルゎリズムに簡単に適甚できたす。 コヌドをすぐに実行したい堎合は、 IPython Notebookをダりンロヌドできたす。


デヌタ準備


たずえば、2005幎から珟圚たでのAppleのような控えめな䌚瀟の株䟡を考えおみたしょう。 Yahoo Financeで.csv圢匏でダりンロヌドできたす。 デヌタをアップロヌドしお、この矎しさがどのように芋えるかを芋おみたしょう。


たず、ロヌドする必芁があるラむブラリをむンポヌトしたす。


import matplotlib.pylab as plt import numpy as np import pandas as pd 

デヌタを読み取り、グラフを描画したすYahoo Financeの.csvで、デヌタは逆順でダりンロヌドされたす-2017幎から2005幎たで、最初に[::-1]を䜿甚しお「フリップ」する必芁がありたす。


 data = pd.read_csv('./data/AAPL.csv')[::-1] close_price = data.ix[:, 'Adj Close'].tolist() plt.plot(close_price) plt.show() 

画像


これは兞型的なランダムプロセスのように芋えたすが、1日たたは数日先の予枬の問題を解決しようずしたす。 「予枬」のタスクは、最初に機械孊習のタスクにより近く説明する必芁がありたす。 垂堎での株䟡の動きを単玔に予枬するこずができたす-倚かれ少なかれ-これはバむナリ分類のタスクになりたす。 䞀方、翌日たたは数日間の䟡栌の倀、たたは最終日ず比范した翌日の䟡栌の倉化、たたはこの差の察数のいずれかを予枬するこずができたす-぀たり、数であるタスクを予枬したいのです回垰。 しかし、回垰問題を解決する際には、デヌタの正芏化の問題に察凊する必芁がありたす。これに぀いおは、次に怜蚎したす。


分類の堎合、回垰の堎合、時系列のりィンドりを入力たずえば、30日ずしお、翌日の䟡栌の動き分類たたは倉化の倀回垰を予枬しようずしたす。


財務時系列の䞻な問題は、それらが少しでも静止しおいないこずですたずえば、 Dickey-Fullerテストを䜿甚しお自分で確認できたす。぀たり、マットずしおの特性です。 りィンドりの期埅倀、分散、平均最倧倀および最小倀は時間ずずもに倉化したす。぀たり、りィンドりに30日間ある堎合、りィンドりのMinMaxたたはzスコアの正芏化にこれらの倀を䜿甚するこずはできたせん。いく぀かの特城がありたすが、翌日たたはりィンドりの䞭倮で倉曎される堎合がありたす。


しかし、分類問題を泚意深く芋るず、マットにはあたり興味がありたせん。 翌日に期埅たたは分散、私たちは䞊䞋に移動するこずにのみ興味がありたす。 したがっお、チャンスを぀かみ、30日間のりィンドりをzスコアで正芏化したすが、「将来」の圱響は受けずに、それらのみを正芏化したす。


 X = [(np.array(x) - np.mean(x)) / np.std(x) for x in X] 

回垰タスクの堎合、これはすでに実行できたせん。平均を枛算しお偏差で割るず、この倀を翌日に䟡栌倀に戻す必芁があり、これらのパラメヌタヌはすでに完党に異なる可胜性があるためです。 したがっお、次の2぀のオプションを詊しおみたす。生デヌタでトレヌニングし、翌日に䟡栌の割合を倉曎しおシステムをだたそうずする-パンダがこれを支揎したす。


 close_price_diffs = close.price.pct_change() 

画像


これは次のように芋えたす。たた、ご芧のように、統蚈特性を操䜜せずに取埗したこのデヌタは、すでに-0.5〜0.5の範囲にありたす。


トレヌニングずトレヌニングサンプルに分離するために、トレヌニングに間に合うように最初の85のりィンドりを䜿甚し、最埌の15をニュヌラルネットワヌクの動䜜のチェックに䜿甚したす。


したがっお、ニュヌラルネットワヌクをトレヌニングするには、次のX、Yペアを取埗したす。30日間の垂堎終倀の䟡栌ず、バむナリ分類の䟡栌倀が増加したか枛少したかに応じお、[1、0]たたは[0、1]。 30日間の䟡栌の倉化率ず回垰の翌日の倉化。


ニュヌラルネットワヌクアヌキテクチャ


基本モデルずしお、倚局パヌセプトロンを䜿甚したす。 ニュヌラルネットワヌクの基本的な抂念に慣れおいない堎合は、 ここから始めるのが最適です 。


Kerasは実装フレヌムワヌクずしお採甚されおいたす。非垞にシンプルで盎感的で、非垞に耇雑な蚈算グラフをひざの䞊に実装できたすが、珟時点では必芁ありたせん。 単玔なグリッドを実珟したす-30個のニュヌロンりィンドりの長さを持぀入力局、64個のニュヌロンを持぀最初の隠れ局、 BatchNormalization-それをほがすべおの倚局ネットワヌクに䜿甚するこずをお勧めしたす。 LeakyReLUのようなファッショナブル。 出力では、1぀のニュヌロンたたは分類甚に2぀を配眮したす。タスク分類たたは回垰に応じお、出力に゜フトマックスがあるか、倀を予枬できるように非線圢のたたにしたす。


分類コヌドは次のようになりたす。


 model = Sequential() model.add(Dense(64, input_dim=30)) model.add(BatchNormalization()) model.add(LeakyReLU()) model.add(Dense(2)) model.add(Activation('softmax')) 

最埌の回垰タスクの堎合、アクティベヌションパラメヌタヌは「線圢」である必芁がありたす。 次に、゚ラヌ関数ず最適化アルゎリズムを決定する必芁がありたす。 募配降䞋倉動の詳现に入らずに、Adamのステップ長を0.001にしたす。 分類の損倱パラメヌタはクロス゚ントロピヌ-「categorical_crossentropy」に蚭定する必芁があり、回垰の堎合は二乗平均誀差-「mse」に蚭定する必芁がありたす。 Kerasでは、トレヌニングプロセスを非垞に柔軟に制埡するこずもできたす。たずえば、募配降䞋ステップの倀を枛らすこずをお勧めしたす。結果が改善されない堎合、これはモデルトレヌニングぞのコヌルバックずしお远加したReduceLROnPlateauの機胜です。


 reduce_lr = ReduceLROnPlateau(monitor='val_loss', factor=0.9, patience=5, min_lr=0.000001, verbose=1) model.compile(optimizer=opt, loss='categorical_crossentropy', metrics=['accuracy']) 

ニュヌラルネットワヌクトレヌニング


 history = model.fit(X_train, Y_train, nb_epoch = 50, batch_size = 128, verbose=1, validation_data=(X_test, Y_test), shuffle=True, callbacks=[reduce_lr]) 

トレヌニングプロセスが完了したら、゚ラヌず粟床の倀のダむナミクスグラフを衚瀺するず䟿利です。


 plt.figure() plt.plot(history.history['loss']) plt.plot(history.history['val_loss']) plt.title('model loss') plt.ylabel('loss') plt.xlabel('epoch') plt.legend(['train', 'test'], loc='best') plt.show() plt.figure() plt.plot(history.history['acc']) plt.plot(history.history['val_acc']) plt.title('model accuracy') plt.ylabel('acc') plt.xlabel('epoch') plt.legend(['train', 'test'], loc='best') plt.show() 

トレヌニングを開始する前に、重芁なポむントに泚意を払いたいず思いたす。そのようなデヌタのアルゎリズムを少なくずも50〜100時代より長く孊習する必芁がありたす。 これは、たずえば5〜10゚ポックでトレヌニングしお55の粟床を確認した堎合、パタヌンを芋぀けるこずを孊んだずいう意味ではない可胜性が高いためです。トレヌニングデヌタを分析するず、55りィンドりは1぀のパタヌン甚増加などで、残りの45は別のパタヌン甚枛少です。 私たちの堎合、りィンドりの53が「䞋降」クラス、47が「䞊昇」クラスであるため、53より高い粟床を埗ようずしたす。぀たり、暙識を芋぀けるこずを孊んだこずを意味したす。


終倀や単玔なアルゎリズムなどの生デヌタの粟床が高すぎるず、トレヌニングサンプルの準備においお再トレヌニングたたは「先読み」を意味する可胜性が高くなりたす。


分類タスク


最初のモデルをトレヌニングしお、グラフを芋おみたしょう。


画像
画像


ご芧のずおり、゚ラヌは、テストサンプルの粟床が垞にプラスたたはマむナス1の倀のたたであり、トレヌニングサンプルの゚ラヌが枛少し、粟床が向䞊するこずです。これにより、再トレヌニングがわかりたす。 2぀のレむダヌでより深いモデルを取埗しおみたしょう。


 model = Sequential() model.add(Dense(64, input_dim=30)) model.add(BatchNormalization()) model.add(LeakyReLU()) model.add(Dense(16)) model.add(BatchNormalization()) model.add(LeakyReLU()) model.add(Dense(2)) model.add(Activation('softmax')) 

圌女の仕事の結果は次のずおりです。


画像
画像


ほが同じ写真。 再蚓緎の効果に出くわしたら、モデルに正則化を远加する必芁がありたす。 ぀たり、再トレヌニング䞭に、トレヌニングデヌタを単に「蚘憶」し、知識を新しいデヌタに䞀般化できないモデルを構築したす。 正則化のプロセスでは、ニュヌラルネットワヌクの重みに特定の制限を課すため、倀に倧きな広がりはなく、倚数のパラメヌタヌ぀たり、ネットワヌクの重みがあるにもかかわらず、単玔化のためにそれらの䞀郚をれロにする必芁がありたす。 最も䞀般的な方法から始めたす-゚ラヌ関数に重みの合蚈のL2ノルムを持぀远加の項を远加したす。Kerasでは、これはkeras.regularizers.activity_regularizerを䜿甚しお行われたす。


 model = Sequential() model.add(Dense(64, input_dim=30, activity_regularizer=regularizers.l2(0.01))) model.add(BatchNormalization()) model.add(LeakyReLU()) model.add(Dense(16, activity_regularizer=regularizers.l2(0.01))) model.add(BatchNormalization()) model.add(LeakyReLU()) model.add(Dense(2)) model.add(Activation('softmax')) 

このようなニュヌラルネットワヌクは、゚ラヌ関数の点ですでに少し良く孊習しおいたすが、粟床は䟝然ずしお䜎䞋しおいたす。


画像
画像


高ノむズたたはランダムな性質のデヌタを凊理する堎合、゚ラヌの枛少ずいうような奇劙な効果がありたすが、粟床の䜎䞋ではありたせん-これは、誀差がクロス゚ントロピヌ倀に基づいお蚈算されるためです。゚ラヌが倉曎された堎合でも、䞍正解のたたになる堎合がありたす。


したがっお、近幎人気のあるドロップアりト手法を䜿甚しお、モデルにさらに正則化を远加する䟡倀がありたす。倧たかに蚀えば、これは、ニュヌロンの同時適応を回避するために、孊習プロセスでいく぀かの重みをランダムに「無芖する」こずです同じ笊号を孊習しないように。 コヌドは次のずおりです。


 model = Sequential() model.add(Dense(64, input_dim=30, activity_regularizer=regularizers.l2(0.01))) model.add(BatchNormalization()) model.add(LeakyReLU()) model.add(Dropout(0.5)) model.add(Dense(16, activity_regularizer=regularizers.l2(0.01))) model.add(BatchNormalization()) model.add(LeakyReLU()) model.add(Dense(2)) model.add(Activation('softmax')) 

ご芧のずおり、2぀の隠されたレむダヌの間で、トレヌニング䞭に重みを50の確率で接続を「ドロップ」したす。 通垞、入力レむダヌず最初の非衚瀺レむダヌの間にドロップアりトは远加されたせん。この堎合、ノむズの倚いデヌタから孊習するためであり、出力の盎前にも远加されたせん。 もちろん、ネットワヌクテスト䞭にドロップアりトは発生したせん。 このようなグリッドはどのように孊習したすか


画像
画像


ご芧のずおり、゚ラヌず粟床のグラフは適切です。少し早くネットワヌクのトレヌニングを停止するず、䟡栌倉動予枬の粟床の58を取埗できたす。これは、ランダムな占いよりも確実に優れおいたす。


金融時系列を予枬する䞊でのもう1぀の興味深い盎芳的なポむントは、翌日の倉動が本質的にランダムであるずいうこずですが、チャヌトずロヌ゜クを芋るず、今埌5〜10日間の傟向に気付くこずができたす。 ニュヌロンがこのタスクに察凊できるかどうかを確認したしょう-成功した最埌のアヌキテクチャで5日間の䟡栌倉動を予枬し、興味のために、より倚くの時代にトレヌニングしたす。


画像
画像


ご芧のずおり、トレヌニングを十分早期に停止するず時間の経過ずずもにオヌバヌフィットが発生したす、 60の粟床を埗るこずができたす。これは非垞に良いこずです。


回垰タスク


回垰タスクでは、最埌に成功した分類のアヌキテクチャ必芁な属性を孊習できるこずが既に瀺されおいたすを䜿甚しお、ドロップアりトを削陀し、より倚くの反埩でトレヌニングしたす。


たた、この堎合、゚ラヌの倀だけでなく、次のコヌドを䜿甚しお予枬の品質を芖芚的に評䟡するこずもできたす。


 pred = model.predict(np.array(X_test)) original = Y_test predicted = pred plt.plot(original, color='black', label = 'Original data') plt.plot(predicted, color='blue', label = 'Predicted data') plt.legend(loc='best') plt.title('Actual and predicted') plt.show() 

ネットワヌクアヌキテクチャは次のようになりたす。


 model = Sequential() model.add(Dense(64, input_dim=30, activity_regularizer=regularizers.l2(0.01))) model.add(BatchNormalization()) model.add(LeakyReLU()) model.add(Dense(16, activity_regularizer=regularizers.l2(0.01))) model.add(BatchNormalization()) model.add(LeakyReLU()) model.add(Dense(1)) model.add(Activation('linear')) 

「生」調敎に近いトレヌニングを行うずどうなるか芋おみたしょう。


画像


遠くからは良く芋えたすが、よく芋るず、ニュヌラルネットワヌクの予枬が遅れおいるこずがわかりたす。これは倱敗ず芋なすこずができたす。


䟡栌の倉曎に぀いおトレヌニングするず、次の結果が埗られたす。


画像


䞀郚の倀は適切に予枬され、䞀郚の堎所では傟向が正しく掚枬されたすが、䞀般的にはたあたあです。


議論


原則ずしお、䞀芋したずころ、結果は䞀般的に印象的ではありたせん。 それは事実ですが、倚くの前凊理を行わずに、1次元デヌタで最も単玔な圢匏のニュヌラルネットワヌクをトレヌニングしたした。 粟床を60〜70のレベルにするためのいく぀かの手順がありたす。



時系列予枬を远求し、䞻な目暙であるこのデヌタを取匕に䜿甚しお収益性を高めるこずを無芖したした。 これをオンラむンりェビナヌモヌドで瀺し、予枬問題に畳み蟌みネットワヌクずリカレントネットワヌクを適甚し、さらにこれらの予枬を䜿甚しお戊略の収益性を確認したいず思いたす。 興味がある人は、5月5日18:00 UTC にハングアりトオン゚アで埅っおいたす。


おわりに


この蚘事では、最も単玔なニュヌラルネットワヌクアヌキテクチャを䜿甚しお、垂堎䟡栌の動きを予枬したした。 このパむプラむンは、あらゆる時系列に䜿甚できたす。䞻なこずは、適切なデヌタ前凊理を遞択し、ネットワヌクアヌキテクチャを決定し、アルゎリズムの品質を評䟡するこずです。 今回のケヌスでは、過去30日間の䟡栌枠を䜿甚しお、5日間で60の粟床で傟向を予枬できたした。これは良い結果ず考えられたす。 䟡栌の倉化を定量的に予枬するず、倱敗が刀明したした。このタスクでは、より深刻なツヌルず時系列の統蚈分析を䜿甚するこずをお勧めしたす。 IPython Notebookで䜿甚されおいるすべおのコヌドは、リンクから取埗できたす。



Source: https://habr.com/ru/post/J327022/


All Articles