阶段工作:
- Tushare的使用
- Price graphs: Utilizing the structural information offinancial time series for stock prediction论文试读
- A Dual-Stage Attention-Based Recurrent Neural Network for Time Series Prediction论文解读
下面介绍的知识,除了很基本的知识点外,都是我这两天学的,作为工作内容记录下来
Tushare的使用
Tushare上面提供了丰富的接口,可以python获取金融相关的数据,暂时我只用来获取一些股票的每日数据,用来做训练的数据集。下面简单介绍一下我是如何使用的。
在注册完成账号后,先去完善信息,是学生可以进行认证,获得积分,积分越高可以获得的数据就越多。
我暂时需要的是股票的数据和日线行情,接口分别是stock_basic和daily。网站基础教程挺详细,就不赘述。简单看下基础使用:
import tushare as ts
import pandas as pd
# 获得所有股票的基本信息
def getStock():
data = pro.stock_basic(exchange='', list_status='L', fields='ts_code,symbol,name,area,industry,list_date')
data.to_csv('stocks.csv', index=False)
return
# 按照股票代码获得股票一段时间内的日线行情
def getDailyInfo(tsCode):
df = pro.daily(ts_code = tsCode, start_date='19980807' ,end_date='20210629')
df = df.loc[::-1]
df.to_csv(tsCode + '.csv', index=False, columns=['trade_date','open','high','low','close','vol'])
股票信息保存在csv里留作训练用。Tushare非常的好用。
Price graphs: Utilizing the structural information offinancial time series for stock prediction论文试读
作为入门这篇文章太难,我暂时的理解就是根据股票的收盘价,开盘价,最高最低价,成交量和成交额,生成VG图,再将图上的节点输入到DARNN(下面具体讲的就是这个模型)的encoder中去,然后将每个节点不同的权重信息输入到DARNN的decoder中去,再拼接后经过CANN和全连接层,输出是涨还是跌。
我能从论文中提取到这些信息就已经尽力了,作为刚开始了解相关网络模型的人来说真的挺难懂的,还是英文的,所以我将眼光放到了其中的子网络模型,DARNN,也就是我详细要解读的论文。
DRANN:A Dual-Stage Attention-Based Recurrent Neural Networkfor Time Series Prediction论文解读
DARNN是基于双阶段注意力机制的循环神经网络,简单介绍下我理解的注意力机制,是基于encoder-decoder模型的,不了解的可以去搜索一下。
传统的encoder-decoder中,生成一个语义向量c,那么encoder中每个输入在c中体现的权重都是相等的,比如要翻译 我爱学习 - > i like studying,会将encoder会将我爱学习编码成语义向量c,在将c输入decoder解码出i like studying,在翻译 爱 为 like的时候,‘我’,‘爱’,‘学习’三个的权重是相同的,这显然不合理,应该爱的权重更高一些。
所以有了注意力机制,简单来说就是有了多个c(每个时间步一个),每个c体现的输入的各个词的权重不同。在解码器的t时刻输入的是c_t,比如上述例子在第二个时刻解码器输入的是c_2,c_2中‘爱’占的比例更大,所以更容易翻译出like。
下面开始解读论文:
DARNN是基于多重驱动序列的预测,在股票预测中,也就是用多只股票的时间序列信息去预测其他几只股票的信息。采用双阶段注意力,这也是它的创新点,我理解的注意力机制就是调整权重问题,所以可以不仅仅在编码器的输入阶段引入注意力机制,在编码器的输入阶段也引用了注意力机制,生成每个时刻相关的独有的特征,在解码的阶段使用注意力机制输入不同权重的encoder的隐藏层状态,也就是编码。
具体网络结构如下:(图片截取自论文)
先假设我们只预测一只股票,到指的是不同的外部驱动时间序列,也就是作为信息的其他n个股票的价格(并不包括我们要预测的),T是每个时间序列的时间长度,是一个n*1的矩阵,代表每个股票在时间为t时的价格。注意,股票的编号(1~n)是上标,而股票的时间编号(1~T)是下标,这点挺重要的。我们要预测的股票是右侧的y,到就是已知的要预测的股票的时间为1到T-1的价格,我们要预测它时间为T时的价格。
encoder阶段,也就是(b)中左侧的lstm,每个时间步输入的是,就是在t时刻,将输入的n个股票的t时刻价格按权重调整后的结果(左侧的整个(a)就是这个调整过程),这也是第一阶段的注意力机制。在decoder阶段,每个时间步输入的,就是在t时刻,将encoder的各个时间步的隐藏层输出按权重求和后的编码,(b)中也给出了如何求权重这些权重。
针对两阶段注意力机制解释完了大体流程后,下面看具体如何实现:
Encoder阶段:
基础的lstm更新,这个作为基本知识,是我本来就会的,不展开讲了。
本来,公式中的也就意味这每个股票在t时刻价格的权重都是1,因为注意力机制的存在,我们要进行调整。
这两个公式就是具体求权重的过程,(9)就是一个Sigmod函数。,和都是我们要学习的参数。得到后,我们就可以求调整后的了
用代替原本lstm中更新用的,得到所有时间步的隐藏层状态,我们encoder的工作就完成了。
Decoder阶段:
decoder中基础的lstm更新如下。
就是结合和后的结果。
为了求,进行如下工作:
,和是我们要学习的参数,是指在时间步为t的时刻,第i个隐藏层所占的权重。然后进行下面这步。
如上文所说,为时间步为t时刻的编码。然后要和结合。
这样我们就得到了,从而输入到lstm中。
具体我们要预测的的计算方法如下:
如此,我们便得到了,decoder阶段结束,我们得到预测值了。
loss计算:
训练损失函数如下,就是个MSE loss,很好理解:
超参数设计:
encoder和decoder的隐藏层大小设为64,batch_size为128,T为10,学习率0.001,每10000次迭代减少10%。
这就是我这两天的工作,测试了解了Tushare的使用,放弃了第一篇论文的理解(以后可能会再试试,看着它的实验结果挺好的),基本读懂了第二篇论文。