从零学习量化交易46多层感知器股票预测模型优化3

模型优化:在前一个例题中mlp020函数中,中间增加了两行Dense全连接层,多了一个初始化参数。

(1)打开Spyder软件,在目录D:\zwPython\zwrk\1_Quant_TensorFlow,新建文件

# -*- coding: utf-8 -*-
"""
Created on Mon Feb 17 14:44:30 2025
#多层感知器股票预测模型优化

@author: Administrator
"""


import sys, os
sys.path.append("topqt/")

import numpy as np
import pandas as pd
import tushare as ts
import plotly as py
import plotly.figure_factory as pyff

import math
import arrow
import ffn
import pypinyin
import pandas_datareader as pdr
import matplotlib.pyplot as plt

import zsys2025  # 20250213
import ztools2025 as zt
import ztools_str as zstr
import ztools_data2025 as zdat
import ztools_draw2025 as zdr
import ztools_tq2025 as ztq  # 20250213
import zai_keras2025 as zks

import tensorflow as tf
from tensorflow.keras.models import Sequential, load_model
from tensorflow.keras.layers import Dense, Input, Dropout
from tensorflow.keras.optimizers import RMSprop
from tensorflow.keras.utils import plot_model
from tensorflow.keras.callbacks import TensorBoard

import tensorlayer as tl


# 1
print('\n#1,set.sys')
pd.set_option('display.width', 450)
pd.set_option('display.float_format', zt.xfloat3)
rlog = os.path.join('tmp', 'log_tmp')
# 注意:tf.gfile.DeleteRecursively 在 TensorFlow 2.x 中已被弃用,使用 tf.io.gfile.rmtree 替代
if os.path.exists(rlog):
    tf.io.gfile.rmtree(rlog)

# 2
print('\n#2,读取数据')
rss, fsgn, ksgn = 'tmp1/', 'TDS2_sz50', 'avg'
xlst = zsys2025.TDS_xlst9
zt.prx('xlst', xlst)
#
df_train, df_test, x_train, y_train, x_test, y_test = zdat.frd_TDS(rss, fsgn, ksgn, xlst)
print('\ndf_test.tail()')
print(df_test.tail())
print('\nx_train.shape,', x_train.shape)
print('\ntype(x_train),', type(x_train))

# 3
print('\n#3,model建立神经网络模型')
num_in, num_out = len(xlst), 1
print('\nnum_in,num_out:', num_in, num_out)
mx = zks.mlp020(num_in, num_out)
#
mx.summary()
plot_model(mx, to_file=os.path.join('tmp1', 'mx002_46.png'))

# 4 模型训练
print('\n#4 模型训练 fit')
# 设置 profile_batch=0 禁用性能分析
tbCallBack = TensorBoard(log_dir=rlog, write_graph=True, write_images=True, profile_batch=0)
tn0 = arrow.now()
mx.fit(x_train, y_train, epochs=500, verbose=0, batch_size=512, callbacks=[tbCallBack])
tn = zt.timNSec('', tn0, True)

# 确保保存模型的目录存在
model_save_dir = os.path.join('tmp1')
if not os.path.exists(model_save_dir):
    os.makedirs(model_save_dir)
model_save_path = os.path.join(model_save_dir, 'mx002_46.dat')
mx.save(model_save_path)

# 5 利用模型进行预测 predict
print('\n#5 模型预测 predict')
tn0 = arrow.now()
y_pred = mx.predict(x_test)
tn = zt.timNSec('', tn0, True)
df_test['y_pred'] = zdat.ds4x(y_pred, df_test.index, True)
df_test.to_csv(os.path.join('tmp1', 'df_tst_46.csv'), index=False)

(2)程序输出结果

runfile('D:/zwPython/zwrk/1_Quant_TensorFlow/46-MultilayerPerceptronStockPredictionModelOptimization-3.py', wdir='D:/zwPython/zwrk/1_Quant_TensorFlow')
Reloaded modules: zsys2025, ztools2025, zsys, ztools_str, ztools, ztools_web, ztools_data, ztools_tq, zpd_talib, ztools_data2025, zpd_talib2025, ztools_draw2025, ztools_tq2025, zai_keras2025, zai_tools2025

