我正在尝试使用 sklearn 预测股票价格。我是新来的预测。我尝试了来自 sklearn 的示例,用于使用高斯 hmm 进行股票预测。但是 predict 给出了覆盖在价格上的状态序列,并且它还从给定的输入收盘价中获取点。我的问题是如何生成接下来的 10 个价格?
1 回答
您将始终使用最后一个状态来预测下一个状态,因此让我们通过将结束日期更改为 23 日来添加 10 天的输入:
date2 = datetime.date(2012, 1, 23)
您可以仔细检查其余代码,以确保我实际上没有使用未来数据进行预测。这些行的其余部分可以添加到文件的底部。首先,我们想找出给定状态的预期回报是多少。model.means_ 数组有回报,这两个都是让我们进入这个状态的回报,而不是你想要的未来回报。为了获得未来的回报,我们考虑进入 5 个状态中的任何一个的概率,以及这些状态的回报是多少。我们从 model.transmat_ 矩阵中获得进入任何特定状态的概率,对于每个状态的返回,我们使用 model.means_ 值。我们采用点积来获得特定状态的预期回报。然后我们删除卷数据(如果需要,您可以保留它,
expected_returns_and_volumes = np.dot(model.transmat_, model.means_)
returns_and_volumes_columnwise = zip(*expected_returns_and_volumes)
returns = returns_and_volumes_columnwise[0]
如果您打印returns[0] 的值,您将看到状态0 的预期回报(美元),状态1 的returns[1] 等。现在,给定一天和一个状态,我们想要预测明天的价格. 您说 10 天,所以让我们将其用于 lastN。
predicted_prices = []
lastN = 10
for idx in xrange(lastN):
state = hidden_states[-lastN+idx]
current_price = quotes[-lastN+idx][2]
current_date = datetime.date.fromordinal(dates[-lastN+idx])
predicted_date = current_date + datetime.timedelta(days=1)
predicted_prices.append((predicted_date, current_price + returns[state]))
print(predicted_prices)
如果您在“生产”中运行它,您会将 date2 设置为您拥有的最后一个日期,然后 lastN 将为 1。请注意,我没有考虑 predict_date 的周末。
这是一个有趣的练习,但您可能不会在生产中运行它,因此引用了引号。首先,时间序列是原始价格;这应该是百分比回报或对数回报。另外,没有理由为 HMM 选择 5 个状态,或者 HMM 甚至可以解决这种问题,我对此表示怀疑。他们可能只是把它作为一个例子。我认为另一个使用 PCA 的 sklearn 示例更有趣。