Skip to content

Ttttt12138/deep-project-test

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

17 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

基于 Tick 数据的涨停预测系统

版本:V3.2 (极致提纯版 - 一板一样本) 建模目标:以事件驱动方式预测"首次触板瞬间",而非涨停状态 模型方案:首次触板标签 + 内存阻断策略 + 按需特征平铺 + LightGBM 分类 数据粒度:单股票、单交易日、事件级样本


🎯 V3.2版本核心突破

🚀 核心问题解决

V3.1版本存在的问题:

  • 多次触板问题:同一只股票单日可能产生多个正样本
  • 样本纯度不足:后续触板的预测价值低于首次触板

V3.2版本的革命性改进:

  1. "一板一样本"极致提纯

    • ❌ 旧方式:同一只股票多次触板产生多个正样本
    • ✅ 新方式:按股票分组,只保留每只股票的首次触板
    • 🎯 效果:单日正样本约10-80个,对应真实涨停股票数,纯度100%
  2. 智能NaN填充策略

    • ❌ 旧方式:可能使用mean()填充,存在未来函数泄露风险
    • ✅ 新方式:价格类特征用向前/向后平推,成交量类用0填充
    • 🎯 效果:严格避免未来信息泄露,保证数据合法性
  3. 业务逻辑完美对齐

    • 建模目标:预测"今天能不能上板"的首次触板
    • 核心原则:单只股票单日最多1个正样本
    • 样本代表性:首次触板最具预测价值

项目目标

本项目旨在基于股票 Tick 级盘口数据,构建一个事件驱动型监督学习分类模型:

给定连续 10 个 Tick 的窗口信息,预测第 11 个 Tick 是否会发生"首次触板"事件

核心预测逻辑:

  • 输入:前 10 个 Tick 的盘口信息
  • 标签:y_t = 1 表示这是该股票当日首次触板瞬间
  • 含义:预测价格是否从非涨停状态首次突破到涨停

核心特性

🎯 预测目标(V3.2首次触板)

  • 预测对象:首次触板瞬间(每只股票单日仅一次)
  • 样本单位:事件级别(date, code, trigger_time)
  • 特征约束:仅使用前10个tick的信息,不使用未来信息
  • 正样本定义:仅保留每只股票的首次触板瞬时点

📊 特征工程(V3.2按需平铺)

  • 窗口特征:10个Tick的165维特征(平铺特征 + 末端特征)
  • 特征维度:15个核心特征 × 10个时间位置 + 15个末端特征 = 165维
  • 内存优化:仅对1-2万高价值样本进行特征平铺,避免20GB内存爆炸

🔄 处理流程(V3.2内存阻断 + 首次触板)

  1. 首次触板标签:按股票分组,只保留每只股票的首次触板
  2. 前置内存阻断:过滤95%无用数据
  3. 按需特征平铺:仅对保留样本进行165维提取
  4. 智能NaN填充:价格类平推,成交量类填0
  5. 两层负采样:基于距离的分层欠采样
  6. 独立欠采样:按交易日独立处理

数据组织结构

原始数据结构

2025/
  2025-01-02.7z
  2025-01-03.7z
  ...
2026/
  2026-01-02.7z
  ...

输出数据结构

data/
├── daily_train_candidates/      # 候选训练集(未欠采样,事件样本)
│   ├── 01/
│   │   ├── 2025-01-02_candidate.csv
│   │   └── ...
├── daily_train_undersampled/    # 欠采样训练集分片
│   ├── 01/
│   │   ├── 2025-01-02_train.csv
│   │   └── ...
├── logs/                        # 统计日志
│   ├── 01/
│   │   ├── 2025-01-02_summary.csv
│   │   └── ...
├── merged/                      # 合并后的多日训练集
│   └── multi_day_train.csv
└── temp_extract/               # 临时解压目录(自动清理)

CSV数据规范

  • 本项目以 CSV 作为标准数据格式,默认输出后缀统一为 .csv
  • 项目生成的 CSV 使用 utf-8-sig 编码,兼容 UTF-8,同时便于 Windows/Excel 打开中文字段。
  • 读取包含 code 的 CSV 时,股票代码按字符串读取,确保 000001 不会变成 1
  • 月份目录统一使用两位格式:0112。历史 *_old 数据不会自动删除。