#1,set.sys

#2,读取数据

 xlst
['open', 'high', 'low', 'close', 'volume', 'avg', 'ma_2', 'ma_3', 'ma_5', 'ma_10', 'ma_15', 'ma_20', 'ma_25', 'ma_30', 'ma_50', 'ma_100', 'xyear', 'xmonth', 'xday', 'xday_week', 'xday_year', 'xweek_year']

df_test.tail()
       open  high   low  close  ...     y  price  price_next  price_change
94939 4.390 4.510 4.380  4.510  ... 4.580  4.450       4.580       102.921
94940 4.490 4.490 4.420  4.430  ... 4.580  4.460       4.580       102.691
94941 4.440 4.530 4.420  4.500  ... 4.580  4.470       4.580       102.461
94942 4.490 4.510 4.460  4.480  ... 4.590  4.490       4.590       102.227
94943 4.490 4.530 4.490  4.520  ... 4.590  4.510       4.590       101.774

[5 rows x 26 columns]

x_train.shape, (116761, 22)

type(x_train), <class 'numpy.ndarray'>

#3,model建立神经网络模型

num_in,num_out: 22 1
Model: "sequential_1"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
dense_2 (Dense)              (None, 88)                2024      
_________________________________________________________________
dense_3 (Dense)              (None, 1)                 89        
=================================================================
Total params: 2,113
Trainable params: 2,113
Non-trainable params: 0
_________________________________________________________________

#4 模型训练 fit
133.4 s, 15:04:35 ,t0, 15:02:22
WARNING:tensorflow:AutoGraph could not transform <function canonicalize_signatures.<locals>.signature_wrapper at 0x000001C295B151F8> and will run it as-is.
Please report this to the TensorFlow team. When filing the bug, set the verbosity to 10 (on Linux, `export AUTOGRAPH_VERBOSITY=10`) and attach the full output.
Cause: Bad argument number for Name: 3, expecting 4
WARNING: AutoGraph could not transform <function canonicalize_signatures.<locals>.signature_wrapper at 0x000001C295B151F8> and will run it as-is.
Please report this to the TensorFlow team. When filing the bug, set the verbosity to 10 (on Linux, `export AUTOGRAPH_VERBOSITY=10`) and attach the full output.
Cause: Bad argument number for Name: 3, expecting 4
INFO:tensorflow:Assets written to: tmp1\mx002_46.dat\assets

#5 模型预测 predict
1.05 s, 15:04:37 ,t0, 15:04:36

(3)程序代码注释

# -*- coding: utf-8 -*-
"""
Created on Mon Feb 17 14:44:30 2025
#多层感知器股票预测模型优化

@author: Administrator
"""

# 导入 sys 和 os 模块
# sys 模块提供了与 Python 解释器交互的功能,如修改模块搜索路径
# os 模块用于与操作系统进行交互,如文件和目录操作
import sys, os
# 将 'topqt/' 目录添加到 Python 的模块搜索路径中
# 这样在后续导入自定义模块时,Python 解释器会在该目录下查找
sys.path.append("topqt/")

# 导入 numpy 库,用于高效的数值计算和数组操作
import numpy as np
# 导入 pandas 库,用于数据处理和分析,提供了 DataFrame 等数据结构
import pandas as pd
# 导入 tushare 库,可用于获取金融数据,如股票行情等
import tushare as ts
# 导入 plotly 库,用于创建交互式可视化图表
import plotly as py
# 导入 plotly.figure_factory 模块,提供了创建特定类型图表的工厂函数
import plotly.figure_factory as pyff

# 导入 math 模块,提供基本的数学函数
import math
# 导入 arrow 库,用于处理日期和时间
import arrow
# 导入 ffn 库,用于金融数据分析和绩效评估
import ffn
# 导入 pypinyin 库,用于将中文转换为拼音
import pypinyin
# 导入 pandas_datareader 库,可从多种数据源读取数据
import pandas_datareader as pdr
# 导入 matplotlib.pyplot 模块,用于创建静态可视化图表
import matplotlib.pyplot as plt

