日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

將時(shí)間序列轉(zhuǎn)換為分類問(wèn)題

 禁忌石 2023-04-29 發(fā)布于浙江

本文將以股票交易作為示例。 我們用 AI 模型預(yù)測(cè)股票第二天是漲還是跌。 在此背景下,比較了分類算法 XGBoost、隨機(jī)森林和邏輯分類器。文章的另外一個(gè)重點(diǎn)是數(shù)據(jù)準(zhǔn)備。 我們必須如何轉(zhuǎn)換數(shù)據(jù)以便模型可以處理它。

文章圖片1

在本文中,我們將遵循 CRISP-DM 流程模型,以便我們采用結(jié)構(gòu)化方法來(lái)解決業(yè)務(wù)案例。 CRISP-DM 特別適用于潛在分析,通常在行業(yè)中用于構(gòu)建數(shù)據(jù)科學(xué)項(xiàng)目。

另外就是我們將使用 Python 包 openbb。 這個(gè)包以包含了一些來(lái)自金融部門(mén)的數(shù)據(jù)源,我們可以方便的使用它。

首先就是安裝必須的庫(kù):

pip install pandas numpy “openbb[all]” swifter scikit-learn

業(yè)務(wù)理解

首先應(yīng)該了解我們要解決的問(wèn)題, 在我們的例子中,可以將問(wèn)題定義如下:

預(yù)測(cè)股票代碼 AAPL 的股價(jià)第二天會(huì)上漲還是下跌。

然后就是應(yīng)該考慮手頭有什么樣的機(jī)器學(xué)習(xí)模型的問(wèn)題。 我們想預(yù)測(cè)第二天股票是上漲還是下跌。 所以這是一個(gè)分類問(wèn)題(1:股票第二天上漲或 0:股票第二天下跌)。 在分類問(wèn)題中,我們預(yù)測(cè)一個(gè)類別。 在我們的例子中,是一個(gè) 0 類和 1 類的二元分類。

數(shù)據(jù)理解和準(zhǔn)備

數(shù)據(jù)理解階段側(cè)重于識(shí)別、收集和分析數(shù)據(jù)集。 第一步,我們下載 Apple 股票數(shù)據(jù)。 以下是如何使用 openbb 執(zhí)行此操作:

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

該代碼下載 2023-01-01 和 2023-04-01 之間的數(shù)據(jù)。 下載的數(shù)據(jù)包含以下信息:

文章圖片2
  • Open:美元每日開(kāi)盤(pán)價(jià)

  • High:當(dāng)日最高價(jià)(美元)

  • Low:當(dāng)日最低價(jià)(美元)

  • Close:美元每日收盤(pán)價(jià)

  • Adj Close:與股息或股票分割相關(guān)的調(diào)整后收盤(pán)價(jià)

  • Volume:交易的股票數(shù)量

  • Dividends:已付股息

  • Stock Splits:股票分割執(zhí)行

我們已經(jīng)下載了數(shù)據(jù),但是數(shù)據(jù)還不適合建模分類模型。所以仍然需要為建模準(zhǔn)備數(shù)據(jù)。 所以需要編寫(xiě)了一個(gè)函數(shù)來(lái)下載數(shù)據(jù),然后對(duì)其進(jìn)行轉(zhuǎn)換以進(jìn)行建模。 以下代碼顯示了此功能:

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

這里面包含的第一個(gè)函數(shù)時(shí)get_label():

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

他的主要工作是:計(jì)算收盤(pán)價(jià)和開(kāi)盤(pán)價(jià)之間的差值。 然后我們用 1 標(biāo)記股價(jià)上漲的所有日期,股價(jià)下跌的所有日期都標(biāo)記為 0。 另外的up_down列包含股票價(jià)格在特定日期是上漲還是下跌。 這里使用 swifter.apply() 函數(shù)替代 pandas apply()是因?yàn)?swifter 提供多核支持。

