Alpha-Nebula:Short-term stock price prediction based on echo state networks

原文链接:Short-term stock price prediction based on echo state networks

展示课件链接:Short-Term Stock Price Prediction based on Echo State Network

这篇文章讲的是将Echo State Network(回声状态网络)应用于股票数据的短期预测中。我之前没有听说过ESN,而这篇文章在ESN之外的创新也不多,所以算是介绍这样一个工具吧。

Echo State Network

ESN是什么呢?这里直接应用一篇个人认为写的很好的教学文章,不过这里我也准备用简单的语言讲一讲个人的理解。

ESN拥有一个叫做reservoir的状态储存池,我们将其记为x(i)向量,对于这个x(i)向量进行某种迭代

(1)   \begin{equation*}  x(i+1) = f(W*x(i)) \end{equation*}

其中f是任意非线性函数。现在我们x(i)充当了一种Memory的角色。

接着令u(i)表示第i时刻的输入,y(i)表示第i时刻的目标输出,我们将这个输入输出加到刚才的 (1)里面,得到实际的迭代式

(2)   \begin{equation*}  x(t+1) &= f(W^{in}u(t+1) + W x(t) + W^{back} y(t)) \end{equation*}

是不是感觉这里面x(t)就像回声一样在里面荡来荡去,这里就对了。

最后输出为

(3)   \begin{equation*}  y'(t+1) = W^{out} concat(u(n+1),x(n+1),y(n)) \end{equation*}

在式子(3)里面,y'(t+1),concat(u(n+1),x(n+1),y(n))以及y(t+1)已知,则可以用线性回归训练啦。

可以看出该算法有如下特点:

  • 训练是最小二乘法,速度快
  • 不会陷入局部最优解

另外也有一些需要注意的地方:

  • W不能太大,否则可能越乘越大,可以通过W的特征值的最大值的大小来限制
  • 为了使效果更优,W最好是稀疏矩阵(比如95%的零)

使用ESN预测短期股价

先说一些论文中的细节

  • 论文中非线性函数f(x)的选择为

    (4)   \begin{equation*}  f(x)  = \frac{1}{1+e^{-\alpha x + v}} \end{equation*}

  • 通过赫斯特指数选择训练输入数据,文章里面选择了Hurst指数最接近1的序列进行训练,原因不明…… 也许是因为hurst接近1的时候,序列特征更持久?
    相关文献:Some comments on Hurst exponent and the long memory processes on capital markets
  • 通过各种技术指标可以有效的提高效果,但是可能存在过拟合,所以通过PCA来进行数据降维。

想法与疑问

  • 一般的论文都通过平均百分比误差来表示效果,感觉这东西还是不太容易量化实际的收益……
  • 这里的LinearRegression是最简单的版本,我们是否可以给他加入更多的优化,比如局部回归,或者对于不同的部分采用不同的回归,甚至可以把决策树套进来。

 

mhy的量化笔记 之 基于LSTM的股市趋势预测

思路

经过一段时间对LSTM的学习,大概了解了LSTM的运作规律。因此尝试运用LSTM预测股市走势。

参考:文章A  文章B

这篇文章是对于该方法的一种初步尝试,然而问题显而易见。

  1. 该算法将指数数据未经任何处理就丢到了LSTM里面,这是“不可能”学习出任何知识的。由于神经网络类机器学习算法是基于线性组合以及非线性函数,因此能够学习出“较大”,“正”,“上升”这一类描述,但无法学习出“区间最大值”,“日线高点出现”,“指数线交叉”。所以我们需要做的应该是将这类信息人工处理后丢入LSTM!

尝试1:上证指数K线4值

直接输入上证K线的open,close,high,low,预测1/5/10日收盘价涨跌.

正确率最后能够到达65%左右。

奇怪的是用GRU和LSTM效果没有显著的差别,感觉远期的信息并没有被学习进去……

全部都学成跌了,当然没有差别咯……算了一下,MCC相关系数仅有0.02,等于随机预测.

由于之前使用的是涨跌幅的log的平方和作为loss函数,可能确实在精度上也会有问题。

是不是将label设为涨跌幅log平方的符号函数会更好一些呢?

最后,模型准确率平均在51%左右,且在训练过程中有时候会跳到49%,相关性也会在有些时候呈现负相关,具体来说就是没有训练处结果。

尝试2:加入更多数据

测试数据

随机选择股票

000416 000996 600096 600291 600695 000416 000996 600096 600291 600695 000951 300143  600155 600354 600785

收集2010-2017的日线数据进行分为训练集与测试集。

指标选择

由最初的四个数据拓展到更多的指标

  • open 开盘价
  • close 收盘价
  • high 最高价
  • low 最低价
  • volume 成交量
  • sh 上证指数
  • sz  深证成指
  • hs300 沪深300
  • cyb 创业板指数
  • ma_5 5日均线
  • ma_10 10日均线
  • ma_20 20日均线
  • ma_60 60日均线
  • macd_dif macd短线
  • macd_ema macd长线
  • macd_macd macd柱状线
  • rsi rsi指数
  • adx adx指数
  • cci cci指数

将指数分组进行归一化,例如将ochl和均线值统一进行归一化,指数独自归一化。

分类函数

之前是将误差平方和作为loss函数,后来发现这在二分类问题中非常的不优美。

对于典型的二分类问题

loss =- (X * log(X’) + (1-X)*log(1-X’))

作为误差函数会更加容易收敛。

分组训练

之前的分组训练是直接取相邻区间,仔细想想确实bug非常严重,本身分batch就是为了防止出现边界数据,导致将梯度影响错误的方向。这里我们改成使用随机batch_size个数据使得训练表现好了一些

优化指标

之前指标发现实际上大盘数据对于一只股票并没有太大的用处,因为我不知道这个股票的类型,因此考虑增加:

  • is_sh 是否为沪市
  • is_sz 是否为深市
  • is_cyz 是否为创业板

至此,已经可以将模型准确率提高至53%

修改分类函数

将之前的二分类改为三分类,其中表示随机波动的分类0产生的所有结果不计入loss函数。准确率提高至55%,不过这个55%的含义与之前不同,这里计算的只是非零分类的准确率。

 

Tushare数据自动缓存

tushare是一个财经数据获取库,内置若干财经数据的获取爬虫,将各种数据的爬取封装在了一起。但是tushare有一个很大的缺点,就是其抓取的数据无法缓存在本地。故考虑实现一组自己的api用以缓存tushare数据。

这是python中获取tushare数据的典型例子,我们考虑实现一个简单的装饰函数,将函数调用以及调用的参数进行记忆化!

这里面data_cacher函数包装后的ts.api增加了将返回值保存为以“函数名”、“参数”命名的文件中,供下次调用直接使用。

最后,如何实现data_cacher函数呢?直接上代码: