【发布时间】:2022-07-16 04:38:52
【问题描述】:
我试图模糊地重现这篇论文的结果: https://users.cs.duke.edu/~bdhingra/papers/stock_hmm.pdf 在 python 中使用 HMMLEARN 包。 简而言之,这篇论文是关于使用高斯混合隐马尔可夫模型 (GMHMM) 来预测股票在给定日期的开盘价的情况下的收盘价。更详细地说,作者使用股票的开盘价、最高价、最低价和收盘价的历史数据来定义分数变化向量:
然后,他们在给定历史数据的情况下训练 GMHMM,最后使用最大后验 (MAP) 方法在观察给定日期和前一天的 Open 值后预测下一个 Close 值n天(特别是他们需要 n=10 天)。在数学上,这相当于最大化问题:
关于最后一步,在实践中,他们离散化三个变量 fracChange、fracHigh 和 fracLow 的可能值的空间,使用前向后向算法对所有可能的离散值估计对数似然,并选择最大化它的那个作为第 d+1 天观察向量值的预测。
现在谈谈我的问题。在 python 中,我首先适当地加载和重塑历史数据(从 Yahoo Finance 下载历史数据,如在 2003 年 2 月 10 日至 2004 年 9 月 10 日之间的 Apple 股票论文中用于训练集和 2004 年 9 月 13 日至 2005 年 1 月 21 日之间用于测试集,都作为名为“AAPL_train_set.csv”和“AAPL_test_set.csv”的csv文件),然后成功地为历史数据训练了一个GMHMM。然后,我构建了一个离散化的第二天预测列表,并给出了前 10 天的观察值,我想从列表中选择一个最大化对数似然的值。然而,无论前 10 天的数据如何选择,我对第二天的预测总是相同,这是没有意义的。为了计算概率,我使用函数scores()。详细来说,这是我的代码:
import numpy as np
import pandas as pd
from hmmlearn import hmm
# Load train data and process. Set correct filepath
filepath_train= "...(link to).../AAPL_train_set.csv"
df_train=pd.read_csv(filepath_train)
obs_train_unprocessed=df_train[["Open", "High", "Low", "Close"]]
trainData=pd.DataFrame({'fracChange':(obs_train_unprocessed["Open"]-obs_train_unprocessed["Close"])/obs_train_unprocessed["Open"], 'fracHigh':(obs_train_unprocessed["High"]-obs_train_unprocessed["Open"])/obs_train_unprocessed["Open"], 'fracLow':(obs_train_unprocessed["Open"]-obs_train_unprocessed["Low"])/obs_train_unprocessed["Open"]})
trainData=pd.DataFrame(trainData).to_numpy()
# Load test data and process
filepath_test="...(link to).../AAPL_test_set.csv"
df_test=pd.read_csv(filepath_train)
obs_test_unprocessed=df_test[["Open", "High", "Low", "Close"]]
testData=pd.DataFrame({'fracChange':(obs_test_unprocessed["Open"]-obs_test_unprocessed["Close"])/obs_test_unprocessed["Open"], 'fracHigh':(obs_test_unprocessed["High"]-obs_test_unprocessed["Open"])/obs_test_unprocessed["Open"], 'fracLow':(obs_test_unprocessed["Open"]-obs_test_unprocessed["Low"])/obs_test_unprocessed["Open"]})
testData=pd.DataFrame(testData).to_numpy()
# Train the model
model = hmm.GMMHMM(n_components=3, n_mix=3, covariance_type="full", n_iter=1000)
modelTrained=model.fit(trainData)
# List of potential prediction values
potential_prediction = [np.linspace(-0.1,0.1,51), np.linspace(0, 0.1, 11), np.linspace(0, 0.1, 11)]
list_of_potential_predictions = [[None,None,None]]
for x in potential_prediction[0]:
for y in potential_prediction[1]:
for z in potential_prediction[2]:
list_of_potential_predictions=np.append(list_of_potential_predictions, [[x,y,z]], axis=0)
list_of_potential_predictions = np.delete(list_of_potential_predictions, (0), axis=0)
# For the test set and a window of 10 days, I choose the most probable value from the list of potential predictions by employing the .score() method.
predictions=[]
for j in range(5):
scores=[]
for i in list_of_potential_predictions:
scores= np.append(scores, modelTrained.score(np.vstack([testData[j:(j+10), 0:3], [i]])))
maxScoreIndex=np.where(scores == np.amax(scores))
predictions=np.append(predictions,list_of_potential_predictions[maxScoreIndex])
但是,无论过去的数据是什么,我得到的所有预测都是相同的。在这一点上,我很困惑,不确定我的代码是否有错误,或者我滥用了 HMMLEARN 包中的“.score()”方法。有人可以帮我解决这个问题吗? 提前谢谢你。
【问题讨论】:
标签: python prediction hmmlearn