训练集构建工具

单日训练集构建

python scripts/training_set_builder.py \
  --input "2025/1/2025-01-02.7z" \
  --output "d:/Qoder-project/deep project/data" \
  --mode single

批量训练集构建

python scripts/training_set_builder.py \
  --input-dir "2025/1/" \
  --output "d:/Qoder-project/deep project/data" \
  --mode batch \
  --max-files 10

欠采样配置

python scripts/training_set_builder.py \
  --input "2025/1/2025-01-02.7z" \
  --output "d:/Qoder-project/deep project/data" \
  --mode single \
  --layer1-thresholds 0.01 0.05 \
  --layer1-keep-ratios 1.0 0.3 0.05 \
  --target-ratio 5.0

合并多日训练集

python scripts/training_set_builder.py \
  --mode merge \
  --shards-dir "d:/Qoder-project/deep project/data/daily_train_undersampled" \
  --merged-output "d:/Qoder-project/deep project/data/merged/multi_day_train.csv"

特征工程设计

15个核心特征

# 涨停接近度
dist_to_limit       # 当前价距离涨停比例
ticks_to_limit      # 当前距离涨停的 tick 数
ask1_to_limit       # 当前卖一价距离涨停
ask1_gap            # 当前卖一与当前价差

# 盘口强度
bid_depth           # 当前买盘深度
ask_depth           # 当前卖盘深度
order_imbalance     # 当前 order imbalance
b1_volume           # 当前买一量
a1_volume           # 当前卖一量

# 盘口结构
spread              # 当前 spread
ask_slope           # 当前卖盘斜率
bid_slope           # 当前买盘斜率

# 价格动态
ret_1tick           # 当前单 tick 收益率
vol_delta           # 当前成交量变化
money_delta         # 当前成交额变化

165维窗口特征

每个样本包含:

  • 平铺特征:15个核心特征 × 10个时间位置 = 150维
  • 末端特征:15个核心特征 × 第10个tick = 15维

标签生成(V3.2首次触板)

首次触板标签定义

# 步骤1:检测所有触板事件
next_is_limit = current[t+10] >= limit_price
current_is_limit = current[t+9] < limit_price
all_touch_events = next_is_limit & ~current_is_limit

# 步骤2:按股票分组,只保留每只股票的首次触板
touch_indices = df[all_touch_events == 1].index
first_touch_indices = df.loc[touch_indices].groupby('code').head(1).index

# 步骤3:设置标签
df['label'] = 0
df.loc[first_touch_indices, 'label'] = 1

前置内存阻断策略

# 保留条件:
1. 正样本label == 1首次触板瞬间2. 困难负样本dist_to_limit < 5%接近涨停但未封板# 剔除条件:
1. 死板状态current >= limit_price已经在涨停板上2. 垃圾时间dist_to_limit >= 5%远离涨停无预测价值3. 边界数据前9个tick无法构筑窗口最后一个tick无未来标签

智能NaN填充策略

# 价格类特征:使用向前/向后平推(避免未来函数泄露)
price_features = ['dist_to_limit', 'ask1_to_limit', 'ask1_gap', 'spread', 
                  'ask_slope', 'bid_slope', 'ret_1tick']
for col in price_features:
    df[col] = df[col].ffill().bfill()
    if df[col].isna().any():
        df[col].fillna(0, inplace=True)

# 成交量/变化率特征:用0填充
volume_features = ['bid_depth', 'ask_depth', 'order_imbalance', 
                   'b1_volume', 'a1_volume', 'vol_delta', 'money_delta']
for col in volume_features:
    df[col].fillna(0, inplace=True)

数据质量检查

V3.2特有检查项

  1. 首次触板验证:每只股票单日最多1个正样本
  2. 正样本数量:单日应该10-80个(对应真实涨停股票数)
  3. NaN填充验证:确保无mean()填充,无未来信息泄露
  4. 内存效率:从原始tick到事件样本的减少率应该>90%

常规检查项

  1. 唯一性检查:确保没有重复事件样本(按 date, code, time)
  2. 空值检查:关键字段不能为空(date, code, label)
  3. 特征完整性检查:165维特征必须存在
  4. 正样本检查:必须包含正样本(首次触板事件)
  5. 采样比例检查:最终比例应接近 1:5

