Python使用线性回归实现对股票的预测

Python使用线性回归实现对股票的预测

使用的股票数据从大型数据网站www.quandl.com获取,股票数据特征包括:开盘价(Open)、最高价(High)、最低价(Low)、收盘价(Close)、交易额(Volume)及调整后的开盘价(Adj.Open)、最高价(Adj.High)、最低价(Adj.Low)、收盘价(Adj.Close)和交易额(Adj.Volume)
一、获取数据.
首先在quandl网站注册账号,有一个专属key用于获取网站海量数据。
本次使用google股票数据,获取数据代码如下:

# 线性回归股票预测
from datetime import datetime
import quandl
import math
from sklearn import preprocessing  #包提供几种常用的效用函数及转换器类,用于更改原始特征向量表示形式以适应后续评估量。
import numpy as np

# 从quandl处 获取数据
quandl.ApiConfig.api_key = '这里填写自己的key值';
df = quandl.get('WIKI/GOOGL');
print (df.columns.tolist())  #输出所有的列

输出
在这里插入图片描述
二、数据处理

# 定义预测列标签名 存放研究对象的标签名
forecast_col = 'Adj. Close';
# 定义预测天数 这里取所有数据量长度的百分之1
forecats_count = math.ceil(len(df)*0.01)
# z只用到以下字段
df = df[['Adj. Open','Adj. High','Adj. Low','Adj. Close','Adj. Volume']];
print(df);
# 构造两个新的列  HL_PCT为股票最高价与最低价变化百分比  PCT_Change为股票收盘价与开盘价的变化百分比
df['HL_PCT'] = (df['Adj. High']-df['Adj. Low'])/df['Adj. Close']*100;
df['PCT_Change'] = (df['Adj. Close']-df['Adj. Open'])/df['Adj. Open']*100;
# 真正用到的特征字段如下
df = df[['Adj. Close','HL_PCT','PCT_Change','Adj. Volume']];
print(df.head());
# sklearn并不会处理空值 这里将空值全部填充为比较难出现的值 这里填-99999  增加inplace=True 填充的作用将改变数据源 否则不改变数据源
df.fillna(-99999,inplace=True);
# 增加label字段表示预测结果 即y   用df['Adj. Close']向前移动forecats_count来进行表示
df['label'] = df[forecast_col].shift(forecats_count);

三、生成X y以及预测用到的X_lately

X = np.array(df.drop(['label'],axis=1)); #axis=1  表示删除这一列
X = preprocessing.scale(X); #对数据进行规范化处理 示其服从正态分布
# 上面生成label时  留下%1行没有数据  所有其对应的其他数据可以作为预测时的输入数据
X_lately = X[-forecats_count:];
X = X[:-forecats_count];
df.dropna(inplace=True); # 抛弃那些 label列为空的行   之前已经填充过了  所以现在只有label有空的
y = np.array(df['label']);

四、机器学习

from sklearn.linear_model import LinearRegression
from sklearn import model_selection,svm
# 将X y 分为训练集和测试集合
X_train,X_test,Y_train,Y_test = model_selection.train_test_split(X,y,test_size=0.2,random_state=1)
# 训练
lr = LinearRegression();
lr.fit(X_train,Y_train);# 训练
accuracy = lr.score(X_test,Y_test);# 用测试数据评估准确性
print("输出评估值",accuracy);
# 进行预测
forecats_set = lr.predict(X_lately);
print("预测值",forecats_set);
print("截距",lr.intercept_);
print("系数",lr.coef_);

输出
在这里插入图片描述
五、画图显示

import matplotlib.pyplot as plt
from matplotlib import style
# 修改matplotlib样式
style.use('ggplot');
one_day = 86400; #86400秒 代表24小时
# 在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字段其他全部设置为nan
for value in forecats_set:
    next_date = datetime.fromtimestamp(next_unix);
    next_unix += one_day;
    # [np.nan for _ in range(len(df.columns)-1]生成不包含Forecast字段的列表
    # [value] 是只包含Forecast值的列表
    df.loc[next_date] = [np.nan for _ in range(len(df.columns)-1)]+[value];
# 绘制图形
df["Adj. Close"].plot();
df["Forecast"].plot();
plt.legend(loc=4);  #loc参数设置图例的显示位置的
plt.xlabel('Date');
plt.ylabel('Price');
plt.show();

输出
在这里插入图片描述
图中的曲线部分为历史数据,最上部的竖直线部分为预测数据

猜你喜欢

转载自blog.csdn.net/weixin_44235109/article/details/106122496