第二個(gè)函數(shù)是get_sequence_data()。 參數(shù) lookback 指定預(yù)測(cè)中包含過(guò)去多少天。get_sequence_data()代碼如下 :

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)

這個(gè)函數(shù)有兩個(gè)參數(shù):data_up_down 和 lookback。 它返回一個(gè)新的 NumPy 數(shù)組,該數(shù)組表示具有指定窗口大小的 data_up_down 數(shù)組的滑動(dòng)窗口視圖,該窗口大小由 lookback 參數(shù)確定。 為了說(shuō)明這個(gè)函數(shù)是如何工作的,我們看一個(gè)小例子。

get_sequence_data(np.array([1, 2, 3, 4, 5, 6]), 3)

結(jié)果如下:

array([[1, 2, 3],[2, 3, 4],[3, 4, 5],[4, 5, 6]])

在下文中,我們下載 Apple 股票的數(shù)據(jù)并對(duì)其進(jìn)行轉(zhuǎn)換以進(jìn)行建模。 我們使用 10 天的回溯期。

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')

數(shù)據(jù)已經(jīng)準(zhǔn)備完畢了,我們開(kāi)始建模和評(píng)估模型。

建模

將數(shù)據(jù)讀入數(shù)據(jù)并生成測(cè)試和訓(xùn)練數(shù)據(jù)。

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)

邏輯回歸:

該分類器是基于線性的模型,通常用作基線模型。 我們使用scikit-learn的實(shí)現(xiàn):

model_lr = LogisticRegression(random_state = 42)model_lr.fit(X_train,y_train)y_pred = model_lr.predict(X_test)

XGBoost:

XGBoost 是為速度和性能而設(shè)計(jì)的梯度提升決策樹(shù)的實(shí)現(xiàn)。 它屬于樹(shù)提升算法,將許多弱樹(shù)分類器依次連接。

model_xgb = XGBClassifier(random_state = 42)model_xgb.fit(X_train, y_train)y_pred = model_xgb.predict(X_test)

隨機(jī)森林:

隨機(jī)森林構(gòu)建多個(gè)決策樹(shù)。 這種方法稱為集成學(xué)習(xí),因?yàn)槎鄠€(gè)學(xué)習(xí)器是相互連接的,該算法屬于bagging方法。 首字母縮寫(xiě)詞“bagging”代表引導(dǎo)聚合。 這里也使用scikit-learn的實(shí)現(xiàn):

model_rf = RandomForestClassifier(random_state = 42)model_rf.fit(X_train, y_train)y_pred = model_rf.predict(X_test)

評(píng)估

在對(duì)模型進(jìn)行建模和訓(xùn)練之后,我們需要檢查模型在測(cè)試數(shù)據(jù)上的性能。 測(cè)量指標(biāo)是 Recall、Precision 和 F1-Score。 下表顯示了結(jié)果。

文章圖片3

可以看到邏輯分類器(邏輯回歸)和隨機(jī)森林取得了明顯優(yōu)于XGBoost模型的結(jié)果, 這是什么原因呢?這是因?yàn)閿?shù)據(jù)比較簡(jiǎn)單,只有幾個(gè)維度的特征,并且數(shù)據(jù)的長(zhǎng)度也很小,我們所有的模型也沒(méi)有進(jìn)行調(diào)優(yōu)。

總結(jié)

我們這篇文章的主要目的是介紹如何將股票價(jià)格的時(shí)間序列轉(zhuǎn)換為分類問(wèn)題,并且演示如何在數(shù)據(jù)處理時(shí)使用窗口函數(shù)將時(shí)間序列轉(zhuǎn)換為一個(gè)序列,至于模型并沒(méi)有太多的進(jìn)行調(diào)優(yōu),所以對(duì)于效果評(píng)估來(lái)說(shuō)越簡(jiǎn)單的模型表現(xiàn)得就越好。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多