# 导入自定义模块 zsys2025,可能包含系统配置相关信息
import zsys2025  # 20250213
# 导入自定义模块 ztools2025 并将其重命名为 zt,可能包含通用工具函数
import ztools2025 as zt
# 导入自定义模块 ztools_str,可能包含字符串处理工具函数
import ztools_str as zstr
# 导入自定义模块 ztools_data2025 并将其重命名为 zdat,可能包含数据处理工具函数
import ztools_data2025 as zdat
# 导入自定义模块 ztools_draw2025 并将其重命名为 zdr,可能包含绘图工具函数
import ztools_draw2025 as zdr
# 导入自定义模块 ztools_tq2025 并将其重命名为 ztq,可能包含与 tushare 相关的工具函数
import ztools_tq2025 as ztq  # 20250213
# 导入自定义模块 zai_keras2025 并将其重命名为 zks,可能包含与 Keras 相关的工具函数
import zai_keras2025 as zks

# 导入 tensorflow 库,用于构建和训练深度学习模型
import tensorflow as tf
# 从 tensorflow.keras.models 模块导入 Sequential 和 load_model 函数
# Sequential 用于构建顺序模型,load_model 用于加载已保存的模型
from tensorflow.keras.models import Sequential, load_model
# 从 tensorflow.keras.layers 模块导入 Dense、Input 和 Dropout 层
# Dense 是全连接层,Input 用于定义输入层,Dropout 用于防止过拟合
from tensorflow.keras.layers import Dense, Input, Dropout
# 从 tensorflow.keras.optimizers 模块导入 RMSprop 优化器,用于优化模型参数
from tensorflow.keras.optimizers import RMSprop
# 从 tensorflow.keras.utils 模块导入 plot_model 函数,用于可视化模型结构
from tensorflow.keras.utils import plot_model
# 从 tensorflow.keras.callbacks 模块导入 TensorBoard 回调函数,用于记录训练日志
from tensorflow.keras.callbacks import TensorBoard

# 导入 tensorlayer 库,是一个基于 TensorFlow 的深度学习库
import tensorlayer as tl

# 1. 设置系统相关参数
print('\n#1,set.sys')
# 设置 pandas 显示数据的宽度为 450 个字符,避免数据显示时出现省略号
pd.set_option('display.width', 450)
# 设置 pandas 显示浮点数的格式,使用自定义函数 zt.xfloat3 进行格式化
pd.set_option('display.float_format', zt.xfloat3)
# 定义 TensorBoard 日志文件的存储路径
rlog = os.path.join('tmp', 'log_tmp')
# 检查日志目录是否存在,如果存在则删除该目录及其所有内容
# 注意:tf.gfile.DeleteRecursively 在 TensorFlow 2.x 中已被弃用,使用 tf.io.gfile.rmtree 替代
if os.path.exists(rlog):
    tf.io.gfile.rmtree(rlog)

# 2. 读取数据
print('\n#2,读取数据')
# 定义数据文件所在的目录
rss = 'tmp1/'
# 定义数据文件的标识,可能用于区分不同类型的数据
fsgn = 'TDS2_sz50'
# 定义数据的关键字标识,可能用于指定数据的特定特征
ksgn = 'avg'
# 从 zsys2025 模块中获取特征列表,该列表包含用于模型训练的特征
xlst = zsys2025.TDS_xlst9
# 调用自定义函数 zt.prx 打印特征列表的信息,方便查看和确认
zt.prx('xlst', xlst)
# 调用自定义函数 zdat.frd_TDS 读取训练数据和测试数据
# 该函数会返回训练集和测试集的 DataFrame 以及对应的特征和标签
df_train, df_test, x_train, y_train, x_test, y_test = zdat.frd_TDS(rss, fsgn, ksgn, xlst)
# 打印测试集 DataFrame 的最后几行信息,方便查看数据情况
print('\ndf_test.tail()')
print(df_test.tail())
# 打印训练特征的形状信息,了解训练数据的维度
print('\nx_train.shape,', x_train.shape)
# 打印训练特征的数据类型,确认数据类型是否符合要求
print('\ntype(x_train),', type(x_train))

