我一直在尝试使用 python 中的hmmlearn 包来构建一个预测时间序列值的模型。我的代码基于这篇文章,详细说明了如何将包用于股票价格时间序列。
在将模型拟合到大部分时间序列数据并尝试为其余部分构建预测模型后,我遇到了一个问题。该模型总是预测与最可能的结果相同的结果- hmm.score 为测试系列中的每个实例返回相同结果的最高对数似然。此外,它预测的结果是最接近它所拟合的时间序列平均值的结果。它从不偏离。我真的不知道该怎么办。模型有缺陷,还是我做错了什么?
执行预测的代码如下。它将所有可能的结果(定义如下)附加到时间序列中的一系列测试点(测试数据集中的最后 100 个)并评估可能性(使用 hmm.score):
possible_outcomes = np.linspace(-0.1, 0.1, 10)
latency_days = 10
def predict_close_price(time_index):
open_price = actuals_test[time_index]
predicted_frac_change = get_most_probable_outcome(time_index)
return open_price * (1 + predicted_frac_change)
def get_most_probable_outcome(time_index):
previous_data_start_index = max(0, time_index - latency_days)
previous_data_end_index = max(0, time_index - 1)
prev_start = int(previous_data_start_index)
prev_end = int(previous_data_end_index)
previous_data = test_data[prev_start: prev_end]
outcome_score = []
for possible_outcome in possible_outcomes:
total_data = np.row_stack((previous_data, possible_outcome))
outcome_score.append(hmm.score(total_data))
most_probable_outcome = possible_outcomes[np.argmax(outcome_score)]
print(most_probable_outcome)
return most_probable_outcome
predicted_close_prices = []
actuals_vector = []
for time_index in range(len(actuals_test)-100,len(actuals_test)-1):
predicted_close_prices.append(predict_close_price(time_index))
actuals_vector.append(actuals_test[(time_index)])
我不知道问题出在上述问题上,还是与数据的实际创建和模型本身的拟合有关。这简单地完成如下:
timeSeries.reverse()
difference_fracs = []
for i in range(0, len(timeSeries)-1):
difference_frac = ((timeSeries[i+1] - timeSeries[i])/(timeSeries[i]))
difference_fracs.append(difference_frac)
differences_array = np.array(difference_fracs)
differences_array = np.reshape(differences_array, (-1,1))
train_data_length = 2000
train_data = differences_array[:train_data_length,:]
test_data = differences_array[train_data_length:len(timeSeries),:]
actuals_test = timeSeries[train_data_length:]
n_hidden_states = 4
hmm = GaussianHMM(n_components = n_hidden_states)
hmm.fit(trainData)
我意识到如果没有实际的时间序列,大部分内容都是毫无意义的,我不允许分享 - 尽管如果有人过去遇到过类似的问题,我很想听听你的想法。