Python用GARCH對(duì)ADBL股票價(jià)格時(shí)間序列趨勢(shì)滾動(dòng)預(yù)測(cè)、損失、可視化分析
全文鏈接:https://tecdat.cn/?p=33398
原文出處:拓端數(shù)據(jù)部落公眾號(hào)
金融市場(chǎng)的股票價(jià)格時(shí)間序列分析一直以來(lái)都是投資者和研究者關(guān)注的主題之一。準(zhǔn)確預(yù)測(cè)股票價(jià)格的趨勢(shì)對(duì)于制定有效的投資策略和決策具有重要意義。因此,許多研究人員使用各種統(tǒng)計(jì)方法和模型來(lái)分析和預(yù)測(cè)股票價(jià)格的變動(dòng)。
本文的目標(biāo)是幫助客戶應(yīng)用GARCH模型對(duì)ADBL(ABC Development Bank Limited)股票價(jià)格的時(shí)間序列進(jìn)行分析和預(yù)測(cè),并通過(guò)可視化分析的方式展示結(jié)果。ADBL是尼泊爾地區(qū)最大的商業(yè)銀行之一,其股票價(jià)格波動(dòng)對(duì)投資者和研究者來(lái)說(shuō)具有重要意義。
首先,我們將收集ADBL股票價(jià)格的歷史數(shù)據(jù),并對(duì)其進(jìn)行描述性統(tǒng)計(jì)和可視化分析,以獲取對(duì)股票價(jià)格的初步認(rèn)識(shí)。然后,我們將使用GARCH模型對(duì)ADBL股票價(jià)格的波動(dòng)進(jìn)行建模,并通過(guò)模型參數(shù)的估計(jì)和模型檢驗(yàn)來(lái)驗(yàn)證模型的適應(yīng)性。
接下來(lái),我們將利用已建立的GARCH模型對(duì)ADBL股票價(jià)格的未來(lái)走勢(shì)進(jìn)行預(yù)測(cè)。預(yù)測(cè)結(jié)果將以圖表和可視化方式呈現(xiàn),以便讀者更加直觀地理解和分析。
最后,我們將對(duì)模型的預(yù)測(cè)效果進(jìn)行評(píng)估,并討論模型的局限性和未來(lái)研究的方向。通過(guò)本文的研究,我們希望為投資者和研究者提供一個(gè)有效的工具和方法,幫助他們更好地理解和預(yù)測(cè)ADBL股票價(jià)格的趨勢(shì)。
導(dǎo)入庫(kù)
# 廣義自回歸條件異方差(GARCH模型)from sklearn.model_selection import train_test_splitfrom sklearn.metrics import mean_squared_error ? ? plt.rcParams['figure.figsize'] = (12,6)
這段代碼的主要作用是導(dǎo)入所需的庫(kù)和模塊,為接下來(lái)的數(shù)據(jù)處理、圖表繪制和模型評(píng)估等操作提供必要的工具和函數(shù)。
導(dǎo)入數(shù)據(jù)
# df = df[df['Date'] >= '2015-01-01']df.head() ? ? ? ?
這段代碼主要是導(dǎo)入數(shù)據(jù)并對(duì)數(shù)據(jù)進(jìn)行處理的操作。具體而言,代碼的功能如下:
pd.read_csv('ADBL_data.csv')
: 使用?pandas
?庫(kù)的?read_csv()
?函數(shù)讀取名為 "ADBL_data.csv" 的 CSV 文件,并將數(shù)據(jù)加載到一個(gè)名為?df
?的數(shù)據(jù)框(DataFrame)中。df['Date'] = pd.to_datetime(df.Date)
: 將?df
?數(shù)據(jù)框中的 "Date" 列轉(zhuǎn)換為日期時(shí)間類型。這里使用?pd.to_datetime()
?函數(shù)將日期字符串轉(zhuǎn)換為日期時(shí)間格式。# df = df[df['Date'] >= '2015-01-01']
: 這一行代碼是對(duì)數(shù)據(jù)進(jìn)行篩選的注釋,表示根據(jù)日期進(jìn)行過(guò)濾,只保留日期大于等于 "2015-01-01" 的數(shù)據(jù)。注釋符號(hào)?#
?表示該行代碼不會(huì)被執(zhí)行。df.head()
: 打印輸出?df
?數(shù)據(jù)框的前幾行數(shù)據(jù),默認(rèn)顯示前5行。通過(guò)調(diào)用?head()
?方法可以快速查看數(shù)據(jù)框的結(jié)構(gòu)和內(nèi)容。
綜上所述,這段代碼的作用是讀取名為 "ADBL_data.csv" 的 CSV 文件,并將其加載到名為?df
?的數(shù)據(jù)框中。然后對(duì)數(shù)據(jù)進(jìn)行了格式轉(zhuǎn)換并打印出前幾行的數(shù)據(jù)。?

