2-深度学习挖短线股-2-训练数据计算

2  训练数据计算

        选择2017年12月31日及之前的数据作为训练数据,计算训练数据的输入特征及分类标签。将10个交易内上涨幅度超过10%的股票标记为类别1,其他股票标记为类别0。为了给深度学习模型提供更多的输入维度,可以基于日线数据的开盘价、收盘价、最高价、最低价、成交量等进行扩展。这里只扩展5、10、20、30、60、120、240均线及均量线数据,后续可根据需要计算MACD、KDJ、RSI等指标数据,进一步扩展输入维度。

         程序的主要处理流程是:首先定义了买入信号的计算逻辑,即未来 N 个交易日内涨幅达到 INC_PER 则标记为买入信号;然后读取股票代码列表,逐个处理每只股票的数据,计算多种移动平均线指标;最后根据预设条件生成买入信号,并将所有处理后的数据保存到新文件中。注释部分还列出了其他可扩展的技术指标计算函数,方便后续扩展使用。

# -*- coding: utf-8 -*-
"""
Created on Thu Jun  5 08:54:22 2025

@author: Administrator
"""
from __future__ import (absolute_import, division, print_function,
                        unicode_literals)
import datetime  # 导入datetime模块用于日期时间操作
import os.path  # 导入os.path模块用于路径处理
import sys  # 导入sys模块用于获取脚本路径等系统信息
import pandas as pd  # 导入pandas模块用于数据处理
import numpy as np  # 导入numpy模块用于数值计算

# 引入topq_talib,计算技术指标
script_path = os.path.dirname(os.path.abspath(sys.argv[0]))  # 获取当前脚本路径
talib_path = os.path.join(script_path, '../../TQDat/TQDown2020v1/topqt/')  # 计算topq_talib模块路径
sys.path.append(talib_path)  # 将topq_talib模块路径添加到系统路径
import topq_talib1 as tt  # 导入topq_talib1模块并命名为tt

# 类别标准:N个交易日内上涨INC_PER
N = 10  # 定义预测周期为10个交易日
INC_PER = 0.1  # 定义上涨阈值为10%

# n 天内上涨inc_per
def calc_buy_signal(df, n, inc_per):
    df = df[df.notnull().T.all()]  # 移除包含空值的列
    buy = np.zeros(df.shape[0])  # 创建全0数组用于存储买入信号
    df.insert(df.shape[1], 'buy', buy)  # 在DataFrame中插入buy列,初始值为0
    df = df.copy()  # 复制DataFrame防止SettingWithCopyWarning
    
    row_i = 0
    for row_i in range(df.shape[0]):  # 遍历DataFrame的每一行
        for n_i in range(n):  # 遍历未来n个交易日
            # 检查是否超出数据范围,并且是否满足上涨条件
            if row_i + n_i + 1 < df.shape[0] and \
                df.iloc[row_i + n_i + 1].at['close'] - df.iloc[row_i].at['close'] > inc_per * df.iloc[row_i].at['close']:
                df.loc[df.index[row_i], 'buy'] = 1  # 满足条件则标记为买入信号
                break  # 找到第一个满足条件的交易日即退出内层循环
    return df  # 返回添加了买入信号的DataFrame

# 读入股票代码
stk_code_file = './stk_data/dp_stock_list.csv'  # 定义股票代码文件路径
stk_pools = pd.read_csv(stk_code_file, encoding='gbk')  # 读取股票代码文件

