人工神经网络在股票预测中的应用 (机器学习预测股票用什么算法)

在这篇文章中,我解释如何利用R中的neuralnet包建立一个单一的分层神经网络,来预测在纽约证交所和纳斯达克上市的6只股票的走势,使用一些技术指标和SP500指数作为输入。

作为我一次训练ANN,主要的想法是,作为一个练习,定义一个简单的结构,可以有一个不错的表现,预测不同股票的价格变动。

数据提取和预处理

所使用的股票是谷歌,波音,桑德森农场公司,Cognizant,苹果和泰瑞达,我从2010年1月到2018年5月获得了价格和交易量,共计1859个交易日。

数据源是Yahoo! 财务,通过R中quantmod包的getSymbol函数访问。一旦获得了每个股票的价格和交易量,我就开始计算所有需要的变量:

  • SP500指数变化(SP500)

  • 20、10、5天移动平均变化(MA20D, MA10D, MA5D)

  • 交易量变化(VOLCHANGE)

  • 252天历史波动率(HV)

我还创建了两个特性。假设Bollinger Bands作为resistance 和support levels,为了知道价格从这些水平上有多远,我减去了价格的差额,减去上、下的Bollinger Bands(使用5天移动平均线)。我给这些SprdLW5和SprdUP5命名。

b_bands5 <- na.exclude(BBands(price, n = 5 ))

lwr5 <- b_bands5[,1]

upper5 <- b_bands5[,3]

spread_lwr5 <- price - lwr5

spread_upper5 <- price - upper5

最重要的是,我使用价格回报来计算股票走势(从现在开始称为方向),当回报为正时为1,否则为0。

direction <- rturn

direction[ direction > 0] <- 1 # if rturn > 0, then 1

direction[ direction <= 0] <- 0 # if rturn <= 0, then 0

现在,方向变量变成我们的y,其他所有变量变成我们的x 。后者需要落后才能建立一个能够提前预测的模型。一旦包含所需变量的数据集准备就绪,则分别将其分成90/10进行训练和验证。共1859个观察结果,186个确认集,1673个训练集

数据标准化

训练ANN之前,有必要进行整个数据的最小-最大归一化-使用下式-因此它的范围从0到1(从-1到1)否则ANN将不会在其收敛最低:

X' = (X - Xmin) / (Xmax - Xmin)

重要的是要注意,Xmax和Xmin是 训练集的最大值和最小值,并且训练集和验证集都必须使用这些值进行归一化。

训练人工神经网络

表现最佳的神经网络为3个神经元单层网络,以logistic函数为激活函数,平方标准误差为成本函数。

nn <- neuralnet(direction ~ SP500+MA20D+MA10D+MA5D+HV+VOLCHANGE

+SprdLW5+ SprdUP5,

data = tr_df, hidden = 3 , rep = 10 ,

linear.output = FALSE , algorithm = 'rprop-',

act.fct = 'logistic', stepmax = 400000,

err.fct = 'sse')

例如,改变这些超参数(例如增加神经元的数量或改变成本函数)会导致训练周期长和/或由于过度拟合而导致验证组性能较差。

人工神经网络在股票预测中的应用,股票神经网络预测

NN在Sanderson Farms Inc(SAFM)股票数据上进行训练

训练神经网络,并使用经过X验证组变量,预测是通过计算计算在相同的功能neuralnet包。

test.pred.nn <- compute(nn, coredata(vl_df_price), rep=

which.min(nn$result.matrix[1,]) )$net.result

这些预测范围从0到1,所以如果他们大于0.5,我将结果替换为1,否则为0。准确的测量是根据预测正确的方向的百分比来衡量的。

fcst_error <- vl_df[,'direction']

fcst_error[vl_df[,'direction'] == test.pred.nn ] <- 1

fcst_error[vl_df[,'direction'] != test.pred.nn ] <- 0

fcst_error <- sum(fcst_error)/length(vl_df[,'direction'])

精度

以下是每只股票的精确性,或者仅仅是预测的移动方向的百分比,从总计186天算起:

GOOG BA SAFM CTSH AAPL TER

0.538 0.522 0.532 0.548 0.484 0.527

结论

我甚至认为我对所有的股票都用了同样的变量,在现实中每个股票价格都受到很多不同的变量的影响,结果很令人满意,用一种非常简单的方式,假设你在股票市场的赌注是超过50%的,如果你在股票市场上的赌注是正确的,那你就可以在这个ANN的理论中找到利润了。

考虑到神经网络包的局限性(只有两个激活功能)和简单的模型定义,使用不同的库(Tensorflow)是有机会改进的,同时,用不同的变量来构建不同的ANN,用搜索引擎来调整超参数,同时进行更久的训练。