股票预测的机器学习方法 (股票趋势预测深度学习)

全文共5549字,预计学习时长11分钟

如何快速分析预测股市走势,如何利用ai技术预测股票走势图

正如人们所想象的一样,在华尔街工作充满机遇与挑战。大家都西装革履、脸色阴沉、手持香烟吞云吐雾。在世界金融中心的喧嚣里,每个人的实际目标都很简单。不过是冒着将事物过于简单化的风险用钱生钱(无论是自己持有的还是借来的)。金融业实际上并不创造任何价值,而是利用其他因素来获得投资回报。

股票市场是最常见的金融工具之一,任何人都可以通过它发财。如果有人能破解股市的奥秘预测未来股价,他们或许将统治世界。

问题在于,准确预测未来股市几乎是不可能的。那么多的分析师、研究人员,以及一些极其聪明的人都试图搞懂股票。但没有人能够得出一致的结果。一个也没有。

那本文重点是什么呢?为什么要写用机器学习来预测股市呢?主要是为了好玩。然而更重要的是,这对学习机器学习和金融来说都是一个很好的练习机会。

如果想更深入了解这个项目,请阅览GitHub代码库:https://github.com/jerrytigerxu/Stock-Price-Prediction

运用Stocker模块

Stocker模块是一个简易的Python库,它包含许多有用的股票市场预测函数。在初始化后,它们不是那么精确(还不如抛硬币)。但是通过调整参数,结果会精确得多。

首先要克隆GitHub代码仓库。

!git clone https://github.com/WillKoehrsen/Data-Analysis.git

然后还需要导入一些库。现在已经克隆了repo,还可以导入Stocker模块。

!pip install quandl

!pip install pytrends

import stocker

from stocker import Stocker

现在创建一个Stocker对象。本文选择谷歌作为预测的公司,但这并不是强制要求。Stocker模块有一个名为plot_stock()的函数可以自己完成很多事情。

如何快速分析预测股市走势,如何利用ai技术预测股票走势图

谷歌的股票走势非常好

有心人会注意到Stocker对象的日期不是最新的。它止于2018-3-27。仔细查看实际的模块代码,会发现数据取自Quandl的WIKI exchange。也许它们的数据并没有实时更新?

Stocker可以用来进行技术股票分析,但现在的重点是将其作为媒介。Stocker运用了Facebook创建的一个名为prophet的包,其对于加法建模非常有用。

如何快速分析预测股市走势,如何利用ai技术预测股票走势图

现在来检验Stocker的预测。这需要创建一个测试集和一个训练集,其中培训集是2014-2016年,测试集是2017年。来看看这个模型的精确度。

如何快速分析预测股市走势,如何利用ai技术预测股票走势图

看看这预测多糟糕!

结果相当惊人,预测几乎和抛硬币一样糟糕。因此要调整一些超参数。

如何快速分析预测股市走势,如何利用ai技术预测股票走势图

这里可以看出运用了不同changepoints的效果

如何快速分析预测股市走势,如何利用ai技术预测股票走势图

如何快速分析预测股市走势,如何利用ai技术预测股票走势图

对changepoint进行验证是调整超参数,从而更好地调整股票预测算法的有效方法。

现在可以评估改进后模型的预测估计值是否有任何改进。

如何快速分析预测股市走势,如何利用ai技术预测股票走势图

看起来只比之前的模型稍微强了一点

是时候做终极测验了:在股市中碰碰运气(当然是模拟的)。

如何快速分析预测股市走势,如何利用ai技术预测股票走势图

看起来还是买入并持有更好

即使在经历所有调整之后,显然单纯地买入并持有会产生更高的回报。

为机器学习准备数据

下面尝试用机器学习来预测股票价格,而不是依赖于一个模块。对于本例,将使用Stocker提供的make_df函数获得谷歌的股票数据。

如何快速分析预测股市走势,如何利用ai技术预测股票走势图

如何快速分析预测股市走势,如何利用ai技术预测股票走势图