"ADBL的時(shí)間序列圖"
plt.ylabel("Price")plt.show()

df.reset_index(drop=True, inplace=True)df

df.returns.plot() plt.show()

df.returns.describe()

? ? # "平方股票收益的自相關(guān)圖"plot_acf(df.returns**2)plt.show() ? ?

從ACF圖中可以看出,在1個(gè)滯后時(shí)間步長(zhǎng)內(nèi),方差存在顯著的正相關(guān)關(guān)系。
識(shí)別 p 和 q
# 基于最小AIC確定的最佳p和q項(xiàng)for p in range(1, 15): ?for q in range(1, 15): ? ?try: ? ? print(f'GARCH order is ({p}, {q})') ? ?

?這段代碼的主要功能是基于最小化赤池信息準(zhǔn)則(AIC)來(lái)確定 GARCH 模型的最佳 p 和 q 值。具體而言,代碼的執(zhí)行過(guò)程如下:
創(chuàng)建一個(gè)空字典?
dict_aic
,用于保存每個(gè)不同 p 和 q 值組合對(duì)應(yīng)的 AIC 值。使用兩個(gè)嵌套的循環(huán)遍歷從 1 到 14 的所有整數(shù)值。外層循環(huán)控制 p 值的范圍,內(nèi)層循環(huán)控制 q 值的范圍。
在每次循環(huán)迭代中,嘗試構(gòu)建一個(gè) GARCH 模型,其中 vol 參數(shù)設(shè)為 'Garch',p 參數(shù)設(shè)為當(dāng)前的外層循環(huán)變量 p,q 參數(shù)設(shè)為當(dāng)前的內(nèi)層循環(huán)變量 q。
如果成功擬合模型,則計(jì)算該模型的 AIC 值,并將其保存到?
dict_aic
?字典中對(duì)應(yīng)的鍵值對(duì)中,鍵為 (p, q),值為 AIC 值。
綜上所述,這段代碼的作用是通過(guò)遍歷多個(gè) p 和 q 值的組合,并擬合 GARCH 模型來(lái)計(jì)算對(duì)應(yīng)的 AIC 值。然后,基于最小 AIC 值確定最佳的 p 和 q 值,并輸出結(jié)果。
訓(xùn)練/測(cè)試分割
# 將訓(xùn)練集和測(cè)試集按照70/30的比例分割st.shape)

模型訓(xùn)練
model.summary()

