用於趨勢預測的 LSTM
一段時間以來一直想接觸 ML,因為我對金融和交易也很感興趣,所以在閱讀了用於金融趨勢預測的 Deep LSTM 和強化學習層之後,我認為這將是一個很好的入門項目Francesco Rundo 的外匯高頻交易系統( https://www.mdpi.com/2076-3417/9/20/4460/htm )。
我正在第一步,一個具有 3 個時間序列作為輸入和一個分類輸出(0、1、2)的 LSTM。
經過一整天的工作後,我得到了一些工作,但我的結果與 Francescos 模型顯然達到的結果相去甚遠(43% 對 70%),我不確定這是否只是拋出更多訓練數據的問題和時間,或者如果我因為對 ML 不熟悉而犯了一個基本錯誤。
def create_model(): model = Sequential() model.add(LSTM(HIDDEN_CELL_NUMBER, input_shape=(100, 3), return_sequences=True)) model.add(LSTM(HIDDEN_CELL_NUMBER, input_shape=(100, 3))) model.add(Dense(3, activation=activations.softmax)) return model HIDDEN_CELL_NUMBER = 300 EPOCHS = 10 class_weights = class_weight.compute_class_weight('balanced', np.unique(y_train), y_train) y_train = to_categorical(y_train) y_TEST = to_categorical(y_TEST) model = create_model() model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['categorical_accuracy']) model.fit(x_train, y_train, class_weight=class_weights, epochs=EPOCHS, verbose=1)
優化器、損失和指標是 3 個分類輸出的正確選擇嗎?
還有什麼明顯的我做錯了嗎?
幫助神經網路更快地學習的第一件事是規範化 0 和 1 之間的所有輸入。庫 sklearn 有一個 preprocess.scale() 函式可以做到這一點 - 確保單獨進行訓練和測試數據(或訓練、驗證和測試數據,如果您使用三個單獨的集合)。僅此一項就可以產生巨大的影響。我看到了一個深度強化學習教程,它極大地加速了學習。為了安全起見,tensorflow.keras.layers 有一個 BatchNormalization() 函式,您可以在每個 LSTM 之後添加它作為
model.add( BatchNormalization() )
另一個非常重要的細節是,您從未在層之間引入 dropout。它本質上是為了隨機刪除一些資訊而設計的,它通常用於所有類型的循環網路。預設情況下,您可以在每層之間添加它,並以 20% 的 dropout 率進行:
model.add( Dropout(0.2) )
這個也可以在 tensorflow.keras 的層模組中找到。最後一件事是,在引入輸出層之前,人們通常會在 LSTM 層之上堆疊至少一個密集層。美聯儲的庫克和霍爾(2015 年)發現它在宏觀經濟數據上執行良好,並且似乎是所有地方的標準。所以,這些是我個人首先嘗試的第一件簡單的事情。
在財務層面,您必須仔細考慮如何標記數據。例如,如果您可以做空一項資產,您必須確保您沒有將所有下跌走勢都標記為做空頭寸的機會——跌幅必須足夠大,以克服費用、滑點和價格影響。價格上漲也是如此。這通常意味著您的數據中有很多“什麼都不做”標籤,這意味著存在一個局部最優,即 100% 的時間什麼都不做實際上很難被擊敗。我看到您正在使用權重,但是如果您有很多數據,處理它的簡單方法是隨機選擇一個平衡(或更接近平衡)的數據集。如果失敗,在考慮過採樣之前,像你一樣權衡觀察結果將是最後一個簡單的選擇。
例如,我已經看到一些使用很少功能的系統在加密貨幣上表現相對較好。但話又說回來,這是一個教程,他們除了在 3 分鐘間隔內辨識增長率的跡像外,並沒有做更多的事情……根據您對標籤或目標的聰明程度,可能很難獲得準確性。問吉姆西蒙斯。他花了 40 年的時間和許多非常聰明的博士才在量化金融領域大展拳腳。
編輯例如,您可以使用
model = Sequential() for i in range(N_LSTM_CELLS-1): model.add( LSTM(LSTM(HIDDEN_CELL_NUMBER, input_shape=(100, 3), return_sequences=True)) ) model.add( Dropout(0.2) ) model.add( BatchNormalization() ) model.add( LSTM(LSTM(HIDDEN_CELL_NUMBER, input_shape=(100, 3)) ) model.add( Dropout(0.2) ) model.add( BatchNormalization() ) model.add( Dense(N_UNITS, activation="relu") ) model.add( Dense(3, activation="softmax") )
您可以訪問深度學習課程 pythonprogramming.net。