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

正如人们所幻想的相同,在华尔街作业充溢时机与应战。咱们都西装革履、脸色阴沉、手持卷烟吞云吐雾。在国际金融中心的喧嚣里,每个人的实践方针都很简略。不过是冒着将事物过于简略化的危险用钱生钱(无论是自己持有的仍是借来的)。金融业实践上并不发明任何价值,而是运用其他因从来取得出资报答。

股票市场是最常见的金融工具之一,任何人都能够经过它发财。假如有人能破解股市的奥妙猜测未来股价,他们或许将控制国际。

问题在于,准确猜测未来股市简直是不可能的。那么多的剖析师、研究人员,以及一些极端聪明的人都企图搞懂股票。但没有人能够得出共同的成果。一个也没有。

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

假如想更深入了解这个项目,请阅读GitHub代码库:github/jerrytigerxu/Stock-Price-Prediction

运用Stocker模块

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

首要要克隆GitHub代码库房。

!git clone github/WillKoehrsen/Data-Analysis.git

然后还需求导入一些库。现在现已克隆了repo,还能够导入Stocker模块。

!pip install quandl

!pip install pytrends

import stocker

from stocker import Stocker

现在创立一个Stocker目标。本文挑选谷歌作为猜测的公司,但这并不是强制要求。Stocker模块有一个名为plot_stock()的函数能够自己完结许多作业。谷歌的股票走势十分好有心人会注意到Stocker目标的日期不是最新的。它止于2018-3-27。细心检查实践的模块代码,会发现数据取自Quandl的WIKI exchange。或许它们的数据并没有实时更新?

Stocker能够用来进行技能股票剖析,但现在的要点是将其作为前言。Stocker运用了Facebook创立的一个名为prophet的包,其关于加法建模十分有用。现在来查验Stocker的猜测。这需求创立一个检验集和一个练习集,其间练习集是2014-2016年,检验集是2017年。来看看这个模型的准确度。
看看这猜测多糟糕!

成果适当惊人,猜测简直和抛硬币相同糟糕。因而要调整一些超参数。
这儿能够看出运用了不同changepoints的作用

对changepoint进行验证是调整超参数,然后更好地调整股票猜测算法的有用办法。

现在能够评价改善后模型的猜测估计值是否有任何改善。看起来只比之前的模型略微强了一点

是时分做终极检验了:在股市中碰碰命运(当然是模仿的)。看起来仍是买入并持有更好

即便在阅历一切调整之后,明显单纯地买入并持有会发生更高的报答。

为机器学习准备数据

下面测验用机器学习来猜测股票价格,而不是依赖于一个模块。关于本例,将运用Stocker供给的make_df函数取得谷歌的股票数据。

经过缩小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\']这是谷歌股票的收盘价

# 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 ) 来测算模型的准确性。现在将猜测制作在实践价格周围。
哎呀,在核算股票数据的总趋势方面,移动平均线法做得不错,可是它没有猜测到价格的上升幅度这一点不太抱负。因而不会在实践的算法买卖中运用这种办法。

简略线性回归

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

首要,根据原始数据集创立一个新的数据集。

# 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)开端随机区分练习集和检验集。

# 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)

相同地,猜测算法在必定程度上掌握了整体趋势,但它并没有捉住最重要的东西。

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)

成果怎么呢?
真的很惨烈

哎呀!这是迄今为止得到的最糟糕的猜测!难怪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))

modelpile(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)下面取得成果。
这比KNN还要糟糕!神经网络在猜测股价方面如此糟糕的原因有许多,其间之一无疑是缺少有意义的特征和数据。除此之外,还有许多超参数能够调整。

定论

那么今日学到了什么呢?这些技能剖析说明晰什么?答案十分简略:假如你不是像Ray Dalio、Warren Buffet或任何其他出色的出资者那样的人,那么企图打败股市是十分冒险的,并且终究也无利可图。据一些消息人士称,大都对冲基金乃至比不过标准普尔500指数!因而,假如想让出资取得最佳报答的话,那就采纳买入并持有的战略。在很大程度上,即便经济呈现了几回大幅下滑,只是出资标准普尔500指数这样的指数基金就现已能够取得适当不错的报答。当然,终究决定权在于你自己。

怎么改善

1. 运用不同的股票数据

笔者只运用了谷歌的股票数据,并且时间跨度也相对较小。你能够恣意运用不同的数据,这些数据能够经过Stocker或Yahoo Finance或Quandl获取。

2. 测验不同的机器学习算法

许多机器学习算法都很好。笔者只运用了一小部分,其间只要一个是深度学习算法。

3.调整更多的超参数

这无需解说。通常情况下,任何算法的默认设置都不是最优的,因而你能够经过验证来确认哪些超参数最有用。留言 点赞 发个朋友圈

咱们一同共享AI学习与开展的干货

如需转载,请后台留言,恪守转载标准