机器学习预测股票价格

作者: drmeng 分类: Python,人工智能 发布时间: 2019-10-21 21:27

在这里,将在下面的predictStockByLR.py范例程序中,根据股票历史的开盘价、收盘价和成交量等特征值,从数学角度来预测股票未来的收盘价。
1 # !/usr/bin/env python

2 # coding=utf-8

3 import pandas as pd

4 import numpy as np

5 import math

6 import matplotlib.pyplot as plt

7 from sklearn.linear_model import LinearRegression

8 from sklearn.model_selection import train_test_split

9 # 从文件中获取数据

10 origDf = pd.read_csv(‘D:/stockData/ch13/6035052018-09-012019-05-31.csv’,encoding=’gbk’)

11 df = origDf[[‘Close’, ‘High’, ‘Low’,’Open’ ,’Volume’]]

12 featureData = df[[‘Open’, ‘High’, ‘Volume’,’Low’]]

13 # 划分特征值和目标值

14 feature = featureData.values

15 target = np.array(df[‘Close’])
第10行的程序语句从包含股票信息的csv文件中读取数据,在第14行设置了特征值是开盘价、最高价、最低价和成交量,同时在第15行设置了要预测的目标列是收盘价。在后续的代码中,需要将计算出开盘价、最高价、最低价和成交量这四个特征值和收盘价的线性关系,并在此基础上预测收盘价。

16 # 划分训练集,测试集

17 feature_train, feature_test, target_train ,target_test = train_test_split(feature,target,test_size=0.05)

18 pridectedDays = int(math.ceil(0.05 * len(origDf))) # 预测天数

19 lrTool = LinearRegression()

20 lrTool.fit(feature_train,target_train) # 训练

21 # 用测试集预测结果

22 predictByTest = lrTool.predict(feature_test)
第17行的程序语句通过调用train_test_split方法把包含在csv文件中的股票数据分成训练集和测试集,这个方法前两个参数分别是特征列和目标列,而第三个参数0.05则表示测试集的大小是总量的0.05。该方法返回的四个参数分别是特征值的训练集、特征值的测试集、要预测目标列的训练集和目标列的测试集。

第18行的程序语句计算了要预测的交易日数,在第19行中构建了一个线性回归预测的对象,在第20行是调用fit方法训练特征值和目标值的线性关系,请注意这里的训练是针对训练集的,在第22行中,则是用特征值的测试集来预测目标值(即收盘价)。也就是说,是用多个交易日的股价来训练lrTool对象,并在此基础上预测后续交易日的收盘价。至此,上面的程序代码完成了相关的计算工作。

23 # 组装数据

24 index=0

25 # 在前95%的交易日中,设置预测结果和收盘价一致

26 while index < len(origDf) – pridectedDays:

27 df.ix[index,’predictedVal’]=origDf.ix[index,’Close’]

28 df.ix[index,’Date’]=origDf.ix[index,’Date’]

29 index = index+1

30 predictedCnt=0

31 # 在后5%的交易日中,用测试集推算预测股价

32 while predictedCnt<pridectedDays:

33 df.ix[index,’predictedVal’]=predictByTest[predictedCnt]

34 df.ix[index,’Date’]=origDf.ix[index,’Date’]

35 predictedCnt=predictedCnt+1

36 index=index+1
在第26行到第29行的while循环中,在第27行把训练集部分的预测股价设置成收盘价,并在第28行设置了训练集部分的日期。

在第32行到第36行的while循环中,遍历了测试集,在第33行的程序语句把df中表示测试结果的predictedVal列设置成相应的预测结果,同时也在第34行的程序语句逐行设置了每条记录中的日期。

37 plt.figure()

38 df[‘predictedVal’].plot(color=”red”,label=’predicted Data’)

39 df[‘Close’].plot(color=”blue”,label=’Real Data’)

40 plt.legend(loc=’best’) # 绘制图例

41 # 设置x坐标的标签

42 major_index=df.index[df.index%10==0]

43 major_xtics=df[‘Date’][df.index%10==0]

44 plt.xticks(major_index,major_xtics)

45 plt.setp(plt.gca().get_xticklabels(), rotation=30)

46 # 带网格线,且设置了网格样式

47 plt.grid(linestyle=’-.’)

48 plt.show()
在完成数据计算和数据组装的工作后,从第37行到第48行程序代码的最后,实现了可视化。

第38行和第39行的程序代码分别绘制了预测股价和真实收盘价,在绘制的时候设置了不同的颜色,也设置了不同的label标签值,在第40行通过调用legend方法,根据收盘价和预测股价的标签值,绘制了相应的图例。

来自:https://www.cnblogs.com/JavaArchitect/p/11717998.html