基于符号,日期,平均价格的股票预测

时间:2018-11-15 11:12:46

标签: python-3.x pandas machine-learning time-series

我试图根据过去5年的可用数据预测未来7天的股价。数据看起来像这样

Stock Symbol, date, Average Price

我正在尝试在此数据集上应用支持向量回归。我已经使用data.Date = pd.to_datetime(data.Date)将date列转换为pandas datetime,但是仍然出现此错误

float() argument must be a string or a number, not 'Timestamp'

我的代码如下

from sklearn.svm import SVR
adaniPorts = data[data.Symbol == 'ADANIPORTS']

from sklearn.cross_validation import train_test_split
X = adaniPorts[['Symbol', 'Date']]
Y = adaniPorts['Average Price']
x_train, x_test, y_train, y_test = train_test_split(X, Y)

classifier = SVR().fit(x_train, y_train)

有什么方法可以解决日期时间问题?

2 个答案:

答案 0 :(得分:1)

训练SVR时,只能使用数字功能。包含datetime信息的一种方法是使用pd.to_timedelta(df.date).dt.total_seconds(),因此在这种情况下,还向回归器提供了代表日期的数字特征。另一种方法是将日期时间对象的不同字段,年,月,日作为预测变量。

但是,如果这些功能提供了足够的信息来克服时间分量,那么使用SVR进行时间序列预测就更有意义了。

此外,您正在使用train_test_split,它将根据原始数据生成随机训练和测试子集。 这不能直接应用于时间序列数据,因为它假设观测值之间没有关系。在处理时间序列时,必须按照观察值的时间顺序对数据进行拆分。

我建议您也看看Recurrent neural networksARIMA模型

答案 1 :(得分:0)

就像Alexandre的回答一样,仅支持数字功能。如果使用字符串功能,它将自动转换为数字。您有几种选择。第一个就像他一样,将每个日期转换为数字秒,但我认为最好将日期的每个部分转换为单编码。

data['day'] = data.Date.dt.day
data['month'] = data.Date.dt.month
data['year'] = data.Date.dt.year

通过此功能,您可以将日,月和年分开。现在,您可以像一键编码一样进行编码。这是为每个元素构建一个0的向量,然后在您的工作日期填充一个。例如,一个月的第三个月将是:

[0,0,1,0,....,0] -> 1x31

要使用熊猫来做到这一点,您可以使用类似的东西。

data = pd.concat([data, pd.get_dummies(data.year, prefix='year')], axis=1, sort=False)

data = pd.concat([data, pd.get_dummies(data.month, prefix='month')], axis=1, sort=False)

data = pd.concat([data, pd.get_dummies(data.day, prefix='day')], axis=1, sort=False)

添加工作日也可能会很有趣,因为在周末世界是塞子。

data['week_day'] = data.Date.dt.dayofweek

在传递到SVR之前,请先删除Date列。 data.drop(['Date'], axis=1, inplace=True)

我希望这行得通

PS。我建议您为此任务使用LSTM(神经网络)或Arima(统计模型)。