基于keras的向上跳空高开股票预测的初次体验

    xiaoxiao2021-03-25  46

    在股市中,每天都有向上跳空高开的股票,所谓向上跳空高开即今日股票的最低价大于昨日的最高价。出现这样的形态通常表明这只股票向上涨的概率大于下跌。我统计从2015年1月1日到2017年3月8日A股市场向上跳空并且当日收盘价大于开盘价的点,它们在第二日最高价大于昨日收盘价的概率为80%,如果算上0.2的交易成本即第二日涨幅大于昨日收盘0.2%以上算涨则概率为78%。因此当日跳空高开第二日上涨是大概率事件。那么能不能将这些数据深度学习做预测以提高预测准确行呢? 第一步:收集数据,统计从2015年1月1日到2017年3月8日A股市场向上跳空的点,所有数据点以事件升序排序(这样做的目的是为了避免股票“时间旅行”),一共12155点。将这些点当日的价格指标和技术指标作为特征feature,第二日与当日涨幅作为目标属性y。会得到以下的数据点, code date open max min close ... macd return 600896.SH 2015-01-06 -4.441197 -5.578155 -6.474727 -1.569164 ... 44.176707 1.31 第二步,将数据做预处理和切割,由于每日股票价格不同,有的高达上百元有的只有几元,因此要将数据做预处理,将当日数据特征减去昨日数据特征除以当日数据特征乘以100。再将这些数据用sklearn的scale做标准化(归一化)处理。将目标属性return做分类,例如return大于**N**(假定0.5)则return给1,否则给0。将数据集中前80%作为训练集train,将后20%的数据做测试集test(第一实验暂时不设验证集)。 第三步,生成深度学习网络,深度学习网络一共三层每层使用的激活函数为relu,每层神经元分别为15,10,5最后使用softmax分类,优化方法使用RMSprop。用相同的数据训练神经网络5次。 第四步,用测试集测试结果,测试的正确性78%,随着**N**增加测试准确性降低,逐渐降低到50%左右。 目前这个模型有几个不足:1、特征选取不够,应该增加特征数量;2、没有对特征进行优化;3、没有验证集进行参数优化过程;4、给定买卖点设计;5、没有历史回测收益率。以上5个方面是可以改进的方面。 代码如下: import numpy as np import pandas as pd import pprint, pickle from sklearn.preprocessing import scale from keras.datasets import mnist from keras.utils import np_utils from keras.models import Sequential from keras.layers import Dense, Activation from keras.optimizers import RMSprop path = r'/Users/xieqi2008/data/tk/tk_diff_return_20150101_20170307.txt' pkl_file = open(path, 'r') datas = pickle.load(pkl_file) pkl_file.close() datas = datas.rename(columns={'return':'rr'}) print datas.head(2) N = 0.2 dd = datas.copy() dd.rr[dd.rr<N]=0 dd.rr[dd.rr>N]=1 X = dd.loc[:,'open':'macd'].values y = dd.rr.values X = scale(X) #归一化 y = np_utils.to_categorical(y,nb_classes=2) #y值预处理 #分割数据 X_train = np.array(X[:6000]) y_train = np.array(y[:6000]) X_test = np.array(X[6000:]) y_test = np.array(y[6000:]) #开始生成神经网络模型 model = Sequential([ Dense(15, input_dim=19), Activation('relu'), Dense(10), Activation('relu'), Dense(5), Activation('relu'), Dense(2), Activation('softmax'), ]) rmsprop = RMSprop(lr=0.001, rho=0.9, epsilon=1e-06, decay=0.0) model.compile(optimizer=rmsprop, loss='categorical_crossentropy', metrics=['accuracy']) #训练模型 model.fit(X_train, y_train, nb_epoch=5, batch_size=64) #测试模型 loss, accuracy = model.evaluate(X_test, y_test) print('test loss: ', loss) print('test accuracy: ', accuracy)
    转载请注明原文地址: https://ju.6miu.com/read-38407.html

    最新回复(0)