2-深度学习挖短线股-4-预测数据计算
2.4 预测数据计算
为了便于后面的回测使用,将预测数据的计算与训练数据的计算分开处理,二者计算实现逻辑基本相同,对2018年1月1日至2020年6月30日间的数据进行预测。首先定义了数据预处理函数,将连续 n 天的 K 线数据(如开盘价、收盘价、成交量等)合并为一行特征向量;然后读取股票代码列表,对每只股票的数据进行检查,如果尚未预处理,则读取扩展数据,筛选出 2020 年 6 月 30 日前的数据,并确保包含 2017 年 12 月 31 日之后的数据及其前 FEATURE_N 天的数据,最后调用预处理函数将多日数据合并为单行特征,保存到预测用的预处理文件夹中。这种处理方式为模型预测准备了合适的输入特征,同时确保了数据的时间连续性和有效性。
程序的核心功能是为股票预测模型准备输入数据,通过滑动窗口技术将历史时序数据转换为适合模型处理的特征矩阵。程序处理 2017 年 12 月 31 日之后至 2020 年 6 月 30 日的数据,确保每个预测样本包含足够的历史信息。
2.4.1 功能总结
- 时序特征构建:使用前 10 天的多项技术指标(如 MA、vol_MA 等)构建特征向量
- 预测数据筛选:仅处理 2017 年底之后的数据,确保与训练数据时间范围分离
- 数据连续性保证:确保每个样本有完整的 10 天历史数据,避免因数据缺失导致的偏差
- 批量预处理:自动处理所有符合条件的股票,生成标准化的预测输入文件
# -*- coding: utf-8 -*-
"""
Created on Mon Jun 9 09:30:59 2025
预测数据计算
@author: Administrator
"""import numpy as np # 导入数值计算库
import pandas as pd # 导入数据处理库
import os # 导入操作系统接口库# 使用前FEATURE_N的K线数据作为输入特征
FEATURE_N = 10 # 定义时间窗口大小,即使用前10天的数据构建特征# 预处理,将n行数据作为输入特征
def data_preprocessing(df, stk_code, n):df = df.copy() # 创建数据副本,避免修改原始数据# 删除无效数据列,保留特征数据ft_df = df.drop(columns=['date', 'buy']) # 移除日期和目标值列,保留技术指标# 返回值out_df = pd.DataFrame() # 初始化输出DataFrame# 生成新特征数据for i in range(n, df.shape[0]): # 从第n行开始遍历,确保有足够的历史数据# 取n行数据part_df = ft_df.iloc[i - n : i] # 获取当前行前n天的技术指标数据# 将n行合并为一行new_ft_df = pd.DataFrame(part_df.values.reshape(1, -1)) # 将n行数据展平为一行# 添加到输出DataFrameout_df = out_df.append(new_ft_df)# 重置索引并保存out_df = out_df.reset_index(drop=True) # 重置索引out_df.to_csv('./baostock/prediction_data_pre/{}.csv'.format(stk_code), index=False) # 保存处理后的数据return out_df # 返回处理后的DataFrame# 主程序:批量处理所有股票
stk_code_file = './stk_data/dp_stock_list.csv' # 定义股票代码文件路径
stk_list = pd.read_csv(stk_code_file)['code'].tolist() # 读取股票代码列表for stk_code in stk_list: # 遍历所有股票# 判断是否已经经过预处理(文件是否存在)data_file = './baostock/prediction_data_pre/{}.csv'.format(stk_code) # 定义预处理后的数据文件路径if not os.path.exists(data_file): # 检查文件是否已存在print('processing {} ...'.format(stk_code)) # 打印正在处理的股票代码# 读取数据并限制时间范围df = pd.read_csv('./baostock/data_ext/{}.csv'.format(stk_code)) # 读取扩展后的股票数据df = df[df['date'] <= '2020-06-30'] # 仅保留2020年6月30日前的数据# 选择指定日期后的数据index_list = df[df['date'] > '2017-12-31'].index.tolist() # 获取2017年后数据的索引# 确保有足够的数据if len(index_list) == 0 or min(index_list) < FEATURE_N: # 检查数据是否足够continue # 数据不足则跳过当前股票# 截取包含完整FEATURE_N天的数据df = df[min(index_list) - FEATURE_N:] # 从最早的有效索引向前取FEATURE_N天的数据# 执行数据预处理df = data_preprocessing(df, stk_code, FEATURE_N) # 调用预处理函数