来源:AISHWARYA SINGH, 2018年10月25日
翻译:赵雪尧
校对:车前子
本文约8000字,建议阅读15+分钟。
本文介绍了如何运用深度学习法预测股票市场。
简介
预测股市将如何变化历来是最困难的事情之一。这个预测行为中包含着如此之多的因素—包括物理或心理因素、理性或者不理性行为因素等等。所有这些因素结合在一起,使得股价波动剧烈,很难准确预测。
使用机器学习可能改变游戏规则吗?机器学习技术使用最新的组织公告、季度收益等作为特征,有潜力挖掘出我们以前没有见过的模式和见解,并可用于准确无误的预测。
在本文中,我们将研究上市公司股价的历史数据。我们将结合机器学习算法来预测这家公司的未来股价,从平均和线性回归这样的简单算法开始,然后转向像Auto ARIMA和LSTM这样的高级模型。
本文背后的核心思想是展示这些算法是如何实现的,因此我只会简单描述该技术并提供相关参考链接,以便在必要时对这些概念进行复习。如果您是时间序列领域的新手,我建议您先阅读以下文章:
创建时间序列预测的初学者综合指南
时间序列建模的完整教程
目录
1、 问题理解
2、 移动平均
3、 线性回归
4、 K-近邻
5、 自动ARIMA
6、 先知(Prophet)
7、 长短时记忆网络(LSTM)
1、问题理解
我们将很快深入本文的实现部分,但首先重要的是确定我们要解决的问题。一般来说,股票市场分析分为两个部分——基本面分析和技术分析。
基本面分析是根据公司目前的经营环境和财务状况,对公司未来的盈利能力进行分析。
技术分析包括阅读图表和使用统计数字来确定股票市场的趋势。
您可能已经猜到,我们的重点将放在技术分析部分。我们将使用来自Quandl的数据集(您可以在这里找到各种股票的历史数据),这个项目中,我使用了“塔塔全球饮料”的数据。是时候开始了!
首先让我们加载数据集,定义问题的目标变量:
#import packages
import pandas as pd
import numpy as np
#to plot within notebook
import matplotlib.pyplot as plt
%matplotlib inline
#setting figure size
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/2018、6/10/2018、7/10/2018。其中2号是国庆节,6号和7号是周末。
损益的计算通常由股票当日的收盘价决定,因此我们将收盘价作为目标变量。让我们画出目标变量来理解它在我们的数据集中的分布:
#setting index as 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')
在接下来的部分中,我们将探索这些变量,并使用不同的技术来预测股票的每日收盘价。
2、移动平均
简介
“平均数”是我们日常生活中最常用的统计量之一。例如,计算平均分数来确定整体表现,或者根据过去几天的平均温度来了解今天的温度——这些都是我们经常做的日常工作。因此,使用这个方法开始用数据集进行预测是个不错的选择。
我们利用一组先前观测值的平均值作为每天的预期收盘价。我们将使用移动平均法,而不是使用简单的平均值,移动平均法使用最近的一组数据计算预测值。换句话说,对于后续的每个新的时间,在考虑预测值时,将从集合中删除最早的观测值,并加入上一个观测值。下面是一个简单的图,它将帮助您更清楚地理解这一点。
我们将在数据集上使用这种技术。第一步是创建一个只包含日期和收盘价列的数据框,然后将其拆分为训练集和验证集来验证我们的预测。
实现
#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'])
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:]