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

在股市中,每天都有向上跳空高开的股票,所谓向上跳空高开即今日股票的最低价大于昨日的最高价。出现这样的形态通常表明这只股票向上涨的概率大于下跌。我统计从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.rr0
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)

你可能感兴趣的:(量化分析)