本篇文章使用Linear Regression模型对Google股票的Adj. Close指标进行模拟预测。并对预测结果进行可视化展示。Google股票数据来自quandl库,需要单独安装。以下是完整的处理和预测过程及python源码。
![Us-stock-price-news-update](https://i-blog.csdnimg.cn/blog_migrate/f3469ed4bd00a5bba26148425df6717f.png)
开始前的准备工作
首先是导入所需的库文件,这里quandl是一个开放的大数据资源, 已经集成了7百万个数据集,可以查到很多公开的金融和社会统计数据。我们的Google股票数据就来着这里。
#导入库文件
import datetime
import numpy as np
import pandas as pd
import quandl, math
from sklearn import cross_validation
from sklearn.linear_model import LinearRegression
import matplotlib.pyplot as plt
from matplotlib import style
设置可视化图表风格。
#设置图表风格
style.use('ggplot')
下载Google的股票历史数据,并保存为df数据表。
#下载google历史数据
df = quandl.get("WIKI/GOOGL")
查看下载下来的数据集,共包含12个字段,开盘价,收盘价等信息。我们希望通过模型对Adj.Close字段进行预测。
#查看数据
df.head()
对Adj. Close字段的历史数据进行可视化,从2015年到2017年基本为线性增长。
#查看Google的Adj. Close变化趋势
df['Adj. Close'].plot()
plt.show()
划分训练集,测试集和预测数据
我们将2005年到2017年的Google股票数据划分为三部分,首先,取其中的1%模拟新进数据,使用模型对这1%的数据进行预测,获得Adj. Close的预测值。剩下的99%历史数据我们按常规方法划分为训练集和测试集,训练集用于对线性模型进行拟合训练,测试集数据则用来评估模型表现。
第一步划分用于测试的数据,计算Google股票历史数据1%的数值,然后从后向前提取出这1%的数据,保留用于后面的预测。
#提取历史数据的后1%用来进行预测
#计算历史数据1%的数值
forecast = int(math.ceil(0.01 * len(df)))
#提取历史数据的后1%作为预测数据。
forecast_df = df[-forecast:]
#预测数据表维度
forecast_df.shape
(33, 12)
从前向后提取Google股票历史数据中剩余的99%,将这部分数据划分为训练集和测试集。
#提取历史数据的剩余部分用来训练和测试模型表现
google_df = df[:-forecast]
#查看剩余数据的维度
google_df.shape
(3242, 12)
将Google股票历史数据中除Adj. Close以外的字段设置为特征X。
#把label以外的字段作为特征X
X = np.array(google_df.drop(['Adj. Close'], 1))
将Adj. Close字段设置为预测目标值y
#设置Adj. Clos字段为目标值y
y = np.array(google_df['Adj. Close'])
划分训练集和测试集数据,其中训练集数据占比80%,测试集数据占比为20%。
#划分训练集和测试集,测试集占比20%,训练集占比80%
X_train, X_test, y_train, y_test = cross_validation.train_test_split(X, y, test_size=0.2)
训练模型并进行预测
使用训练集数据对模型进行训练,并使用测试集对模型进行评估,获得准确率得分。
#使用训练集数据对模型进行训练
clf = LinearRegression(n_jobs=-1)
clf.fit(X_train, y_train)
#使用测试集数据层查看模型准确率得分
confidence = clf.score(X_test, y_test)
print(confidence)
0.999986275958
使用模型对前面预留的1%数据进行预测,获得Adj. Close的预测值。
#对1%的预留数据进行预测
f_X=np.array(forecast_df.drop(['Adj. Close'], 1))
forecast_set = clf.predict(f_X)
预测结果可视化
最后,我们将预测值拼接到历史数据中,并对Adj. Close数据的历史数据和预测数据进行可视化。首先在历史数据表中单独创建一个名为Forecast的字段,用于存放预测结果。
#创建一个Forecast列存放预测值
google_df['Forecast'] = np.nan
然后设置日期信息,首先获得历史数据表中最后一天的日期信息。
#查看数据表中最后一条数据的日期
last_date = google_df.iloc[-1].name
将最后一天的日期信息转化为秒的格式,便于后面的计算。
#将最后一条数据的日期转化为秒
last_unix = last_date.timestamp()
设置一天的时间为86400秒。
#一天等于86400秒
one_day = 86400
下一天的计算方法为当前日期数值加上一个整天的86400秒。
#下一天=数据表最后一天日期数值+一天的秒数值
next_unix = last_unix + one_day
循环将每一天的日期信息和Adj. Close字段的预测值写入到Google股票历史数据表中。首先按当前数据表中的最后一天的数值增加86400秒来获得新的一天的日期信息,然后将Adj. Close的预测数值写入到Forecast字段中。
#循环输出日期及预测值
for i in forecast_set:
#下一天的数据秒数
next_date = datetime.datetime.fromtimestamp(next_unix)
#下一天的数据秒数+一天的秒数86400,以更新时间
next_unix += 86400
#在下一天的行输入NaN值和预测值
google_df.loc[next_date] = [np.nan for _ in range(len(google_df.columns)-1)]+[i]
完成后分别查看历史数据表的头部和尾部。在历史数据表的头部,Forecast字段的值为空。
#查看预测后的数据表
google_df.head()
在历史数据表的尾部,刚刚在Forecast字段中写入了Adj. Close的预测值。
#查看预测后的数据表
google_df.tail()
使用图表对Adj. Close的历史数据和预测数据进行拼接及可视化,下面图表中,红色部分为99%的历史数据中Adj. Close的变化趋势。蓝色部分为1%的Adj. Close预测数据变化趋势。
#对真实值和预测值可视化
fig = plt.figure(figsize = (12,12))
google_df['Adj. Close'].plot()
google_df['Forecast'].plot()
plt.legend(loc=4)
plt.xlabel('Date')
plt.ylabel('Price')
plt.show()