基于神经网络的股票K线数据预测未来涨幅

本文介绍了一种基于全连接神经网络(Fully Connected Network, FCN)的股票K线数据预测策略。具体步骤包括数据预处理、模型构建与训练、以及模型的验证和预测。

数据预处理

数据预处理是时间序列预测中的关键步骤。我们从历史K线数据中提取特征并生成标签。以下是主要的预处理步骤:

数据加载与格式转换

首先加载历史K线数据,并将其转换为浮点型数组。

import numpy as np
import torch
import torch.nn as nn
import torch.optim as optim
from torch.utils.data import DataLoader, TensorDataset, random_split# 数据路径和参数
data_path = "dataset/BTCUSDT-2018_09_01-2024_06_01-15.npy"  # 替换为实际的文件路径
data_name = os.path.basename(data_path).split('.')[0]
data_resolution = int(data_name.split("-")[-1])# 加载数据并转换为浮点型
data = np.load(data_path)[:, :4]  # [时间, (开盘价, 最高价, 最低价, 收盘价)]
data = np.float32(data)

特征与标签生成

使用滑动窗口方法生成特征和标签。特征窗口大小为96(即过去一天的数据),标签窗口大小为16(即未来4小时的数据)。同时,我们使用快速傅里叶变换(FFT)提取频域特征。

def create_windows_with_labels(data, window_size, step_size, label_size, use_freq=True, increase_rate=0.005):"""使用滑动窗口生成特征和标签。参数:data (numpy array): 历史K线数据window_size (int): 特征窗口大小step_size (int): 滑动步长label_size (int): 标签窗口大小use_freq (bool): 是否使用频域特征increase_rate (float): 涨幅阈值返回:features (numpy array): 特征数据labels (numpy array): 标签数据"""num_windows = (len(data) - window_size - label_size) // step_size + 1features = np.zeros((num_windows, window_size), dtype='float32')labels = np.zeros((num_windows, 1), dtype='float32')for i in range(num_windows):left_start_idx = i * step_sizeleft_end_idx = left_start_idx + window_sizeright_start_idx = left_end_idxright_end_idx = right_start_idx + label_size# 提取收盘价并进行归一化处理close_prices = data[left_start_idx:left_end_idx, 3]latest_close_price = close_prices[-1]normalized_prices = (close_prices - np.mean(close_prices)) # 提取频域特征if use_freq:normalized_prices = np.abs(np.fft.fft(normalized_prices))features[i] = normalized_prices# 生成标签right_windows = data[right_start_idx:right_end_idx]if right_windows[:, 1].max() >= (1 + increase_rate) * latest_close_price:labels[i][0] = 1return features, labels# 定义窗口大小、滑动步长和标签窗口大小
window_size = 96  # 1天
step_size = 4  # 1小时
label_size = 16 # 4小时# 生成特征和标签
features, labels = create_windows_with_labels(data, window_size, step_size, label_size, use_freq=True, increase_rate=0.01)
print("label_ratio:", sum(labels[:,0])/len(labels))# 打乱数据
indices = np.arange(len(features))
np.random.shuffle(indices)
features = features[indices]
labels = labels[indices]# 转换为 PyTorch 张量
features_tensor = torch.tensor(features, dtype=torch.float32)  # [N, T]
labels_tensor = torch.tensor(labels, dtype=torch.float32)  # [N, 1]
print(features.shape, labels.shape)

数据集划分

将数据划分为训练集和验证集,训练集占比为90%。

# 创建数据集和数据加载器
dataset = TensorDataset(features_tensor, labels_tensor)
train_size = int(0.9 * len(dataset))
val_size = len(dataset) - train_size
train_dataset, val_dataset = random_split(dataset, [train_size, val_size])train_loader = DataLoader(train_dataset, batch_size=128, shuffle=True)
val_loader = DataLoader(val_dataset, batch_size=32, shuffle=False)

模型构建

我们构建了一个全连接神经网络模型,包含三层全连接层,每层后面接一个ReLU激活函数和Batch Normalization层。

# 定义全连接网络模型
class FullyConnectedNetwork(nn.Module):def __init__(self, input_dim):super(FullyConnectedNetwork, self).__init__()self.model = nn.Sequential(nn.Linear(input_dim, 1024),nn.ReLU(),nn.BatchNorm1d(1024),nn.Linear(1024, 1024),nn.ReLU(),nn.BatchNorm1d(1024),nn.Linear(1024, 1),nn.BatchNorm1d(1),nn.Sigmoid())def forward(self, x):return self.model(x)

模型训练

使用二元交叉熵损失函数(BCELoss)和Adam优化器对模型进行训练。训练过程中记录每个epoch的训练损失和验证损失,同时计算验证集的准确率。

