我正在创建一个基本的应用程序来预测日n+1股票的“收盘价”,给出了使用Python和Scikit-learn的股票n的特性。
我的dataframe中的一个示例行看起来如下(2000行)
Open Close High Low Volume
0 537.40 537.10 541.55 530.47 52877.98
类似于这段视频,他使用的是“日期”和“公开价格”。在本例中,日期是功能,开放价格是目标。
在我的示例中,我的数据集中没有“日期”值,而是希望使用Open、High、Low数据作为特性,因为我认为这样会使其更准确
我定义了我的特征和目标
features = df.loc[:,df.columns != 'Closing']
targets = df.loc[:,df.columns == 'Closing']
它将返回如下特性的df:
Open High Low Vol from
29 670.02 685.11 661.09 92227.36
目标:
Close
29 674.57
然而,我意识到数据需要放在一个numpy数组中,所以我现在得到了如下所示的特性和目标
features = df.loc[:,df.columns != 'Closing'].values
targets = df.loc[:,df.columns == 'Closing'].values
所以现在我的特征是这样的
[6.70020000e+02 6.85110000e+02 6.61090000e+02 9.22273600e+04
6.23944806e+07]
[7.78102000e+03 8.10087000e+03 7.67541000e+03 6.86188500e+04
5.41391322e+08]
我的目标是这样的
[ 674.57]
[ 8042.64]
然后,我使用
X_training, X_testing, y_training, y_testing = train_test_split(features, targets, test_size=0.8)
我尝试遵循Scikit-Learn文档,这导致了以下结果
svr_rbf = svm.SVR(kernel='rbf', C=100.0, gamma=0.0004, epsilon= 0.01 )
svr_rbf.fit(X_training, y_training)
predictions = svr_rbf.predict(X_testing)
print(predictions)
我假设这将预测给定测试特性的Y值,然后我可以根据实际的y_testing值绘制Y值,以查看它们有多相似。但是,对于每个X_testing特性,预测结果都打印出相同的值。
[3763.84681818 3763.84681818 3763.84681818 3763.84681818 3763.84681818
我试过改变epsilon,c和gamma的值,但这似乎并没有改变这样一个事实,即预测总是给出相同的值
我知道预测股票价格可能不准确,但当我将模型应用于各种不同的测试数据时,我肯定做错了什么来获得相同的值。
发布于 2019-03-03 04:56:05
有几个部分我认为改变会有帮助。
首先,一个通用的模型构建:我建议您在将数据放入模型之前进行缩放。
它可能不会直接解决在每个步骤中接收相同的预测值的问题,但您可能会注意到,您的预测位于输入值的某个范围内--因为您使用的是未缩放的卷,这将使模型变得很困难。它本质上必须同时在两个不同的尺度上工作,这是不能做得很好的。
查看一下标准标度技术,了解如何做到这一点。
接下来,一些要改变的事情的建议,特别是因为你在处理股票价格:
我通常会预测明天股票市场的价值,而不是你使用公开/高/低/成交量的相同数据的收盘价。对我来说,只有当你有高频(日内)数据时,这才有意义。考虑到这一点,您将需要将y
值移动一步。有一个方法在Pandas DataFrames上提供帮助.,但是由于您没有date
列,而且您只需要按一个时间步移动,您可以这样做:
features = df.loc[:-1, df.columns != 'Closing'].values # leave out last step
targets = df.loc[1:, df.columns == 'Closing'].values # start one step later
然后,您甚至可以预测第二天的开盘价格,或者将closing
数据保存在features
数据中,因为这不会带来时间偏差。
一些需要更多设置的东西,将是查看您的数据洗牌。同样,因为您希望使用历史值来预测未来的值,所以您需要将相关的历史值放在一起。看看我对这个问题的另一个答案和图表,它解释了更多关于这个想法的内容。
您还应该缩放y_train
和y_test
,以便模型知道在此范围内进行预测。使用相同的StandardScaler
实例执行此操作,以避免引入偏差。有一个看这个简短的教程。然后,您的预测将在相同的范围内(例如[-1, +1]
)。您也可以在该范围内计算错误。如果你真的想要的话,你可以把你的预测缩小到原来的范围,这样看起来就更现实了,但这并不是验证模型的真正必要。你可以简单地在缩放的空间里,根据地面的真实来绘制预测。
看看这个线程,它解释了为什么您应该在测试数据上使用相同的StandardScaler
实例的原因。
https://datascience.stackexchange.com/questions/46575
复制