现阶段国内股票市场散户市和政策市特征明显,市面上没有一种准确有效输出直观的工具来帮助散户进行股票价格预测,且大部分预测模型还是以精度不高的传统计量经济学模型或者BP神经网络为基础。本项目拟结合数据面和政策面的影响,以长短期记忆网络为基础,以提高精度并克服BP神经网络的缺点,同时通过语义分析技术将传统模型所没有的国家政策、股民情绪、媒体评判等量化后作为输入的一部分。此外将国际金融市场走势,国际时局等作为输入的一部分,并通过对所有输入的数据挖掘来简化输入,最后引入交易模型,直观输出股指以帮助股民规避风险做出判断。
tushare ID:419950
tushare提供了基于python的金融数据接口,是一个免费、开放的数据平台。数据内容包括股票、基金、期货、债券、外汇、行业大数据,同时包括了数字货币行情等区块链数据的全数据品类的金融大数据平台,为各类金融投资和研究人员提供适用的数据和工具。
同时,也为高校学生提供了便利的服务,所以在进行这次项目时数据来源就选择了tushare,也十分推荐大家使用。
本项目对上证指数(000001.SH)进行预测,获取了仅二十余年的数据,数据来源于开源社区tushare
代码如下
def dataget(start_date, end_date, code):
"""
数据获取
:param start_date: string
:param end_date: string
:param code: string
:return: ndarray
"""
ts.set_token("your token")
pro = ts.pro_api()
df = pro.index_daily(ts_code=code, start_date=start_date, end_date=end_date,
fields='trade_date,close,open,high,low,vol,amount,pct_chg')
length = df.shape[0]
data = []
for i in range(length):
each_data = [df.loc[length - 1 - i]['trade_date'], df.loc[length - 1 - i]['open'], df.loc[length - 1 - i]['close'], df.loc[length - 1 - i]['low'],
df.loc[length - 1 - i]['high'], df.loc[length - 1 - i]['vol'], df.loc[length - 1 - i]['amount'],
df.loc[length - 1 - i]['pct_chg']]
each_data = np.array(each_data, dtype='float64')
data.append(each_data)
data = np.array(data, dtype='float64')
print('数据类型:', type(data))
print('数据个数:', data.shape[0])
print('数据形状:', data.shape)
print('数据第一行:', data[0])
return data
本项目获取的数据有日期、开盘价、收盘价、最高价、最低价等。
数据处理主要依赖于归一化处理。数据的标准化(normalization)是将数据按比例缩放,使之落入一个小的特定区间。在某些比较和评价的指标处理中经常会用到,去除数据的单位限制,将其转化为无量纲的纯数值,便于不同单位或量级的指标能够进行比较和加权。
归一化公式:
x*=(x-avg)/(max-min)
在搭建模型时花费了较大的功夫进行评估,最后评估结果为一层LSTM+2层全连接会比较好,模型如下
model = Sequential()
# LSTM层
model.add(LSTM(256, activation='relu', return_sequences=False, input_shape=(layers[0], layers[1]),
kernel_regularizer=regularizers.l2(0.000003)))
model.add(Dropout(0.3))
# BP层
model.add(Dense(128))
model.add(Activation("relu"))
model.add(Dropout(0.5))
# 输出层
model.add(Dense(layers[2]))
model.add(Activation("linear"))
# 优化器
op = tensorflow.keras.optimizers.Adam()
# 损失函数
lo = tensorflow.keras.losses.MeanSquaredLogarithmicError()
model.compile(optimizer=op, loss=lo)
本文展示的是基于日线指数的股票预测,笔者还进行了加上情感指数的股票预测,主要思路是爬取每天新闻,对新闻进行情感指数分类,输入到神经网络中进行股票预测。新闻的获取也是来源于tushare,tushare对于这一类的接口还是很齐全的。
完整代码可见GitHub:https://github.com/foragony/stock_predict