首頁  >  文章  >  科技週邊  >  將時間序列轉換為分類問題

將時間序列轉換為分類問題

WBOY
WBOY轉載
2023-05-18 22:12:201229瀏覽

本文將以股票交易作為範例。我們用 AI 模型預測股票第二天是漲還是跌。在這種背景下,對 XGBoost、隨機森林和邏輯分類器這三種分類演算法進行了比較。文章的另一個重點是資料準備。我們必須如何轉換資料以便模型可以處理它。

將時間序列轉換為分類問題

本文將依照CRISP-DM流程模型的步驟,使用結構化方法來解決商業案例。 CRISP-DM是潛在分析中廣泛採用的方法,通常被應用於建構資料科學專案。

另外就是我們將使用 Python 套件 openbb。這個包包括了金融部門的一些資料來源,使用起來非常方便。

首先就是安裝必須的函式庫:

<code>pip install pandas numpy “openbb[all]” swifter scikit-learn</code>

業務理解

首先應該了解我們要解決的問題, 在我們的例子中,可以將問題定義如下:

<code>预测股票代码 AAPL 的股价第二天会上涨还是下跌。</code>

然後就是應該考慮手邊有什麼樣的機器學習模型的問題。我們想預測第二天股票是上漲還是下跌。因此,此處涉及的是二元分類問題,其中要預測的是股票第二天上漲(值為1)還是下跌(值為0)。在分類問題中,我們預測一個類別。在我們的例子中,是一個 0 類和 1 類的二元分類。

資料理解與準備

資料理解階段著重於識別、收集和分析資料集。第一步,我們下載 Apple 股票數據。以下是如何使用 openbb 執行此操作:

<code>data = openbb.stocks.load(symbol = 'AAPL',start_date = '2023-01-01',end_date = '2023-04-01',monthly = False) data</code>

該程式碼下載 2023-01-01 和 2023-04-01 之間的資料。下載的資料包含以下資訊:

將時間序列轉換為分類問題

  • Open:美元每日開盤價
  • High:當日最高價(美元)
  • Low:當日最低價(美元)
  • Close:美元每日收盤價
  • Adj Close:與股息或股票分割相關的調整後收盤價
  • Volume :交易的股票數量
  • Dividends:已支付股息
  • Stock Splits:股票分割執行

我們已經下載了數據,但是數據還不適合建模分類模型。所以仍然需要為建模準備資料。因此需要開發一個函數下載數據,然後再進行數據轉換以便進行建模。以下程式碼顯示了這個功能:

<code>def get_training_data(symbol, start_date, end_date, monthly_bool=True, lookback=10): data = openbb.stocks.load( symbol = symbol, start_date = start_date, end_date = end_date, monthly = monthly_bool) data = get_label(data) data_up_down = data['up_down'].to_numpy() training_data = get_sequence_data(data_up_down, lookback) return training_data</code>

這裡麵包含的第一個函數時get_label():

<code>def encoding(n): if n > 0: return 1 else: return 0 def get_label(data): data['Delta'] = data['Close'] - data['Open'] data['up_down'] = data['Delta'].swifter.apply(lambda d: encoding(d)) return data</code>

他的主要工作是:計算收盤價和開盤價之間的差值。我們將股價上漲的所有日期標記為 1,而股價下跌的所有日期標記為 0。另外的up_down欄位包含股票價格在特定日期是上漲還是下跌。這裡使用 swifter.apply() 函數取代 pandas apply()是因為 swifter 提供多核心支援。

第二個函數是get_sequence_data()。參數 lookback 指定預測中包含過去多少天。 get_sequence_data()程式碼如下 :

<code>def get_sequence_data(data_up_down, lookback): shape = (data_up_down.shape[0] - lookback + 1, lookback) strides = data_up_down.strides + (data_up_down.strides[-1],) return np.lib.stride_tricks.as_strided(data_up_down, shape=shape, strides=strides)</code>

此函數接受兩個參數:data_up_down 和 lookback。它傳回一個新的 NumPy 數組,該數組表示具有指定視窗大小的 data_up_down 數組的滑動視窗視圖,該視窗大小由 lookback 參數決定。為了說明這個函數是如何運作的,我們來看一個小例子。

<code>get_sequence_data(np.array([1, 2, 3, 4, 5, 6]), 3)</code>

結果如下:

<code>array([[1, 2, 3],[2, 3, 4],[3, 4, 5],[4, 5, 6]])</code>

在下文中,我們下載 Apple 股票的資料並對其進行轉換以進行建模。我們使用 10 天的回溯期。

<code>data = get_training_data(symbol = 'AAPL', start_date = '2023-01-01', end_date = '2023-04-01', monthly_bool = False, lookback=10) pd.DataFrame(data).to_csv("data/data_aapl.csv")</code>

資料已經準備完畢了,我們開始建模和評估模型。

建模

將資料讀入資料並產生測試和訓練資料。

<code>data = pandas.read_csv("./data/data_aapl.csv") X=data.iloc[:,:-1] Y=data.iloc[:,-1] X_train, X_test, y_train, y_test = train_test_split(X, Y, test_size=0.33, random_state=4284, stratify=Y)</code>

邏輯迴歸:

此分類器是基於線性的模型,通常用作基準模型。我們使用scikit-learn的實作:

<code>model_lr = LogisticRegression(random_state = 42) model_lr.fit(X_train,y_train) y_pred = model_lr.predict(X_test)</code>

XGBoost:

XGBoost 是為速度和效能而設計的梯度提升決策樹的實作。它屬於樹提升演算法,將許多弱樹分類器依序連接。

<code>model_xgb = XGBClassifier(random_state = 42) model_xgb.fit(X_train, y_train) y_pred = model_xgb.predict(X_test)</code>

隨機森林:

隨機森林建立多個決策樹。 Bagging方法被稱為整合學習的一種,因為它利用多個相互連接的學習器來進行學習。首字母縮寫詞“bagging”代表引導聚合。 這裡也使用scikit-learn的實作:

<code>model_rf = RandomForestClassifier(random_state = 42) model_rf.fit(X_train, y_train) y_pred = model_rf.predict(X_test)</code>

評估

建模和訓練模型後,我們需評估其在測試資料上的表現。 Recall、Precision 和 F1-Score 是用來測量指標的。下表顯示了結果。

將時間序列轉換為分類問題

可以看到邏輯分類器(邏輯迴歸)和隨機森林取得了明顯優於XGBoost模型的結果, 這是什麼原因呢?這是因為資料比較簡單,只有幾個維度的特徵,而且資料的長度也很小,我們所有的模型也沒有進行調優。

總結

我們這篇文章的主要目的是介紹如何將股票價格的時間序列轉換為分類問題,並且示範如何在資料處理時使用視窗函數將時間序列轉換為一個序列,至於模型並沒有太多的進行調優,所以對於效果評估來說越簡單的模型表現得越好。

以上是將時間序列轉換為分類問題的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:51cto.com。如有侵權,請聯絡admin@php.cn刪除