Python数据挖掘与机器学习实战——3.5 基于线性回归的股票预测

3.5 基于线性回归的股票预测

1.数据获取

我们需要的数据集要通过quandl包获取,Anaconda 3并未默认安装quandl,

需要我们打开Anaconda prompt输入“pip install quandl”进行安装。

通过quandl包可以获取到股票数据

股票特征数据包括:

Open(开盘价)、High(最高价)、Low(最低价)、Close(收盘价)、Volume(交易额)

Adj. Open(调整后开盘价)、Adj. Low(调整后最低价)、Adj. Close(调整后收盘价)、Adj. Volume(调整后交易额)等数据。

import quandl
# 我们需要的数据集要通过quandl包获取
# 安装新的包,需要打开anaconda prompt输入“pip install quandl”进行安装
# Anaconda3中添加quandl库的方法:
#(1)开始——Anaconda——打开Anaconda Prompt
#(2)输入pip install quandl(自动安装)
#(3)输入conda list,检查有无quandl,有则成功
# 关于quandl包可以参考https://zhuanlan.zhihu.com/p/41063833
# 通过prompt安装其他包也是同理
from sklearn import preprocessing
#df = quandl.get('WIKI/GOOGL')  #先注释这一行,预测Google股票时再启用
df = quandl.get('WIKI/AAPL')
print(df)


# 输出结果如下:
              Open    High     Low  ...    Adj. Low  Adj. Close  Adj. Volume
Date                                ...                                     
1980-12-12   28.75   28.87   28.75  ...    0.422706    0.422706  117258400.0
1980-12-15   27.38   27.38   27.25  ...    0.400652    0.400652   43971200.0
1980-12-16   25.37   25.37   25.25  ...    0.371246    0.371246   26432000.0
1980-12-17   25.87   26.00   25.87  ...    0.380362    0.380362   21610400.0
1980-12-18   26.63   26.75   26.63  ...    0.391536    0.391536   18362400.0
...            ...     ...     ...  ...         ...         ...          ...
2018-03-21  175.04  175.09  171.26  ...  171.260000  171.270000   35247358.0
2018-03-22  170.00  172.68  168.60  ...  168.600000  168.845000   41051076.0
2018-03-23  168.39  169.92  164.94  ...  164.940000  164.940000   40248954.0
2018-03-26  168.07  173.10  166.44  ...  166.440000  172.770000   36272617.0
2018-03-27  173.68  175.15  166.92  ...  166.920000  168.340000   38962839.0

[9400 rows x 12 columns]

可以看到获取到AAPL公司股票数据是9400行*12列的

2.数据预处理

由于带Adj.前缀的数据是除权后的数据,更能反映数据特征,所以主要使用的特征数据为:

Adj. Open(调整后开盘价)、Adj. Low(调整后最低价)、Adj. Close(调整后收盘价)、Adj. Volume(调整后交易额)

为了方便数据分析,我们新建两个特征数据如下:

HL_PCT为股票最高价与最低价的变化百分比

HL_PCT = (Adj. High- Adj. Close) / Adj. Close * 100%

PCT_change为股票收盘价与开盘价的变化百分比

PCT_change = (Adj. Close - Adj. Open) / Adj. Open * 100%

我们以Adj. Close(调整后收盘价)、HL_PCT、PCT_change、Adj. Volume(调整后交易额)作为自变量

以Adj. Close(除权后的收盘价)为因变量(也就是我们要预测的值)。

最后,对自变量数据进行规范化处理,只是服从正态分布。(执行一下语句即可处理)

X = preprocessing.scale(X)

然后使用Sklearn做线性回归,建立线性回归模型,进行线性模拟,

使用predict()函数对需要预测的数据进行预测,模型评估主要使用精度(accuracy)参数。调用线性模型中的精度评估参数score()。

from sklearn.linear_model import LinearRegression
# 生成scikit-learn的线性回归对象
clf = LinearRegression(n_jobs=-1)
# 开始训练
clf.fit(X_train, y_train)
# 进行预测
forecast_set = clf.predict(X_lately)
# 用测试数据评估准确性
accuracy = clf.score(X_test, y_test)

3.编码实现

import quandl
# 我们需要的数据集要通过quandl包获取
# 安装新的包,需要打开anaconda prompt输入“pip install quandl”进行安装
# Anaconda3中添加quandl库的方法:
#(1)开始——Anaconda——打开Anaconda Prompt
#(2)输入pip install quandl(自动安装)
#(3)输入conda list,检查有无quandl,有则成功
# 关于quandl包可以参考https://zhuanlan.zhihu.com/p/41063833
# 通过prompt安装其他包也是同理
from sklearn import preprocessing
#df = quandl.get('WIKI/GOOGL')  #先注释这一行,预测Google股票时再启用
df = quandl.get('WIKI/AAPL')