?這段代碼的目的是使用 GARCH 模型對(duì)訓(xùn)練數(shù)據(jù)進(jìn)行擬合,并打印出模型的摘要信息。
具體而言,代碼的執(zhí)行流程如下:
創(chuàng)建一個(gè) GARCH 模型對(duì)象并將其賦值給變量?
model
,其中?X_train
?是作為訓(xùn)練數(shù)據(jù)的輸入。vol='Garch'
?表示使用 GARCH 方式進(jìn)行建模。p
?和?q
?是 GARCH 模型中的參數(shù),分別表示 ARCH 部分和 GARCH 部分的滯后階數(shù)。
綜上所述,這段代碼的作用是創(chuàng)建一個(gè) GARCH 模型對(duì)象并使用訓(xùn)練數(shù)據(jù)進(jìn)行擬合,然后打印出模型的摘要信息,以便查看模型擬合的結(jié)果和相關(guān)統(tǒng)計(jì)指標(biāo)。
測(cè)試集上的滾動(dòng)預(yù)測(cè)
# 基于滾動(dòng)測(cè)試集預(yù)測(cè)波動(dòng)性。forecasts = list()for i in range(X_test.shape[0]): ? ?forecasts.appe
這段代碼的目的是基于滾動(dòng)測(cè)試集預(yù)測(cè)波動(dòng)性。
具體而言,代碼的執(zhí)行流程如下:
創(chuàng)建一個(gè)空列表?
forecasts
,用于保存每個(gè)時(shí)間點(diǎn)的波動(dòng)性預(yù)測(cè)結(jié)果。進(jìn)行一個(gè)循環(huán),循環(huán)次數(shù)根據(jù)測(cè)試數(shù)據(jù)的行數(shù)來(lái)確定,每次循環(huán)表示一個(gè)時(shí)間點(diǎn)的波動(dòng)性預(yù)測(cè)。
在每次循環(huán)迭代中,首先獲取用于預(yù)測(cè)的測(cè)試數(shù)據(jù)。通過(guò)?
df.returns[:-(X_test.shape[0] - i)]
?獲取了從開(kāi)始到當(dāng)前循環(huán)迭代索引位置的訓(xùn)練數(shù)據(jù)。創(chuàng)建一個(gè) GARCH 模型對(duì)象,并將預(yù)測(cè)數(shù)據(jù)作為輸入。模型對(duì)象中的?
p
?和?q
?參數(shù)由之前確定的值指定。
綜上所述,這段代碼的作用是在每個(gè)時(shí)間點(diǎn)上,基于滾動(dòng)的測(cè)試數(shù)據(jù)來(lái)預(yù)測(cè)波動(dòng)性。通過(guò)一個(gè)循環(huán),在每次循環(huán)迭代中,根據(jù)當(dāng)前的訓(xùn)練數(shù)據(jù)來(lái)構(gòu)建 GARCH 模型,并使用該模型進(jìn)行波動(dòng)性預(yù)測(cè),將預(yù)測(cè)結(jié)果保存在?forecasts
?列表中。
損失分析
from sklearn.metri# 計(jì)算均方根誤差testScore = mean_sq

# 參考訓(xùn)練集最后一個(gè)指數(shù)的實(shí)際收盤價(jià),根據(jù)預(yù)測(cè)收益生成收盤價(jià)# 今日值 = 昨日值 + (pct_returns * 昨日值) / 100pred_vals = []for i in range(len(forecasts)): ?if pred_vals: ? ?pre# 今日值 = 昨日值 + (pct_returns * 昨日值) / 100testSco

date_range = df['Date'][-X_test.shape[0]:] ? ? plt.title(plt.legend(fontsize=14)plt.show()

?最受歡迎的見(jiàn)解
1.R語(yǔ)言對(duì)S&P500股票指數(shù)進(jìn)行ARIMA + GARCH交易策略
2.R語(yǔ)言改進(jìn)的股票配對(duì)交易策略分析SPY—TLT組合和中國(guó)股市投資組合
3.R語(yǔ)言時(shí)間序列:ARIMA GARCH模型的交易策略在外匯市場(chǎng)預(yù)測(cè)應(yīng)用
4.TMA三均線期指高頻交易策略的R語(yǔ)言實(shí)現(xiàn)
5.r語(yǔ)言多均線量化策略回測(cè)比較
6.用R語(yǔ)言實(shí)現(xiàn)神經(jīng)網(wǎng)絡(luò)預(yù)測(cè)股票實(shí)例
7.r語(yǔ)言預(yù)測(cè)波動(dòng)率的實(shí)現(xiàn):ARCH模型與HAR-RV模型
8.R語(yǔ)言如何做馬爾科夫轉(zhuǎn)換模型markov switching model
9.matlab使用Copula仿真優(yōu)化市場(chǎng)風(fēng)險(xiǎn)