通过缩小dataframe来获取所需要的数据

移动平均线

总的来说,移动平均线是技术分析中常用的指标。它是一个滞后指标,也就是说它使用过去的价格来预测未来的价格。它能有效地消除任何短期波动,并找到总体趋势。移动平均线可以用来检测是否能更精确地预测股票价格。

import pandas as pd

import numpy as np

import matplotlib.pyplot as plt

%matplotlib inline

import matplotlib.style

import matplotlib as mpl

mpl.style.use('ggplot')

from matplotlib.pylab import rcParams

rcParams['figure.figsize'] = 20, 10

from sklearn.preprocessing import MinMaxScaler

scaler = MinMaxScaler(feature_range=(0, 1))

# Creating copy of goog_data dataframe for moving averages

df = goog_data

df['Date'] = pd.to_datetime(df.Date, format='%Y-%m-%d')

df.index = df['Date']

如何快速分析预测股市走势,如何利用ai技术预测股票走势图

这是谷歌股票的收盘价

# 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', 'Adj. Close'])

for i in range(0, len(data)):

new_data['Date'][i] = data['Date'][i]

new_data['Adj. Close'][i] = data['Adj. Close'][i]

# Train-test split

train = new_data[:2600]

test = new_data[2600:]

num = test.shape[0]

train['Date'].min(), train['Date'].max(), test['Date'].min(), test['Date'].max()

# Making predictions

preds = []

for i in range(0, num):

a = train['Adj. Close'][len(train)-924+i:].sum() + sum(preds)

b = a/num

preds.append(b)

用均方根误差 ( RMS ) 来测算模型的准确性。

如何快速分析预测股市走势,如何利用ai技术预测股票走势图

现在将预测绘制在实际价格旁边。

如何快速分析预测股市走势,如何利用ai技术预测股票走势图

如何快速分析预测股市走势,如何利用ai技术预测股票走势图

哎呀,在计算股票数据的总趋势方面,移动平均线法做得不错,但是它没有预测到价格的上升幅度这一点不太理想。因此不会在实际的算法交易中使用这种方法。

简单线性回归

那么试着用另一种方法来预测未来的股票价格,即线性回归。

首先,基于原始数据集创建一个新的数据集。

# We'll create a separate dataset so that new features don't mess up the original data.

lr_data['Date'] = pd.to_datetime(lr_data.Date, format='%Y-%m-%d')

lr_data.index = lr_data['Date']

lr_data = lr_data.sort_index(ascending=True, axis=0)

new_data = pd.DataFrame(index=range(0, len(lr_data)), columns=['Date', 'Adj. Close'])

for i in range(0,len(data)):

new_data['Date'][i] = lr_data['Date'][i]

new_data['Adj. Close'][i] = lr_data['Adj. Close'][i]

现在为线性回归算法向数据集添加更多的特征。这里将使用fastai模块中的一些函数。

!pip install fastai==0.7.0

from fastai.structured import add_datepart

add_datepart(new_data, 'Date')

new_data.drop('Elapsed', axis=1, inplace=True)

如何快速分析预测股市走势,如何利用ai技术预测股票走势图

开始随机划分训练集和测试集。

# Train-test split

train = new_data[:2600]

test = new_data[2600:]

x_train = train.drop('Adj. Close', axis=1)

y_train = train['Adj. Close']

x_test = test.drop('Adj. Close', axis=1)

y_test = test['Adj. Close']

现在执行算法并获得结果。

# Implementing linear regression

from sklearn.linear_model import LinearRegression

model = LinearRegression()

model.fit(x_train, y_train)

如何快速分析预测股市走势,如何利用ai技术预测股票走势图

如何快速分析预测股市走势,如何利用ai技术预测股票走势图

如何快速分析预测股市走势,如何利用ai技术预测股票走势图

同样地,预测算法在一定程度上把握了总体趋势,但它并没有抓住最紧要的东西。

k元最近邻算法