import math
import numpy as np
# 定义预测列变量,它存放研究对象的标签名
forecast_col = 'Adj. Close'
# 定义预测天数,这里设置为所有数据量长度的1%
forecast_out = int(math.ceil(0.01*len(df)))
# 只用到df中下面的几个字段
df = df[['Adj. Open', 'Adj. High', 'Adj. Low', 'Adj. Close', 'Adj. Volume']]
# 构造两个新的列
# HL_PCT为股票最高价与最低价的变化百分比
df['HL_PCT'] = (df['Adj. High'] - df['Adj. Close']) / df['Adj. Close'] * 100.0
# PCT_change为股票收盘价与开盘价的变化百分比
df['PCT_change'] = (df['Adj. Close'] - df['Adj. Open']) / df['Adj. Open'] * 100.0
# 下面为真正用到的特征字段
df = df[['Adj. Close', 'HL_PCT', 'PCT_change', 'Adj. Volume']]
# 因为scikit-learn并不会处理空数据,需要把为空的数据都设置为一个比较难出现的值,这里取-9999,
df.fillna(-99999, inplace=True)
# 用label代表该字段,是预测结果
# 通过让与Adj. Close列的数据往前移动1%行来表示
df['label'] = df[forecast_col].shift(-forecast_out)
# 最后生成真正在模型中使用的数据X和y和预测时用到的数据数据X_lately
X = np.array(df.drop(['label'], 1))
X = preprocessing.scale(X)
# 上面生成label列时留下的最后1%行的数据,这些行并没有label数据,因此我们可以拿他们作为预测时用到的输入数据
X_lately = X[-forecast_out:]
X = X[:-forecast_out]
# 抛弃label列中为空的那些行
df.dropna(inplace=True)
y = np.array(df['label'])
# scikit-learn从0.2版本开始废弃cross_validation,改用model_selection
from sklearn import  model_selection, svm
from sklearn.linear_model import LinearRegression
# 开始前,先X和y把数据分成两部分,一部分用来训练,一部分用来测试
X_train, X_test, y_train, y_test = model_selection.train_test_split(X, y, test_size=0.2)
# 生成scikit-learn的线性回归对象
clf = LinearRegression(n_jobs=-1)

# 开始训练
clf.fit(X_train, y_train)
# 用测试数据评估准确性
accuracy = clf.score(X_test, y_test)

# 进行预测
forecast_set = clf.predict(X_lately)
print(forecast_set, accuracy)
import matplotlib.pyplot as plt
from matplotlib import style
import datetime
# 修改matplotlib样式
style.use('ggplot')
one_day = 86400
# 在df中新建Forecast列,用于存放预测结果的数据
df['Forecast'] = np.nan
# 取df最后一行的时间索引
last_date = df.iloc[-1].name
last_unix = last_date.timestamp()
next_unix = last_unix + one_day
# 遍历预测结果,用它往df追加行
# 这些行除了Forecast字段,其他都设为np.nan
for i in forecast_set:
    next_date = datetime.datetime.fromtimestamp(next_unix)
    next_unix += one_day
    # [np.nan for _ in range(len(df.columns) - 1)]生成不包含Forecast字段的列表
    # 而[i]是只包含Forecast值的列表
    # 上述两个列表拼接在一起就组成了新行,按日期追加到df的下面
    df.loc[next_date] = [np.nan for _ in range(len(df.columns) - 1)] + [i]

# 开始绘图
df['Adj. Close'].plot()
df['Forecast'].plot()
plt.legend(loc=4)
plt.xlabel('Date')
plt.ylabel('Price')
plt.show()

4.结果分析

运行代码可以得到下图。

对GOOGL股票预测精度为:0.9790193056600901,表明预测较好

Python数据挖掘与机器学习实战——3.5 基于线性回归的股票预测_第1张图片

Python数据挖掘与机器学习实战——3.5 基于线性回归的股票预测_第2张图片

对AAPL股票预测精度为:0.9757872096045515,表明预测较好

Python数据挖掘与机器学习实战——3.5 基于线性回归的股票预测_第3张图片

Python数据挖掘与机器学习实战——3.5 基于线性回归的股票预测_第4张图片


可以一起看下这篇文章,写的很不错,推荐下:

https://www.jianshu.com/p/e6b7a61fd63d

 

你可能感兴趣的:(线性回归的股票预测)