# 初始化模型、损失函数和优化器
input_dim = features_tensor.shape[1]
model = FullyConnectedNetwork(input_dim=input_dim)
criterion = nn.BCELoss()
optimizer = optim.Adam(model.parameters(), lr=0.001)# 训练模型
num_epochs = 100
for epoch in range(num_epochs):model.train()running_loss = 0.0for i, (inputs, targets) in enumerate(train_loader):optimizer.zero_grad()outputs = model(inputs)loss = criterion(outputs, targets)loss.backward()optimizer.step()running_loss += loss.item() * inputs.size(0)epoch_loss = running_loss / train_sizeprint(f"Epoch [{epoch+1}/{num_epochs}], Training Loss: {epoch_loss:.4f}")model.eval()val_loss = 0.0correct_predictions = 0total_predictions = 0with torch.no_grad():for inputs, targets in val_loader:outputs = model(inputs)loss = criterion(outputs, targets)val_loss += loss.item() * inputs.size(0)predicted = (outputs > 0.5).float()correct_predictions += (predicted == targets).sum().item()total_predictions += targets.size(0)val_loss /= val_sizeaccuracy = correct_predictions / total_predictionsprint(f"Epoch [{epoch+1}/{num_epochs}], Validation Loss: {val_loss:.4f}, Validation Accuracy: {accuracy:.4f}")

模型预测

对训练集和验证集进行预测,并输出一些预测结果以供分析。

# 进行预测
def predict(model, data_loader):model.eval()predictions = []with torch.no_grad():for inputs, _ in data_loader:outputs = model(inputs)predictions.extend(outputs.numpy())return np.array(predictions)train_predictions = predict(model, train_loader)
val_predictions = predict(model, val_loader)# 打印一些预测结果
print("Train Predictions:", train_predictions[:10])
print("Validation Predictions:", val_predictions[:10])

总结

本文介绍了一种基于全连接神经网络的股票K线数据预测策略,并使用历史K线数据进行了回测。通过特征工程、模型构建与训练,我们可以实现对未来价格走势的预测。未来的工作可以包括优化模型结构、调整超参数以及引入更多的特征以提高预测精度。

希望本文对您有所帮助,如果有任何问题或建议,欢迎在评论区留言讨论!


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/25368.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python实现将excel数据指保存到word表格中

准备一个excel表格 上代码: import openpyxl from docx import Document# 读取Excel文件 excel_file 大学名次.xlsx wb openpyxl.load_workbook(excel_file) ws wb.active# 获取Excel文件中的所有工作表名称 sheet_names wb.sheetnames# 遍历每个工作表&#x…

ipynb转markdown的简单方法

在线转换 推荐在线转换,拖进去后下载就行,简单易操作。 Convert Jupyter notebook to GitHub-Flavored Markdown for free on AlldocsThe free text converter for all your documents.https://alldocs.app/convert-jupyter-notebook-to-markdown vsc…

Web前端不挂科:深入探索与实战指南

Web前端不挂科:深入探索与实战指南 在数字化时代的浪潮中,Web前端开发已成为一项炙手可热的技能。然而,对于许多初学者来说,如何避免在Web前端课程中挂科却成为了一道难题。本文将从四个方面、五个方面、六个方面和七个方面&…

6_1 Linux 用户管理

6_1 Linux 用户管理 文章目录 6_1 Linux 用户管理[toc]1. 用户管理2. 组账户3. 本地账户数据文件4. 用户账号创建与删除5. 设置密码6. 用户初始配置文件7. 组账户管理8. 总结 1. 用户管理 用户管理的作用:可以登入操作系统;不同的用户有不同的权限唯一标…

设备安装施工的一点总结

下工厂安装了几百台设备,总结一点经验。 信号强度造成设备不稳定 设备是使用物联网卡的联网设备,以前一直用的是单天线(虽然设计上可以接四根天线),没发现什么问题,但是这一批硬件设计有改动,稳…

PyTorch 开发环境快速安装

PyTorch 开发环境快速安装包含三大步骤,具体如下: Anaconda 图文安装教程链接 # 安装时会自带 Python conda info # 使用该命令在终端验证是否安装成功CUDA 图文安装教程链接 nvcc -v # 使用该命令在终端验证是否安装成功PycharmPyTorch 图…

双指针数组问题