# 3. 建立神经网络模型
print('\n#3,model建立神经网络模型')
# 计算输入层的神经元数量,即特征的数量
num_in = len(xlst)
# 定义输出层的神经元数量,这里为 1,可能用于预测单个值,如股票价格
num_out = 1
# 打印输入层和输出层的神经元数量,方便确认模型结构
print('\nnum_in,num_out:', num_in, num_out)
# 调用自定义函数 zks.mlp020 构建多层感知器模型
# 该函数根据输入层和输出层的神经元数量构建模型,可能是优化后的模型版本
mx = zks.mlp020(num_in, num_out)
# 打印模型的概要信息,包括层结构、参数数量等
mx.summary()
# 将模型的结构可视化,并保存为 'tmp1/mx002_46.png' 文件
plot_model(mx, to_file=os.path.join('tmp1', 'mx002_46.png'))

# 4. 模型训练
print('\n#4 模型训练 fit')
# 创建 TensorBoard 回调函数,用于记录模型训练过程中的信息
# log_dir:指定日志文件的存储路径
# write_graph:是否记录模型的计算图
# write_images:是否记录模型的权重信息
# profile_batch=0:禁用性能分析,避免额外开销
tbCallBack = TensorBoard(log_dir=rlog, write_graph=True, write_images=True, profile_batch=0)
# 记录训练开始的时间
tn0 = arrow.now()
# 使用训练数据对模型进行训练
# x_train:训练特征
# y_train:训练标签
# epochs:训练的轮数,即模型对整个训练数据进行迭代训练的次数
# verbose=0:不显示详细的训练过程信息
# batch_size:每次训练使用的样本数量
# callbacks:指定回调函数,这里使用 TensorBoard 回调函数记录训练信息
mx.fit(x_train, y_train, epochs=500, verbose=0, batch_size=512, callbacks=[tbCallBack])
# 计算训练所花费的时间,并打印出来
tn = zt.timNSec('', tn0, True)

# 确保保存模型的目录存在,如果不存在则创建该目录
model_save_dir = os.path.join('tmp1')
if not os.path.exists(model_save_dir):
    os.makedirs(model_save_dir)
# 定义模型保存的路径
model_save_path = os.path.join(model_save_dir, 'mx002_46.dat')
# 将训练好的模型保存到指定路径
mx.save(model_save_path)

# 5. 利用模型进行预测
print('\n#5 模型预测 predict')
# 记录预测开始的时间
tn0 = arrow.now()
# 使用训练好的模型对测试数据进行预测
y_pred = mx.predict(x_test)
# 计算预测所花费的时间,并打印出来
tn = zt.timNSec('', tn0, True)
# 将预测结果转换为适合 DataFrame 的格式,并添加到测试集 DataFrame 中
df_test['y_pred'] = zdat.ds4x(y_pred, df_test.index, True)
# 将包含预测结果的测试集 DataFrame 保存为 CSV 文件
df_test.to_csv(os.path.join('tmp1', 'df_tst_46.csv'), index=False)

(4)程序涉及的函数

def mlp020(num_in=10,num_out=1):
    model = Sequential()
    #
    model.add(Dense(num_in*4, input_dim=num_in, kernel_initializer='normal', activation='relu'))
    model.add(Dense(num_out, kernel_initializer='normal'))
    #
    model.compile(loss='mean_squared_error', optimizer='adam', metrics=['accuracy'])
    #--------------
    #
    return model

发布者:股市刺客,转载请注明出处:https://www.95sca.cn/archives/907106
站内所有文章皆来自网络转载或读者投稿,请勿用于商业用途。如有侵权、不妥之处,请联系站长并出示版权证明以便删除。敬请谅解!

(0)
股市刺客的头像股市刺客
上一篇 5小时前
下一篇 5小时前

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注