# 对每个股票添加衍生数据
for stk_code in stk_pools['code']:  # 遍历每只股票
    # 读入数据
    input_file = './stk_data/d/' + stk_code + '.csv'  # 定义股票数据文件路径
    if not os.path.exists(input_file):  # 检查文件是否存在
        continue  # 文件不存在则跳过当前循环
    
    df = pd.read_csv(input_file, index_col=0)  # 读取股票数据,设置index列为索引
    df = df.sort_index(ascending=True)  # 按索引升序排序
    
    # MA
    ma_list = [5, 10, 20, 30, 60, 120, 240]  # 定义移动平均线周期列表
    for i in ma_list:  # 遍历每个周期
        df = tt.MA_n(df, i)  # 计算i周期的移动平均线并添加到DataFrame
    
    # vol_MA
    vol_ma_list = [5, 10, 20, 30, 60, 120, 240]  # 定义成交量移动平均线周期列表
    for i in vol_ma_list:  # 遍历每个周期
        df = tt.vol_MA_n(df, i)  # 计算i周期的成交量移动平均线并添加到DataFrame
    
    '''可扩展指标
    #BBANDS
    df = tt.BBANDS_UpLow(df, 20)
    #MACD
    df = tt.MACD020(df, 12, 26)
    #KDJ
    df = tt.KDJ(df, 9, 3)
    #RSI
    df = tt.RSI(df, 14)
    # A/D
    ad_list = [5, 10, 20, 30, 60, 120, 240]
    for i in ad_list:
        df = tt.ACCDIST(df, i)
    # ATRcd
    atr_list = [5, 10, 20, 30, 60, 120, 240]
    for i in atr_list:
        df = tt.ATR(df, i)
    '''
    
    df = calc_buy_signal(df, N, INC_PER)  # 计算买入信号
    
    # 写出文件
    output_file = './baostock/data_ext/' + stk_code + '.csv'  # 定义输出文件路径
    df.to_csv(output_file)  # 将处理后的数据保存为CSV文件
    print(stk_code + ' done!')  # 打印完成提示