删除有序数组中的重复项 重点在于p1 class Solution {public int removeDuplicates(int[] nums) {if(nums.length0) return 0;int p10,p21;while(p2<nums.length){if(nums[p2]!nums[p1]){nums[p1]nums[p2];}else p2;}return p11;} } class Solution {public void moveZeroe…

kv视频如何转码mp4格式,kv转换mp4最简单方法

在数字化时代&#xff0c;视频格式转换成为了一项日常需求。有时候我们需要把kv格式转换为MP4格式。下面将详细介绍kv转MP4的方法 方法一、 1、使用 "小白兔视频格式在线转换网站" 2、地址发给"小白兔视频格式在线转换网站"的客服&#xff0c;客服下载即可…

堆排序要点和难点以及具体案例应用

堆排序(Heap Sort)是一种基于堆数据结构的排序算法。下面我将以分点表示和归纳的方式,结合相关数字和信息,详细描述堆排序的PTA(Programming and Testing Approach,编程与测试方法)。 1. 堆排序原理 堆排序是一种树形选择排序,利用了完全二叉树的性质,通过构建最大堆…

【数据结构(邓俊辉)学习笔记】图06——最小支撑树

文章目录 0. 概述1. 支撑树2. 最小支撑树3. 歧义性4. 蛮力算法5. Prim算法5.1 割与极短跨越边5.2 贪心迭代5.3 实例5.4 实现5.5 复杂度 0. 概述 学习下最小支撑树和prim算法。 1. 支撑树 最小的连通图是树。 连通图G的某一无环连通子图T若覆盖G中所有的顶点&#xff0c;则称…

(delphi11最新学习资料) Object Pascal 学习笔记---第14章泛型第2节(泛型类型实例化)

14.2.3 泛型类型实例化 ​ 请注意&#xff0c;这是一个相当高级的一节内容&#xff0c;重点关注泛型的一些内部细节及其潜在的优化。如果这是您第一次学习泛型&#xff0c;那么建议您多读一遍。 ​ 除了一些优化之外&#xff0c;每次实例化泛型类型时&#xff0c;无论是在方法…

[沉迷理论]进制链表树

往期文章推荐&#xff1a; 题解之最大子矩阵-CSDN博客 洛谷P1115最大子段和[神奇的题目]-CSDN博客 &#xff08;一条神奇的分割线&#xff09; 前言 好久没有更新的我总算在百忙之中抽出时间写了篇博客。 最近总算结束了动态规划的学习&#xff0c;真的是头昏脑涨啊。 最…

45.django - 开始建立第一个项目

1.django是什么&#xff1f; Django是一个高级的、免费的、开源的Web应用框架&#xff0c;它由Python编程语言编写而成。Django遵循模型-视图-控制器&#xff08;MVC&#xff09;的设计模式&#xff0c;但通常将其称为模型-视图-模板&#xff08;MVT&#xff09;架构。它的主要…

Silanna UV光荣推出了一款革命性的高功率远紫外线LED

这款令人瞩目的光源&#xff0c;拥有令人震撼的235nm波长&#xff0c;并被巧妙地封装在紧凑的6.8mm结构中&#xff0c;其魅力与实力兼具。 今年六月&#xff0c;在苏格兰圣安德鲁斯大学举行的盛大2024年远紫外科学和技术国际大会&#xff08;ICFUST&#xff09;上&#xff0c;S…

华为坤灵路由器配置telnet

在用户视图下执行命令install feature-software WEAKEA安装弱安全算法/协议特性包&#xff08;WEAKEA&#xff09;。配置Telnet服务器的管理网口IP地址。 <HUAWEI> system-view [HUAWEI] sysname Telnet Server [Telnet Server] interface meth 0/0/0 [Telnet Server-ME…

[一] 解释自己思维判断与行为 - 《情报分析心理学》读后感

读后记第一篇 以下大部分内容并非直接来自翻译&#xff0c;均为笔者学习阅读后书面、口述语言 我们将通过未曾接触过的情报分析心理学 认知心理学角度上认识并解释自己 前言 网络安全与情报学的融合 花了一周多的时间学习完了《情报分析心理学》&#xff0c;正如书中所讲的…

######## redis各章节终篇索引 ############

1、数据结构 关系&#xff1a; zset&#xff1a;ziplist&#xff08;注意是可变长度的&#xff0c;下同&#xff09;、skiplist hash&#xff1a;ziplist、hashTable&#xff08;是一种子结构&#xff0c;区别于hash&#xff09; set&#xff1a;inset&#xff08;有序列表&…

C# WPF入门学习主线篇(十七)—— UniformGrid布局容器

C# WPF入门学习主线篇&#xff08;十七&#xff09;—— UniformGrid布局容器 欢迎来到C# WPF入门学习系列的第十七篇。在前几篇文章中&#xff0c;我们已经探讨了 Canvas、StackPanel、WrapPanel、DockPanel 和 Grid 布局容器及其使用方法。本篇博客将介绍另一种非常实用且简单…

多目标检测模型加权框集成

优秀项目推荐&#xff1a;https://gitcode.com/ZFTurbo/Weighted-Boxes-Fusion/overview 参考链接&#xff1a; 目标检测加权框融合 WBF原理讲解 https://blog.csdn.net/YXD0514/article/details/132574588 目标检测加权框融合 WBF原理讲解&#xff08;Weighted Boxes Fusion&…

程序员的电工基础

什么是“强电”、什么是“弱电” 强电指的是动力线&#xff0c;弱电指的是信号线&#xff08;数据线&#xff09;。不是指电压高低。 历史上强电一般是较高的电压&#xff0c;典型的&#xff0c;大部分国家标准电压是220伏&#xff0c;三相电机采用三相四线或三相三线驱动&…