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