项目目录结构

deep project/
├── data/                           # 数据目录
│   ├── daily_train_candidates/     # 候选训练集(事件样本)
│   ├── daily_train_undersampled/   # 欠采样训练集分片
│   ├── logs/                       # 统计日志
│   ├── merged/                     # 合并后的训练集
│   └── temp_extract/              # 临时解压目录
├── scripts/                        # 脚本目录
│   ├── training_set_builder.py     # 训练集构建器(V3.2实现)
│   ├── extract_7z.py              # 解压工具
│   ├── merge_daily_data.py        # 合并日数据
│   ├── rolling_cv.py              # 滚动验证
│   └── debug_touch_events.py      # 触板事件调试
├── src/                           # 源代码目录
│   ├── data_processing/           # 数据处理模块
│   │   ├── limit_up_processor.py  # 数据处理
│   │   ├── limit_up_processor_optimized.py  # 优化版处理器
│   │   ├── stock_utils.py         # 股票工具
│   │   ├── quality_check.py       # 质量检查
│   │   └── sampling.py            # 欠采样模块
│   ├── feature_engineering/       # 特征工程模块
│   │   ├── limit_up_features.py   # 基础特征提取
│   │   ├── event_driven_labels.py # V3.2首次触板标签(核心)
│   │   └── event_window_builder.py # V3.2事件窗口构建器(核心)
│   └── models/                    # 模型模块
│       └── lgbm_trainer.py        # LightGBM训练器
├── tests/                         # 测试目录
│   ├── test_v32_first_touch_labels.py    # 首次触板标签测试
│   ├── test_v32_boundary_handling.py     # 边界处理测试
│   ├── test_v32_nan_handling.py          # NaN处理测试
│   └── test_v32_integration.py           # 集成测试
├── models/                        # 模型存储目录
│   └── rolling_cv/               # 滚动验证模型
├── 2025/                         # 2025年数据文件
├── 2026/                         # 2026年数据文件
├── main.py                       # 主程序入口
├── run_system.py                 # 系统运行脚本
├── train_model.py                # 兼容包装;推荐使用 main.py --mode train
├── build_2025_dataset.py         # 批量数据集构建
├── requirements.txt              # 依赖配置
└── README.md                     # 项目说明

技术要点

V3.2核心创新

  1. 首次触板标签

    • 从"多次触板"改为"一板一样本"
    • 按股票分组,只保留每只股票的首次触板
    • 业务逻辑:完全对齐"今天能不能上板"的预测目标
  2. 智能NaN填充

    • 价格类特征:向前/向后平推,避免未来函数泄露
    • 成交量类特征:用0填充,符合业务逻辑
    • 严禁使用mean()填充,保证数据合法性
  3. 前置内存阻断

    • 在特征平铺前进行激进采样
    • 保留正样本 + 困难负样本,剔除95%无用数据
    • 内存占用:从20GB降至1-2GB
  4. 按需特征平铺

    • 仅对1-2万高价值样本进行165维特征提取
    • 避免全表shift操作,提升处理速度5-10倍

数据清理规则

每只股票的 Tick 数据执行统一清理规则:

  1. 删除无效价格记录:current <= 0
  2. 删除空盘口记录:a1_p <= 0 and b1_p <= 0
  3. 过滤集合竞价阶段:仅保留 09:30:00 - 15:00:00
  4. 删除重复 Tick:按 time 去重
  5. 删除非法盘口:a1_p < b1_p
  6. 删除成交异常:volume < 0 or money < 0
  7. 删除极端价格跳变:abs(current.pct_change()) > 0.1

涨停价计算

limit_price = round(preclose * limit_ratio, 2)

不同股票类型对应不同涨停比例:

  • 普通股:10%
  • ST:5%
  • 创业板/科创板:20%

使用流程

完整工作流程

# 1. 快速开始完整流程
python run_system.py --mode quick

# 2. 环境检查
python run_system.py --mode env