继续介绍下一个机器学习算法,k元最近邻算法 ( KMN )。

对于线性回归,仍然用相同的数据做同样的处理。唯一的区别是,将对数据执行不同的算法。然后看看哪种预测方法更精确。

from sklearn import neighbors

from sklearn.model_selection import GridSearchCV

from sklearn.preprocessing import MinMaxScaler

scaler = MinMaxScaler(feature_range=(0, 1))

# scaling the data

x_train_scaled = scaler.fit_transform(x_train)

x_train = pd.DataFrame(x_train_scaled)

x_test_scaled = scaler.fit_transform(x_test)

x_test = pd.DataFrame(x_test_scaled)

# using gridsearch to find the best value of k

params = {'n_neighbors': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]}

knn = neighbors.KNeighborsRegressor()

model = GridSearchCV(knn, params, cv=5)

# fitting the model and predicting

model.fit(x_train, y_train)

preds = model.predict(x_test)

结果如何呢?

如何快速分析预测股市走势,如何利用ai技术预测股票走势图

如何快速分析预测股市走势,如何利用ai技术预测股票走势图

真的很惨烈

哎呀!这是迄今为止得到的最糟糕的预测!难怪k元最近邻算法在分类问题和小规模回归中更有效。这看起来是典型的过度拟合。因为KNN只是计算从一个点到另一个点的距离,它完全无法计算出价格走势。那接下来应该做什么呢?

多层感知器

下面进入深度学习,正确地说是神经网络。

多层感知器是最简单的神经网络类型之一,至少比卷积神经网络和长短期记忆网络简单。本文并没有具体讨论这个算法的工作机制。如果你感兴趣,请查阅文末参考资料。

import tensorflow as tf

from tensorflow.keras import layers

model = tf.keras.models.Sequential()

model.add(tf.keras.layers.Dense(100, activation=tf.nn.relu))

model.add(tf.keras.layers.Dense(100, activation=tf.nn.relu))

model.add(tf.keras.layers.Dense(1, activation=tf.nn.relu))

model.compile(optimizer='adam', loss='mean_squared_error')

X_train = np.array(x_train)

Y_train = np.array(y_train)

model.fit(X_train, Y_train, epochs=500)

如何快速分析预测股市走势,如何利用ai技术预测股票走势图

下面获得结果。

如何快速分析预测股市走势,如何利用ai技术预测股票走势图

如何快速分析预测股市走势,如何利用ai技术预测股票走势图

这比KNN还要糟糕!神经网络在预测股价方面如此糟糕的原因有很多,其中之一无疑是缺乏有意义的特征和数据。除此之外,还有许多超参数可以调整。

结论

那么今天学到了什么呢?这些技术分析说明了什么?答案非常简单:如果你不是像Ray Dalio、Warren Buffet或任何其他杰出的投资者那样的人,那么试图战胜股市是非常冒险的,而且最终也无利可图。据一些消息人士称,多数对冲基金甚至比不过标准普尔500指数!因此,如果想让投资获得最佳回报的话,那就采取买入并持有的策略。在很大程度上,即使经济出现了几次大幅下滑,仅仅投资标准普尔500指数这样的指数基金就已经能够获得相当不错的回报。当然,最终决定权在于你自己。

如何改进

1. 使用不同的股票数据

笔者只使用了谷歌的股票数据,而且时间跨度也相对较小。你可以任意使用不同的数据,这些数据可以通过Stocker或Yahoo Finance或Quandl获取。

2. 尝试不同的机器学习算法

很多机器学习算法都很好。笔者只使用了一小部分,其中只有一个是深度学习算法。

3.调整更多的超参数

这无需解释。通常情况下,任何算法的默认设置都不是最优的,因此你可以通过验证来确定哪些超参数最有效。

如何快速分析预测股市走势,如何利用ai技术预测股票走势图

留言 点赞 发个朋友圈

我们一起分享AI学习与发展的干货

如需转载,请后台留言,遵守转载规范