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

基于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.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)
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个基于Keras的GCNN预测代码示例,其中使用了Cora数据集: ```python import numpy as np from keras.models import Model from keras.layers import Input, Dense, Dropout, Flatten, Reshape, Embedding from keras.layers.convolutional import Convolution1D from keras.layers.pooling import MaxPooling1D from keras.layers.merge import concatenate from keras.optimizers import Adam from keras.regularizers import l2 from sklearn.model_selection import train_test_split from sklearn.preprocessing import LabelEncoder from keras.utils import np_utils def load_data(): # 加载Cora数据集,包括特征和标签 data = np.genfromtxt('cora.content', dtype=np.dtype(str)) features = np.array(data[:, 1:-1], dtype=np.float32) labels = data[:, -1] # 将标签编码为数字 label_encoder = LabelEncoder() labels = label_encoder.fit_transform(labels) # 对标签进行one-hot编码 labels = np_utils.to_categorical(labels) # 加载邻接矩阵 adj_matrix = np.zeros((len(labels), len(labels)), dtype=np.int) edges = np.genfromtxt('cora.cites', dtype=np.str) for edge in edges: idx1 = int(edge.split('\t')[0]) idx2 = int(edge.split('\t')[1]) adj_matrix[idx1][idx2] = 1 adj_matrix[idx2][idx1] = 1 return features, adj_matrix, labels def build_model(feature_dim, output_dim, adj_matrix, num_filters=16, filter_size=3, hidden_dim=16, dropout_rate=0.5, l2_reg=0.01): # 输入层 input_x = Input(shape=(feature_dim,)) # Embedding层 embedding = Embedding(input_dim=feature_dim, output_dim=num_filters, input_length=feature_dim)(input_x) # GCNN层 conv = Convolution1D(filters=num_filters, kernel_size=filter_size, padding='same', activation='relu', kernel_regularizer=l2(l2_reg))(embedding) conv = MaxPooling1D(pool_size=2)(conv) # 将GCNN输出的特征矩阵转换为适合全连接层输入的形状 conv = Flatten()(conv) # 全连接层 hidden = Dense(hidden_dim, activation='relu', kernel_regularizer=l2(l2_reg))(conv) hidden = Dropout(dropout_rate)(hidden) # 输出层 output = Dense(output_dim, activation='softmax')(hidden) # 定义模型 model = Model(inputs=input_x, outputs=output) # 编译模型 model.compile(loss='categorical_crossentropy', optimizer=Adam(lr=0.01), metrics=['accuracy']) return model if __name__ == '__main__': # 加载数据 features, adj_matrix, labels = load_data() # 划分训练集和测试集 train_features, test_features, train_labels, test_labels = train_test_split(features, labels, test_size=0.2, random_state=42) # 构建模型 model = build_model(feature_dim=features.shape[1], output_dim=labels.shape[1], adj_matrix=adj_matrix) # 训练模型 model.fit(train_features, train_labels, validation_data=(test_features, test_labels), epochs=10, batch_size=64) # 评估模型 score = model.evaluate(test_features, test_labels, verbose=0) print('Test loss:', score[0]) print('Test accuracy:', score[1]) ``` 值得注意的是,这里使用了Cora数据集作为示例,如果想要使用其他数据集,需要根据实际情况进行相应的修改。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值