# 3. 单日训练集构建(V3.2首次触板模式)
python scripts/training_set_builder.py \
  --input "2025/1/2025-01-02.7z" \
  --output "d:/Qoder-project/deep project/data" \
  --mode single

# 4. 批量训练集构建
python scripts/training_set_builder.py \
  --input-dir "2025/1/" \
  --output "d:/Qoder-project/deep project/data" \
  --mode batch

# 5. 合并训练集
python scripts/training_set_builder.py \
  --mode merge \
  --shards-dir "d:/Qoder-project/deep project/data/daily_train_undersampled" \
  --merged-output "d:/Qoder-project/deep project/data/merged/multi_day_train.csv"

# 6. 模型训练
python main.py --mode train --input data/merged/multi_day_train.csv

日志分析

V3.2版本的统计日志包含特有字段:

import pandas as pd

# 读取V3.2统计日志
log_df = pd.read_csv("data/logs/01/2025-01-02_summary.csv", encoding="utf-8-sig", dtype={"code": "string"})
print(log_df[['date', 'version', 'first_touch_events', 'unique_stocks', 'sample_purity']])

系统特点

  • 一板一样本:每只股票单日仅1个正样本,纯度100%
  • 首次触板:最具预测价值的触板事件,业务逻辑完美对齐
  • 智能NaN填充:价格类平推,成交量类填0,无未来信息泄露
  • 内存优化:前置内存阻断,内存占用降低90%+
  • 数据质量:仅保留1-2万高价值样本,符合业务规律
  • 模块化设计:每个功能模块独立,易于维护
  • 灵活配置:支持多种欠采样参数调整
  • 完整日志:详细的统计日志和质量报告
  • 全面测试:V3.2专属测试套件,保证功能正确性

注意事项

  1. V3.2版本特性:采用"一板一样本"策略,正样本为每只股票的首次触板
  2. 样本数量:单日正样本约10-80个(对应真实涨停股票数)
  3. 内存管理:V3.2版本内存占用极低(1-2GB),但仍需注意资源限制
  4. 标签定义:预测目标是首次触板瞬间,不是涨停状态
  5. 特征约束:特征仅使用窗口内信息,严格禁止使用未来信息
  6. NaN填充:严禁使用mean()填充,必须使用向前/向后平推或0填充
  7. 数据质量:V3.2版本数据质量极高,完全符合真实交易场景

版本历史

V3.2 (当前版本 - 极致提纯版)

  • 首次触板检测:按股票分组,只保留每只股票的首次触板
  • 一板一样本:单只股票单日最多1个正样本,纯度100%
  • 智能NaN填充:价格类平推,成交量类填0,避免未来函数泄露
  • 业务逻辑对齐:完全符合"今天能不能上板"的预测目标
  • 测试套件:创建V3.2专属全面测试,保证功能正确性

V3.1 (事件驱动与内存管理)

  • 标签重构:从"状态"改为"事件",单日正样本从20万骤降至10-50个
  • 内存阻断:前置过滤95%无用数据,内存占用从20GB降至1-2GB
  • 按需平铺:仅对1-2万高价值样本进行165维特征提取
  • 处理速度:避免全表shift操作,速度提升5-10倍

V3.0 (方案A实现)

  • 标签生成:使用 shift(-10) 生成窗口标签
  • 窗口特征提取:前10个tick窗口 + 第11个tick标签
  • 32个窗口特征:15个末端特征 + 17个统计特征
  • 存在问题:假正样本过多,内存占用过高

V2.0

  • 预测目标从下一个 tick 改为第 11 个 tick
  • 实现两层欠采样策略
  • 重构训练集构建流程

V1.0

  • 初始版本
  • 基础特征工程
  • 单层欠采样

技术支持

如有问题或建议,请参考:

  • V3.2版本升级总结:了解"一板一样本"策略详情
  • scripts/training_set_builder.py - 主要实现代码
  • src/feature_engineering/event_driven_labels.py - V3.2首次触板标签模块
  • src/feature_engineering/event_window_builder.py - V3.2事件窗口构建器
  • tests/test_v32_*.py - V3.2测试套件

About

A股 Tick 级盘口涨停首次触板预测系统,面向极少数正样本事件预测与 LightGBM 建模研究。

Topics

Resources

License

Contributing

Security policy

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors