从零学习量化交易39股票DNN趋势预测Tensorflow21

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

# -*- coding: utf-8 -*-
#Tensorflow的DNN趋势预测
#

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 ztools as zt
import ztools_str as zstr
import ztools_data2025 as zdat
import ztools_draw2025 as zdr
import ztools_tq2025 as ztq  # 20250213

import tensorflow as tf

#1
print('\n#1,set.sys')
pd.set_option('display.width', 450)
pd.set_option('display.float_format', zt.xfloat3)
#rlog='/ailib/log_tmp'
rlog = 'tmp_39/log_tmp'
if os.path.exists(rlog):
    import shutil
    shutil.rmtree(rlog)

#2
print('\n#2,读取数据')
#fss='/zdat/cn/xday/000001.csv'
#fss='data/inx_000001.csv'
#fss='data/300404.csv'
#fss='data/000001.csv'
#fss='data/000001-1.csv'

fss='D:/zwPython/TQDat/day/inx/000001.csv'
df = pd.read_csv(fss, index_col=0)
df = df.sort_index()

#3
print('\n#3,整理数据')
df['xopen'] = df['open'].shift(-1)
df['xclose'] = df['close'].shift(-1)
df['kclose'] = df['xclose'] / df['xopen'] * 100
df['ktype'] = df['kclose'].apply(zt.iff3type, d0=99.5, d9=101.5, v3=3, v2=2, v1=1)
df['ktype'] = df['ktype'] - 1
#
print(df.head())
print('8888888888')
print(df.tail())
print('8888888888')

#4
print('\n#4,设置训练数据')
n9 = len(df.index)
df1 = df.head(1000)
df2 = df.tail(n9 - 1000)
#
X = df1[zsys2025.ohlcLst].values
Y = df1['ktype'].values
y1 = tf.keras.utils.to_categorical(Y)

#5
print('\n#5,构建线性回归神经网络模型')
model = tf.keras.Sequential([
    tf.keras.layers.Dense(40, input_shape=(4,)),
    tf.keras.layers.Dense(40),
    tf.keras.layers.Dense(3, activation='softmax')
])

model.compile(optimizer='adam',
              loss='categorical_crossentropy',
              metrics=['accuracy'])

#6
print('\n#6,开始训练模型')
model.fit(X, y1, epochs=100, verbose=1)

#7
print('\n#7,根据模型,进行预测')
X2 = df2[zsys2025.ohlcLst].values
Y2 = model.predict(X2)
y2v = np.argmax(Y2, axis=1)
ds2y = zdat.ds4x(y2v, df2.index)
df2['ktype2'] = ds2y
#
print(df2.tail())
df2.to_csv('tmp/df39_000001-1.csv', index=True)

#8
print('\n#8,计算预测结果')
df5 = pd.DataFrame()
df5['y_test'] = df2['ktype']
df5['y_pred'] = df2['ktype2']
acc, df5x = ztq.ai_acc_xed2x(df5['y_test'], df5['y_pred'], ky0=0.5)
#
print('\nacc,', acc)
print(df5.tail())
df5.to_csv('tmp/df39_000001-1.csv', index=True)

#9
print('\n#9,ok')

(2)程序输出结果

#7,根据模型,进行预测
               open     high      low    close  ...   xclose  kclose  ktype  ktype2
date                                            ...                                
2025-02-12 3312.260 3346.390 3310.390 3346.390  ... 3332.480  99.678      1       1
2025-02-13 3343.230 3359.180 3332.480 3332.480  ... 3346.720 100.548      1       1
2025-02-14 3328.480 3349.080 3322.530 3346.720  ... 3355.830 100.012      1       1
2025-02-17 3355.420 3357.120 3333.190 3355.830  ... 3324.490  99.269      0       1
2025-02-18 3348.980 3366.010 3314.300 3324.490  ...      nan     nan      1       1

[5 rows x 10 columns]

#8,计算预测结果

acc, 62.081
            y_test  y_pred
date                      
2025-02-12       1       1
2025-02-13       1       1
2025-02-14       1       1
2025-02-17       0       1
2025-02-18       1       1

#9,ok

(3)程序代码注释

# -*- coding: utf-8 -*-
# 声明文件使用 UTF-8 编码,确保代码文件中可以包含中文等非 ASCII 字符
#Tensorflow的DNN趋势预测
# 该代码主要使用 TensorFlow 构建一个深度神经网络(DNN)进行趋势预测

import sys, os
# 导入 sys 和 os 模块
# sys 模块提供了一些变量和函数,用于操作 Python 解释器相关的信息
# os 模块提供了与操作系统进行交互的功能,如文件和目录操作等
sys.path.append("topqt/")
# 将 "topqt/" 目录添加到 Python 的模块搜索路径中,这样可以导入该目录下的自定义模块

import numpy as np
# 导入 NumPy 库,并将其重命名为 np
# NumPy 是 Python 中用于科学计算的基础库,提供了多维数组对象和各种数学函数
import pandas as pd
# 导入 Pandas 库,并将其重命名为 pd
# Pandas 是用于数据处理和分析的库,提供了 DataFrame 和 Series 等数据结构
import tushare as ts
# 导入 tushare 库,它是一个免费、开源的 Python 财经数据接口包,可用于获取金融数据
import plotly as py
# 导入 Plotly 库,它是一个用于创建交互式可视化图表的库
import plotly.figure_factory as pyff
# 导入 Plotly 的 figure_factory 模块,用于创建一些特殊类型的图表

import math
# 导入 Python 内置的 math 模块,提供了各种数学函数
import arrow
# 导入 arrow 库,它是一个用于处理日期和时间的库,提供了更简洁易用的 API
import ffn
# 导入 ffn 库,它是一个用于金融数据分析的库,提供了一些金融计算和绘图功能
import pypinyin
# 导入 pypinyin 库,用于将中文转换为拼音
import pandas_datareader as pdr
# 导入 pandas_datareader 库,用于从各种数据源获取金融数据
import matplotlib.pyplot as plt
# 导入 Matplotlib 库的 pyplot 模块,用于创建静态可视化图表

import zsys2025  # 20250213
# 导入自定义模块 zsys2025,可能包含一些系统级别的配置和常量
import ztools as zt
# 导入自定义模块 ztools,并将其重命名为 zt,可能包含一些常用工具函数
import ztools_str as zstr
# 导入自定义模块 ztools_str,可能包含一些字符串处理的工具函数
import ztools_data2025 as zdat
# 导入自定义模块 ztools_data2025,可能包含一些数据处理的工具函数
import ztools_draw2025 as zdr
# 导入自定义模块 ztools_draw2025,可能包含一些绘图的工具函数
import ztools_tq2025 as ztq  # 20250213
# 导入自定义模块 ztools_tq2025,可能包含一些与 tushare 数据处理相关的工具函数

import tensorflow as tf
# 导入 TensorFlow 库,它是一个开源的机器学习框架,用于构建和训练深度学习模型

#1
print('\n#1,set.sys')
# 打印提示信息,表示开始进行系统设置
pd.set_option('display.width', 450)
# 设置 Pandas 数据框的显示宽度为 450 个字符,使数据显示更美观
pd.set_option('display.float_format', zt.xfloat3)
# 设置 Pandas 数据框中浮点数的显示格式,使用 zt 模块中的 xfloat3 函数进行格式化
#rlog='/ailib/log_tmp'
rlog = 'tmp_39/log_tmp'
# 定义一个日志目录路径,用于存储 TensorFlow 的日志信息
if os.path.exists(rlog):
    # 检查日志目录是否存在
    import shutil
    # 导入 shutil 模块,用于高级文件操作
    shutil.rmtree(rlog)
    # 如果日志目录存在,则递归删除该目录及其所有内容

#2
print('\n#2,读取数据')
# 打印提示信息,表示开始读取数据
#fss='/zdat/cn/xday/000001.csv'
#fss='data/inx_000001.csv'
#fss='data/300404.csv'
#fss='data/000001.csv'
#fss='data/000001-1.csv'

fss='D:/zwPython/TQDat/day/inx/000001.csv'
# 定义要读取的 CSV 文件的路径
df = pd.read_csv(fss, index_col=0)
# 使用 Pandas 的 read_csv 函数读取 CSV 文件,并将第一列作为索引列
df = df.sort_index()
# 对数据框按照索引进行排序

#3
print('\n#3,整理数据')
# 打印提示信息,表示开始整理数据
df['xopen'] = df['open'].shift(-1)
# 在数据框中新增一列 'xopen',其值为 'open' 列向下移动一行的值
df['xclose'] = df['close'].shift(-1)
# 在数据框中新增一列 'xclose',其值为 'close' 列向下移动一行的值
df['kclose'] = df['xclose'] / df['xopen'] * 100
# 在数据框中新增一列 'kclose',其值为 'xclose' 除以 'xopen' 再乘以 100 的结果
df['ktype'] = df['kclose'].apply(zt.iff3type, d0=99.5, d9=101.5, v3=3, v2=2, v1=1)
# 在数据框中新增一列 'ktype',其值是通过对 'kclose' 列的每个元素应用 zt 模块中的 iff3type 函数得到的
# d0=99.5, d9=101.5, v3=3, v2=2, v1=1 是传递给 iff3type 函数的参数
df['ktype'] = df['ktype'] - 1
# 将 'ktype' 列的值都减 1
#
print(df.head())
# 打印数据框的前几行,用于查看数据整理的结果
print('8888888888')
# 打印分隔线
print(df.tail())
# 打印数据框的后几行,用于查看数据整理的结果
print('8888888888')
# 打印分隔线

#4
print('\n#4,设置训练数据')
# 打印提示信息,表示开始设置训练数据
n9 = len(df.index)
# 获取数据框的索引长度,即数据的行数
df1 = df.head(1000)
# 取数据框的前 1000 行作为训练数据
df2 = df.tail(n9 - 1000)
# 取数据框剩余的行作为测试数据
#
X = df1[zsys2025.ohlcLst].values
# 从训练数据中提取 zsys2025 模块中定义的 ohlcLst 列的数据,并将其转换为 NumPy 数组
# 这些数据将作为模型的输入特征
Y = df1['ktype'].values
# 从训练数据中提取 'ktype' 列的数据,并将其转换为 NumPy 数组
# 这些数据将作为模型的目标标签
y1 = tf.keras.utils.to_categorical(Y)
# 使用 TensorFlow 的 Keras 模块中的 to_categorical 函数将目标标签进行 one-hot 编码

#5
print('\n#5,构建线性回归神经网络模型')
# 打印提示信息,表示开始构建线性回归神经网络模型
model = tf.keras.Sequential([
    # 使用 TensorFlow 的 Keras 模块创建一个顺序模型
    tf.keras.layers.Dense(40, input_shape=(4,)),
    # 添加一个全连接层,包含 40 个神经元,输入形状为 (4,)
    tf.keras.layers.Dense(40),
    # 再添加一个全连接层,包含 40 个神经元
    tf.keras.layers.Dense(3, activation='softmax')
    # 添加一个全连接层,包含 3 个神经元,激活函数为 softmax,用于多分类任务
])

model.compile(optimizer='adam',
              # 使用 Adam 优化器,它是一种自适应学习率的优化算法
              loss='categorical_crossentropy',
              # 使用分类交叉熵损失函数,适用于多分类问题
              metrics=['accuracy'])
# 编译模型,指定优化器、损失函数和评估指标

#6
print('\n#6,开始训练模型')
# 打印提示信息,表示开始训练模型
model.fit(X, y1, epochs=100, verbose=1)
# 使用训练数据 X 和对应的 one-hot 编码标签 y1 对模型进行训练
# epochs=100 表示训练 100 个轮次
# verbose=1 表示在训练过程中显示详细的训练信息

#7
print('\n#7,根据模型,进行预测')
# 打印提示信息,表示开始进行预测
X2 = df2[zsys2025.ohlcLst].values
# 从测试数据中提取 zsys2025 模块中定义的 ohlcLst 列的数据,并将其转换为 NumPy 数组
# 这些数据将作为模型的输入进行预测
Y2 = model.predict(X2)
# 使用训练好的模型对测试数据进行预测,得到预测结果
y2v = np.argmax(Y2, axis=1)
# 对预测结果进行处理,找出每行中最大值的索引,即预测的类别
ds2y = zdat.ds4x(y2v, df2.index)
# 使用 zdat 模块中的 ds4x 函数对预测结果进行进一步处理,可能是将其转换为合适的数据结构
df2['ktype2'] = ds2y
# 在测试数据框中新增一列 'ktype2',存储预测结果
#
print(df2.tail())
# 打印测试数据框的后几行,查看预测结果
df2.to_csv('tmp/df39_000001-1.csv', index=True)
# 将测试数据框保存为 CSV 文件,包含索引信息

#8
print('\n#8,计算预测结果')
# 打印提示信息,表示开始计算预测结果
df5 = pd.DataFrame()
# 创建一个空的数据框 df5,用于存储预测结果的评估信息
df5['y_test'] = df2['ktype']
# 在 df5 中添加一列 'y_test',存储测试数据的真实标签
df5['y_pred'] = df2['ktype2']
# 在 df5 中添加一列 'y_pred',存储模型的预测标签
acc, df5x = ztq.ai_acc_xed2x(df5['y_test'], df5['y_pred'], ky0=0.5)
# 使用 ztq 模块中的 ai_acc_xed2x 函数计算预测准确率
# ky0=0.5 是传递给该函数的一个参数
#
print('\nacc,', acc)
# 打印预测准确率
print(df5.tail())
# 打印 df5 的后几行,查看预测结果的详细信息
df5.to_csv('tmp/df39_000001-1.csv', index=True)
# 将 df5 保存为 CSV 文件,包含索引信息

#9
print('\n#9,ok')
# 打印提示信息,表示程序运行结束

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

(0)
股市刺客的头像股市刺客
上一篇 3分钟前
下一篇 1分钟前

相关推荐

发表回复

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