近年来,随着全球经济与股市的快速发展,股票投资成为人们最经常使用的理财方式之一。本文研究的主要目标是利用机器学习技术,应用Python编程语言构建股票预测模型,对我国股票市场进行分析与预测。html
今天主要来回顾的是 移动平均 参考机器之心的文章,对代码进行了中文的解释,同时加入了本身的看法编程
首先来处理一下数据,选用的是来自塔塔饮料的数据集,获取数据的方式能够查看 传送门app
#import packages 导入pandas、numpy库机器学习
import pandas as pd编程语言
import numpy as np学习
#to plot within notebook 绘图的库,若是不是在jupytor里面运行的话第二行能够省略ui
import matplotlib.pyplot as pltspa
%matplotlib inline3d
#setting figure size设定画布大小orm
from matplotlib.pylab import rcParams
rcParams['figure.figsize'] = 20,10
#for normalizing data 数据归一化
from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler(feature_range=(0, 1))
#read the file 读取文件夹,注意这里的数据集要放在同一个文件夹下面
df = pd.read_csv('NSE-TATAGLOBAL(1).csv')
#print the head 打印数据前几行
df.head()
能够观察到数据集中有多个变量——日期(date)、开盘价(open)、最高价(high)、最低价(low)、最后交易价(last)、收盘价(close)、总交易额(total_trade_quantity)和营业额(turnover)。
开盘价和收盘价表明股票在某一天交易的起始价和最终价。
最高价、最低价和最后交易价表示当天股票的最高价、最低价和最后交易价格。
交易总量是指当天买卖的股票数量,而营业额(Lacs)是指某一特定公司在某一特定日期的营业额。
要注意的另外一点是,市场在周末和公共假期休市。注意上表缺失了一些日期值——2/10/201八、6/10/201八、7/10/2018。其中2号是国庆节,6号和7号是周末。
损益的计算一般由股票当日的收盘价决定,所以咱们将收盘价做为目标变量。让咱们画出目标变量来理解它在咱们的数据集中的分布:
#setting index as date 把date这一列做为索引
df['Date'] = pd.to_datetime(df.Date,format='%Y-%m-%d')
df.index = df['Date']
#plot 打印收盘价(按照上面的索引来)
plt.figure(figsize=(16,8))
plt.plot(df['Close'], label='Close Price history')
接下来探索这些变量,并使用移动平均技术来预测股票的每日收盘价。
取黄色的部分的平均值做为黄色的下一个的预测,以后扔掉最开始的,把预测的上,继续预测再下一个区域,能够理解为一个固定的窗口的滑动,每次取窗口内的a v g,预测窗口后一个的值
第一步是建立一个只包含日期和收盘价列的数据框,而后将其拆分为训练集和验证集来验证咱们的预测。
#creating dataframe with date and the target variable建立一个只包含日期和收盘价列的数据框
data = df.sort_index(ascending=True, axis=0)
new_data = pd.DataFrame(index=range(0,len(df)),columns=['Date', 'Close'])
# 将全部日期和收盘价列的数据放到一个list中来
for i in range(0,len(data)):
new_data['Date'][i] = data['Date'][i]
new_data['Close'][i] = data['Close'][i]
在将数据分割为训练和验证时,咱们不能使用随机分割,由于这会破坏时间顺序。将去年的数据做为验证集,将以前4年的数据做为训练集。
#splitting into train and validation 数据分割为训练和验证集
train = new_data[:987]
valid = new_data[987:]
# 查看数据的状况(规模),和训练自己无关,可不执行
new_data.shape, train.shape, valid.shape
((1235, 2), (987, 2), (248, 2))
# 查看数据的状况(最大最小值),和训练自己无关,可不执行
train['Date'].min(), train['Date'].max(), valid['Date'].min(), valid['Date'].max()
(Timestamp('2013-10-08 00:00:00'),
Timestamp('2017-10-06 00:00:00'),
Timestamp('2017-10-09 00:00:00'),
Timestamp('2018-10-08 00:00:00'))
下一步是为验证集建立预测值,并使用真实值来检查RMSE偏差。
#make predictions 为验证集建立预测值
preds = []
for i in range(0,248):
a = train['Close'][len(train)-248+i:].sum() + sum(preds)
b = a/248
preds.append(b)
#calculate rmse 计算RMSE偏差。
rms=np.sqrt(np.mean(np.power((np.array(valid['Close'])-preds),2)))
rms
104.51415465984348
仅仅检查RMSE并不能帮助咱们评估模型预测效果的。让咱们经过作图获得更直观的理解。下面是预测值和实际值的曲线图。
#plot 画出训练的数据(绿线)、预测值(蓝线)与训练集的观测值(橙线)
#对于第一行的做用为何是0不是很理解,若是有知道的大佬麻烦留言处指点迷津
valid['Predictions'] = 0
valid['Predictions'] = preds
plt.plot(train['Close'])
plt.plot(valid[['Close', 'Predictions']])
RMSE值接近105,可是结果不是很理想(从图中能够看出)。预测值与训练集的观测值的范围相同(开始有上升趋势,而后缓慢降低)。