<think>嗯,用户想要用PyTorch和GPU训练一个深度学习模型,用于币安的合约短线交易。首先,我需要理清楚整个流程。用户提到了从交易所获取K线数据,然后加入一系列技术指标,比如OBV、OBV移动平均组合、EMA、RSI、MACD、ATR、ADX、+DI、-DI,这些都需要用ta-lib来计算。然后,模型训练时如果程序退出要自动保存,下次继续训练。最后要给出完整代码。 首先,数据获取部分。币安有API,可以用python-binance库来获取历史K线数据。需要处理时间范围,比如用户可能用1分钟或5分钟的K线,但这里可能需要用户自己指定。然后,获取到数据后,需要计算各种技术指标。ta-lib的函数需要正确应用,比如OBV需要收盘价和成交量,移动平均可能需要计算OBV的均线。EMA、RSI、MACD这些都比较标准,但要注意参数设置是否正确。ADX和±DI可能需要单独计算,ATR也是。需要确保所有指标都能正确添加到数据集中。 接下来是数据预处理。拿到所有指标后,可能需要做标准化或归一化,因为不同指标的尺度差异大。同时,要处理缺失值,比如某些指标在开始的时候没有值,可能需要填充或删除。然后,构建特征和标签。短线交易通常是分类问题,比如预测涨跌,或者是回归问题,预测价格变化。需要明确标签怎么定义,比如未来几个时间点的涨跌。 然后是模型设计。使用PyTorch搭建神经网络,考虑到时间序列数据,可能用LSTM或Transformer结构。需要确定输入特征的维度,隐藏层大小,输出层结构等。还要确保模型在GPU上运行,所以要有device参数,把模型和数据移到GPU。 训练循环部分,需要设置合适的损失函数和优化器。分类的话用交叉熵,回归用MSE或MAE。还要处理数据的批次训练,可能需要用DataLoader。另外,用户提到程序退出时自动保存模型,所以需要处理信号,比如捕获SIGINT或SIGTERM,然后在信号处理函数中保存模型和优化器状态。同时,程序启动时要检查是否有保存的检查点,继续训练。 另外,数据存储可能需要用HDF5或CSV来保存,避免每次重新下载。但用户可能希望每次运行都获取最新数据,所以需要考虑时间范围,比如每次获取最近的数据,然后合并到已有数据中。 测试部分,可能需要划分训练集和测试集,或者用时间序列的交叉验证。还需要注意不要有未来数据泄露,确保每个训练批次的数据都是历史数据。 还有一个问题是,币安的API可能有速率限制,需要处理异常和重试。同时,实时交易部分用户没有提到,但代码可能只是训练模型,实际交易可能需要另外的脚本。但用户的问题主要是训练模型的代码,所以可能不需要实现交易部分。 代码结构大概分为几个部分:数据获取、指标计算数据预处理、模型定义、训练循环、信号处理和模型保存。需要逐一实现这些部分。可能需要处理的一些细节包括:ta-lib的安装问题,因为ta-lib在某些系统上安装比较麻烦;GPU是否可用,代码中需要检查;数据的时间戳处理,确保顺序正确;特征和标签的对齐,避免错位。 最后,测试代码是否能正常处理中断信号,保存和加载检查点是否正确,以及模型是否在GPU上训练。可能还需要考虑使用验证集来调整超参数,但用户没有特别提到,所以可能暂时不做。 总结一下,步骤大概是: 1. 安装必要的库,如python-binance, pytorch, ta-lib, pandas等。 2. 编写获取K线数据的函数,处理成DataFrame。 3. 使用ta-lib计算所有需要的指标,添加到DataFrame。 4. 数据清洗,处理缺失值,标准化。 5. 构建数据集,划分特征和标签,创建PyTorch Dataset。 6. 定义模型结构,确保使用GPU。 7. 编写训练循环,包括优化器、损失函数。 8. 实现信号处理,保存模型和优化器状态。 9. 加载检查点,继续训练。 10. 主函数中整合所有步骤。 需要注意的潜在问题包括API密钥的安全性,数据获取的稳定性,指标计算的正确性,以及模型是否过拟合。用户可能需要自己调整模型结构和参数,但代码需要提供一个可工作的框架。</think>以下是一个基于PyTorch实现的加密货币交易模型训练框架,包含您要求的关键功能。请注意这需要根据实际需求调整参数和数据预处理逻辑: ```python import os import signal import numpy as np import pandas as pd import torch import torch.nn as nn from torch.utils.data import Dataset, DataLoader from binance.client import Client import talib as ta # 常量定义 SYMBOL = 'BTCUSDT' TIMEFRAME = Client.KLINE_INTERVAL_15MINUTE BATCH_SIZE = 64 SEQ_LENGTH = 60 CHECKPOINT_PATH = 'model_checkpoint.pth' # 神经网络模型定义 class TradingModel(nn.Module): def __init__(self, input_size, hidden_size=128, num_layers=3): super().__init__() self.lstm = nn.LSTM(input_size, hidden_size, num_layers, batch_first=True) self.fc = nn.Sequential( nn.Linear(hidden_size, 64), nn.ReLU(), nn.Linear(64, 3), # 输出3个类别:做多、平仓、做空 nn.Softmax(dim=1) ) self.device = torch.device('cuda' if torch.cuda.is_available() else 'cpu') self.to(self.device) def forward(self, x): h0 = torch.zeros(self.lstm.num_layers, x.size(0), self.lstm.hidden_size).to(self.device) c0 = torch.zeros(self.lstm.num_layers, x.size(0), self.lstm.hidden_size).to(self.device) out, _ = self.lstm(x, (h0, c0)) return self.fc(out[:, -1, :]) # 数据处理类 class TradingDataset(Dataset): def __init__(self, data, seq_length=SEQ_LENGTH): self.data = data self.seq_length = seq_length def __len__(self): return len(self.data) - self.seq_length def __getitem__(self, idx): seq = self.data[idx:idx+self.seq_length] label = self.create_label(seq) return torch.FloatTensor(seq[:-1]), torch.LongTensor([label]) def create_label(self, seq): # 根据价格变化创建标签(需根据策略调整) price_change = (seq[-1, 0] - seq[0, 0]) / seq[0, 0] if price_change > 0.005: return 0 # 做多 elif price_change < -0.005: return 2 # 做空 return 1 # 平仓 # 信号处理函数 def save_checkpoint(signum, frame): print("\nSaving model checkpoint...") torch.save({ 'model_state_dict': model.state_dict(), 'optimizer_state_dict': optimizer.state_dict(), 'epoch': epoch }, CHECKPOINT_PATH) exit(0) # 获取历史数据 def get_historical_data(client, symbol, timeframe, limit=1000): klines = client.get_klines(symbol=symbol, interval=timeframe, limit=limit) df = pd.DataFrame(klines, columns=['timestamp', 'open', 'high', 'low', 'close', 'volume', 'close_time', 'quote_asset_volume', 'trades', 'taker_buy_base', 'taker_buy_quote', 'ignore']) df = df.astype({'open':float, 'high':float, 'low':float, 'close':float, 'volume':float}) return df # 特征工程 def calculate_features(df): # 计算技术指标 close = df['close'].values high = df['high'].values low = df['low'].values volume = df['volume'].values # OBV相关 df['obv'] = ta.OBV(close, volume) df['obv_ma'] = ta.MA(df['obv'], timeperiod=20) # 趋势指标 df['ema'] = ta.EMA(close, timeperiod=20) df['rsi'] = ta.RSI(close, timeperiod=14) df['macd'], df['macdsignal'], df['macdhist'] = ta.MACD(close) # 波动率指标 df['atr'] = ta.ATR(high, low, close, timeperiod=14) # 方向指标 df['adx'] = ta.ADX(high, low, close, timeperiod=14) df['plus_di'] = ta.PLUS_DI(high, low, close, timeperiod=14) df['minus_di'] = ta.MINUS_DI(high, low, close, timeperiod=14) # 数据清洗 df = df.dropna() return df # 主程序 if __name__ == "__main__": # 初始化币安客户端 client = Client(api_key='YOUR_API_KEY', api_secret='YOUR_API_SECRET') # 获取并处理数据 df = get_historical_data(client, SYMBOL, TIMEFRAME) df = calculate_features(df) # 数据标准化 features = df[['close', 'obv', 'obv_ma', 'ema', 'rsi', 'macd', 'atr', 'adx', 'plus_di', 'minus_di']].values mean = features.mean(axis=0) std = features.std(axis=0) features = (features - mean) / std # 创建数据集 dataset = TradingDataset(features) dataloader = DataLoader(dataset, batch_size=BATCH_SIZE, shuffle=True) # 初始化模型 model = TradingModel(input_size=features.shape[1]) optimizer = torch.optim.Adam(model.parameters(), lr=0.001) criterion = nn.CrossEntropyLoss() # 加载检查点 start_epoch = 0 if os.path.exists(CHECKPOINT_PATH): checkpoint = torch.load(CHECKPOINT_PATH) model.load_state_dict(checkpoint['model_state_dict']) optimizer.load_state_dict(checkpoint['optimizer_state_dict']) start_epoch = checkpoint['epoch'] print(f"Resuming training from epoch {start_epoch}") # 注册信号处理 signal.signal(signal.SIGINT, save_checkpoint) # 训练循环 for epoch in range(start_epoch, 100): for batch, (inputs, labels) in enumerate(dataloader): inputs = inputs.to(model.device) labels = labels.to(model.device) outputs = model(inputs) loss = criterion(outputs, labels.squeeze()) optimizer.zero_grad() loss.backward() optimizer.step() if batch % 10 == 0: print(f'Epoch: {epoch}, Batch: {batch}, Loss: {loss.item():.4f}') ``` ### 使用说明: 1. **依赖安装**: ```bash pip install python- 替换`YOUR_API_KEY`和`YOUR_API_SECRET`为币安API凭证 - 调整技术指标参数 - 修改标签生成逻辑(`create_label`方法) - 优化模型结构和超参数 3. **功能特点**: - GPU加速训练 - 支持训练过程断点续训 - 实际交易需要添加风险控制模块 - 需要根据实际数据调整标准化参数 - 建议在Linux服务器上使用nohup运行 - 注意API调用频率限制 - 需要验证指标计算的正确性 建议在实际使用前进行以下优化: 1. 添加更复杂的特征工程 2. 实现更科学的回测机制 3. 添加模型验证模块 4. 实现动态数据更新 5. 添加交易手续费计算 6. 优化内存管理(特别是处理大数据时)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

M01858682

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值