基于Lenet-5预测股票走势

1、概述

        关于Lenet-5的介绍以及应用,参考CNN-LeNet网络图像分类_月融花下的博客-CSDN博客

2、特征分析

        数据集:tt.csv

date时间
open开盘价
high最高价
low最低价
close关盘价
label1或者-1

          Lenet-5是基于对图片的二维卷积,图片本质上是二维数据(黑白)和三维数据(彩色),需要构建二维数据。其中以窗口滑动的方式,将open、high、low构成特征集,以窗口大小里出现label次数最多的数字作为标签集。

3、实验部分

        numpy中文文档NumPy

        sklearn中文文档sklearn中文文档

        tensorflow文档Module: tf  |  TensorFlow v2.13.0

        3.1 模块加载

import pandas as pd
from sklearn.preprocessing import minmax_scale
import numpy as np
from sklearn.preprocessing import OneHotEncoder
from sklearn.model_selection import train_test_split
from scipy.stats import mode
import tensorflow.compat.v1 as tf

        3.2 数据处理

                3.2.1 读取数据
df = pd.read_csv("../data/stock_forecast/tt.csv")
#数据归一化
df["open"] = minmax_scale(df['open'])
df['high'] = minmax_scale(df['high'])
df['low'] = minmax_scale(df['low'])

df.head()

                   3.2.2 构建数据
#构建向量矩阵
data = []
label = []

                以90为窗口大小进行滑动。

#定义窗口函数
def windows(data,size):
    start = 0;
    while start<data.count():
        yield int(start),int(start+size) #(0,90) (45,135) (90,180) (135,225)
        start += (size/2)
#返回格式数据
def segment_signal(data,window_size=90):
    segments = np.empty((0,window_size,3)) #(0,90,3)
    print("segments的结构:\t",segments.shape)
    labels = np.empty(0) #(0,)
    print("labels的结构 :\t",labels.shape)
    for (start,end) in windows(data["date"],window_size):
        x = data["open"][start:end]
        y = data["high"][start:end]
        z = data["low"][start:end]
        if (len(df["date"][start:end])==window_size):
            segments = np.vstack([segments,np.dstack([x,y,z])])  # np.dstack([x,y,z]) (1,90,3)
            labels = np.append(labels,mode(data["label"][start:end])[0])
    return segments,labels
#选取间隔90的数据为特征数据,标签预测最多的为标签数据,一一对应
data,label = segment_signal(df) #data (15,90,3) label (15,)
print("data:",data.shape)
print("label:",label.shape)

#对标签进行数据处理,用
for i in range(0,len(label)):
    if label[i] == -1:
        label[i] = 0;
x_train,x_test,y_train,y_test= train_test_split(data,label,test_size=0.2)
x_train = np.array(x_train).reshape(len(x_train),90,3) #(12,90,3)
x_test = np.array(x_test).reshape(len(x_test),90,3)  #(3,90,3)
y_train = np.array(y_train).reshape(-1,1) #(12,1)
y_test = np.array(y_test).reshape(-1,1)   #(3,1)
y_train.shape

                3.2.3 标签独热编码
#one-hot
enc = OneHotEncoder()
enc.fit(y_train)
y_train = enc.transform(y_train).toarray() #(12,2)
y_test = enc.transform(y_test).toarray() #(3,2)
print(y_train)

         3.3 网络结构

                3.3.1 设置参数
in_channels = 3
units = 256
epoch = 10000
batch_size = 5
batch = x_train.shape[0]/batch_size
                3.3.2 占位符
#创建占位符
tf.disable_eager_execution()
x = tf.placeholder(tf.float32,shape=(None,90,3)) #(None,90,3)
y = tf.placeholder(tf.float32,shape=(None,2))    #(None,3)
                3.3.3 网络结构

                        卷积层+池化层

#layer1
h1 = tf.layers.conv1d(x,256,4,2,'SAME',use_bias=True,activation=tf.nn.relu) #(None,45,259)
p1 = tf.layers.max_pooling1d(h1,2,2,padding='VALID')  #(None,22,256)
print(h1.get_shape())
print(p1.get_shape())

                         卷积层+池化层

h2 = tf.layers.conv1d(p1,256,4,2,'SAME',use_bias=True,activation=tf.nn.relu)
p2 = tf.layers.max_pooling1d(h2,2,2,padding='VALID')

                        卷积层+池化层+平铺层

#layer3
h3 = tf.layers.conv1d(p1,2,4,2,'SAME',use_bias=True,activation=tf.nn.relu)
p3 = tf.layers.max_pooling1d(h3,11,1,padding='VALID')
res = tf.reshape(p3,shape=(-1,2))
print(h3.get_shape())
print(p3.get_shape())
print(res.shape)

                 3.3.4 随机梯度下降
#loss
loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits_v2(logits=res,labels=y))
#正确率
ac = tf.cast(tf.equal(tf.argmax(res,1),tf.argmax(y,1)),tf.float32)
acc = tf.reduce_mean(ac)
#优化器
optim = tf.train.AdamOptimizer(0.0001).minimize(loss)
                3.3.5 训练
with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    for i in range(10000):
        sess.run(optim,feed_dict={x:x_train,y:y_train})
        if i%100 ==0:
            los,accuracy = sess.run([loss,acc],feed_dict={x:x_train,y:y_train})
            print(loss,los)
    ccc = sess.run(tf.argmax(res,1),feed_dict={x:x_test,y:y_test})
    print(ccc)

 notebook下载地址:

              Lenet-5预测股票走势

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值