机器学习:回归分析——基于线性回归的股票预测

基于线性回归的股票预测

数据获取

我们可以从https://data.nasdaq.com/ 获取股票数据集,每个ip访问quandl有次数(50次)的限制,如果访问次数比较多的话,可以到官网注册一个账号。个人可以注册获取一个api密钥下载上面的数据集。

#先安装quandl包
import quandl
#这里我们用这个数据集
df = quandl.get('WIKI/AAPL')
df.head()

在这里插入图片描述

数据预处理

现在我们的目标是要根据High,Low,Close以及Volumn列来预测Close

由上面的数据集可以看到带Adj前缀的数据是除权后的数据(除权,是由于公司“股本”增加,每股股票所代表的企业实际价值(每股净资产)有所减少(即被摊薄),需要在发生该事实之后,从股票市场价格中剔除这部分因素,而形成的价格剔除行为。)
所以我们主要使用的数据特征为调整后的指标开盘价(Adj.Open)、最高价(Adj.High)、最低价(Adj.Low)、收盘价(Adj.Close)、交易额(Adj.Volume),这里需要知道两个数据特征:
在这里插入图片描述
因此,自变量为:Adj.Open、HL_PCT、PCT_change、Adj.Volume因变量为:Adj.Close

但是我们需要对自变量数据进行规范化处理,使之服从正态分布(数据标准化的目的也是因为数据的单位背景不一,因此只有统一到一个标准下才具有可比性),数据标准化需要用到sklearn.preprocessing 的scale()函数

编码实现

#导入相关包
import quandl
import math
import numpy as np
import pandas as pd
from sklearn import preprocessing
from sklearn import model_selection,svm
from sklearn.linear_model import LinearRegression
import matplotlib.pyplot as plt
from matplotlib import style
import time,datetime


data = quandl.get('WIKI/AAPL')
#定义预测列变量forecast_col,也就是收盘价
forecast_col = 'Adj. Close'
#定义预测的天数forecast_out,也就是预测的数据长度,这里设置为所有数据的1%,得到的是一个整数
#math.ceil(x) 返回不小于x的最接近的整数
forecast_out = int(math.ceil(0.01*len(data)))
#选取只用到的几列
data = data[['Adj. Open','Adj. High','Adj. Low','Adj. Close','Adj. Volume']]
#构造特征数据HL_PCT、PCT_change
data['HL_PCT'] = (data['Adj. High'] - data['Adj. Low'])/data['Adj. Low'] * 100.0
data['PCT_change'] = (data['Adj. Close'] - data['Adj. Open'])/data['Adj. Open'] * 100.0

#选取真正用到的字段
data = data[['Adj. Close','HL_PCT','PCT_change','Adj. Volume']]
#空值预处理,这里的处理方法是将空值设置为一个比较难出现的值
data.fillna(-99999,inplace = True)

#将Adj. Close列数据往前移动1%行,也就是前forecast_out行数据舍掉,剩下后99%的数据往前移动
#shift()函数,用于对dataframe中的数整体上移或下移,当为正数时,向下移。当为负数时,向上移。
data['label'] = data[forecast_col].shift(-forecast_out)
data.to_csv("F:\小组\Python\stock_regression.csv")
data.head()
data.drop(['label'],1)

在这里插入图片描述
在这里插入图片描述

#现在生成真正要用到的模型中去的数据X、y以及预测时要用到的数据X_lately
X = np.array(data.drop(['label'],1))
#数据规范化
X = preprocessing.scale(X)
#将X中后1%行数据作为待预测数据
X_lately = X[-forecast_out:]
#X则取前99%的数据
X = X[:-forecast_out]
#抛弃label列中为空的那些行
data.dropna(inplace = True)
#生成对应X的y的数据
y = np.array(data['label'])
# 机器学习模型训练拟合部分

#将数据分割成训练集和测试集
X_train,X_test,y_train,y_test = model_selection.train_test_split(X,y,test_size = 0.2)

#生成Scikit-Learn的线性回归对象
#这里n_jobs表示使用CPU的个数,当为-1时,代表使用全部的CPU
clf = LinearRegression(n_jobs = 1)

#开始训练
clf.fit(X_train,y_train)

#评估准确性
accuracy = clf.score(X_test,y_test)

#进行预测,forecast_set是预测结果
forecast_set = clf.predict(X_lately)
'''
预测部分处理及可视化
'''
#修改matplotlib样式
style.use('ggplot')  #ggplot是背景网格
one_day = 86400#一天等于86400秒

#在data中新建列Forecast,用于存放预测结果的数据
data['Forecast'] = np.nan

#取data最后一行的时间索引
last_date = data.iloc[-1].name
#转化为时间戳
last_unix = last_date.timestamp()
#time.mktime(time.strptime(last_date,"%Y/%m/%d"))
#加一天的时间,跳转到下一天
next_unix = last_unix + one_day
#遍历预测结果,用它向data中追加行

#这些行除了Forecast字段,其他都设为np.nan
for i in forecast_set:
    #此命令是时间戳转成时间,得到的类型也是datetime类型 ,类似于“2017-11-08 08:00:00”
    next_date = datetime.datetime.fromtimestamp(next_unix)
    next_unix += one_day
    #这里要用定位的话应该是字符串,所以这里的格式还应该经过测试之后再索引
    #strftime()函数用来截取时间
    #[np.nan for _ in range(len(data.columns)-1)]生成不包含Forecast字段的列表
    data.loc[next_date.strftime("%Y/%m/%d")] = [np.nan for _ in range(len(data.columns)-1)] + [i]
data['Adj. Close'].plot()
data['Forecast'].plot()
plt.legend(loc = 1)
plt.xlabel('Date')
plt.ylabel('Price')
plt.show()   

在这里插入图片描述
图中的曲线部分主要为历史数据,最上部的数显部分为预测数据

df = data.iloc[data.shape[0]-1000-1:data.shape[0]-1] #获取后1000行数据,绘制详细图
df['Adj. Close'].plot()
df['Forecast'].plot()
plt.legend(loc = 1)
plt.xlabel('Date')
plt.ylabel('Price')
plt.show()

在这里插入图片描述

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值