Skip to content
This repository was archived by the owner on Apr 20, 2026. It is now read-only.

hujiyo/EquiNet-v2

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

169 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

EquiNet

2026.4.20谷雨:EquiNet v2归档,v3 start ~,v3将转为私有仓库继续开发。方向:应用因子规模化、参数规模化、架构重构,核心聚焦风险与稳定性。

项目简介

  • EquiNet基于历史数据进行统计建模,对未来3天是否具有短期上涨趋势进行打分

主要特性

  • 架构主流:BERT拥有一定的时序建模能力
  • 训练监控:每轮训练计算并显示各种评估指标
  • 参数配置:自定义模型配置以适应不同需求

目录结构

EquiNet/
├── data_all/                 # 全量股票池
├── data/                     # 训练数据
├── out/                      # 模型权重输出
├── src/
│   ├── train.py              # 主训练脚本
│   ├── run.py                # 推理/选股脚本
│   ├── training_utils.py     # 训练工具模块
│   ├── train_dft.py          # DFT微调训练脚本
│   ├── config.py        	    # 统一配置文件
│   └── ...              	    # 其他可能的脚本/目录
├── LICENSE                   # Apache-2.0许可证
└── README.md

数据格式说明

  • 全量数据目录:data_all/,训练数据目录:data/
  • 每个 .csv 文件对应一只股票(不复权),000000.csv 为上证指数
  • 字段:date, open, high, low, close, volume, exchange
  • volume 为成交量(千元),exchange 为换手率

v1参考数据集:https://huggingface.co/datasets/Mhuixs/EquiNet-v1-319_420

数据管理

采用两级架构:全量股票池(data_all/)→ 筛选训练数据(data/

data_update.py ──更新──> data_all/ (全量股票池)
data_check.py  ──检查──> data_all/
data_select.py ──筛选──> data/     (训练数据)
data_update.py --mode train ──增量更新──> data/

1. 更新全量股票池

python data_update.py                 # 增量更新已有股票的最新数据(默认)
python data_update.py --mode full     # 全量更新:拉取所有A股完整历史(首次/添加新股)

2. 筛选训练数据

python data_select.py                 # 使用默认配置筛选(市值<MARKET_CAP_MAX and > MARKET_CAP_MIN)
python data_select.py --dry-run       # 仅查看结果,不复制文件
python data_select.py --market-cap 200e8  # 自定义市值上限

筛选条件:主板股票 → 排除ST → 排除退市/停牌 → 市值 < MARKET_CAP_MAX and > MARKET_CAP_MIN

3. 更新训练数据

python data_update.py --mode train    # 增量更新 data/ 中的股票(快,推荐频繁使用)

4. 检查数据质量

python data_check.py                  # 检查全量股票池最近100天数据
python data_check.py --days 50        # 指定检查天数

典型工作流

# 首次使用 / 偶尔维护
python data_update.py --mode full     # 1. 拉取全量数据(首次需要数小时)
python data_select.py                 # 2. 筛选训练股票(约数小时)

# 日常训练
python data_update.py --mode train    # 3. 刷新训练数据(几小时)
python src/train.py                   # 4. 开始训练
python src/run.py                     # 5. 选股推理

模型文件名格式说明示例

modelB_top1_p1_11pct_thr0_485_auc0_6182_ep29_1214_1930.pth
  │      │    │          │        │       │      └── 时间戳
  │      │    │          │        │       └── 最佳轮次
  │      │    │          │        └── AUC
  │      │    │          └── 阈值(实盘用)
  │      │    └── 收益率
  │      └── Top-K
  └── 模型类型

modelB - 模型的来源:clone脚本生成的B型模型 top1 - Top1%选股,k取1 p1_11pct - 收益率 +1.11% 在测试集上的收益率 thr0_485 - 阈值 0.485(预测值≥0.485即入选Top1%) auc0_6182 - AUC 0.6182 ep29 - 第29轮 1214_1930 - 12月14日19:30 ...可能有其它字段

环境配置示例

  • 环境配置:environment.yaml

快速开始

  1. 克隆项目
    git clone https://github.com/hujiyo/EquiNet-v2.git
  2. 创建虚拟环境
    conda env create -f environment.yaml && conda activate equinet
  3. 准备数据(详见上方「数据管理」)
  4. 训练
    python src/train.py
  5. 选股
    python src/run.py

训练结果示例

Epoch 229/400, LR: 0.000468 (正常训练) [A+B训练]
    动态采样策略:按需生成索引,直到满足1个batch...
    已生成 1/1 个Batch (已采样50轮)
    已生成 1/1 个batch (总共采样50轮, 41050个索引)
  [循环统计] 已循环股票: 821/823, 总循环次数: 3887
  标签分布: 上涨=128(25.0%), 边界=0(0.0%), 不涨=384(75.0%)
  训练进度: 100.0%, Loss_A: 1.6334, Loss_B: 1.6574

  [模型A] 训练损失: 1.6334, 测试损失: 0.3678, AUC: 0.7008
          预测均值: 0.413, 高置信(>0.7): 0, 低置信(<0.2): 1641
          Top1%收益: +1.25%
          【实战收益率(全局阈值,每日上限4)】每日统计: {(2,13.2%), (3,12.0%), (4,5.4%), (4,6.2%), (4,4.5%), (4,0.5%), (4,6.5%), (4,-5.3%), (4,-7.3%), (4,0.1%), (4,5.3%), (4,2.4%), (4,9.0%), (4,12.6%), (4,13.4%), (4,-1.8%), (4,-3.1%), (4,-2.2%), (4,4.3%), (4,16.5%), (4,3.2%), (4,-4.0%), (4,1.1%), (4,0.8%), (4,-0.2%), (4,-0.0%), (4,-2.6%), (4,-6.8%), (4,-0.6%), (4,5.6%), (4,5.5%), (4,3.6%), (4,7.3%), (4,-0.0%), (4,-7.1%), (4,-8.0%), (4,2.7%), (4,7.5%), (4,1.8%), (4,5.4%), (4,6.7%), (4,5.4%), (4,0.7%), (4,-3.2%), (4,-6.0%), (4,-8.8%), (4,-7.1%), (4,-6.8%), (4,6.8%), (4,-2.8%), (4,14.2%), (2,-2.8%), (1,7.5%), (4,-7.3%), (4,-1.8%), (4,0.6%), (4,-5.5%), (4,-7.5%), (4,7.8%), (4,11.1%), (4,-0.4%), (4,3.2%), (2,12.6%), (3,-4.2%), (3,2.4%), (4,-6.4%), (4,-4.4%), (4,2.2%), (4,1.0%), (3,4.1%), (4,6.1%), (4,-5.7%), (2,-2.2%), (3,0.5%), (3,1.6%), (4,1.6%), (4,6.5%), (4,-3.5%)}
          【实战收益率(全局阈值,每日上限4)】平均实战收益率: 1.6%
  【预测值分布直方图】
    0.0  ▁▁▁▂▄▆▇█▇▆▅▄▄▂▁▁▁▁▁▁  1.0
         ├────────────────────┤
    均值=0.413, 标准差=0.1256, 范围=[0.122, 0.677]
    >0.5: 26.6%, >0.7: 0.0%
    趋势: 📈 分散度上升 (+12.9%) | 收益率变化: (+1.0%)
          ⚠ 无改善 (50/100)
  [模型B] 训练损失: 1.6574, 测试损失: 0.3640, AUC: 0.6991
          预测均值: 0.429, 高置信(>0.7): 1706, 低置信(<0.2): 3397
          Top1%收益: +0.79%
          【实战收益率(全局阈值,每日上限4)】每日统计: {(4,4.0%), (4,10.0%), (4,3.4%), (4,6.2%), (4,6.2%), (4,1.8%), (4,6.5%), (4,-5.5%), (4,-9.6%), (4,-0.6%), (4,7.1%), (4,-1.4%), (3,0.4%), (4,12.3%), (4,11.8%), (4,-2.0%), (4,-2.9%), (4,-3.4%), (4,2.3%), (4,11.5%), (4,2.4%), (4,-3.4%), (4,-2.1%), (4,-1.5%), (4,-1.1%), (4,-0.3%), (4,-0.4%), (4,-4.2%), (4,6.5%), (4,10.7%), (4,4.8%), (4,4.0%), (4,9.2%), (4,1.5%), (4,-7.8%), (4,-10.9%), (4,-1.6%), (4,-0.1%), (4,2.6%), (4,4.0%), (4,6.7%), (4,9.5%), (4,2.5%), (4,-3.2%), (3,-9.5%), (4,-7.7%), (4,-7.1%), (4,-4.4%), (4,0.2%), (4,-0.8%), (4,11.5%), (3,-1.3%), (0,0.0%), (4,-3.6%), (4,1.2%), (4,4.5%), (3,-5.0%), (4,-7.5%), (4,7.8%), (4,4.9%), (4,-0.4%), (4,3.6%), (4,5.6%), (4,-4.2%), (3,2.4%), (4,-6.4%), (4,-3.0%), (4,2.1%), (4,-2.1%), (4,1.4%), (4,-0.5%), (3,-6.0%), (4,2.5%), (4,-1.4%), (4,2.5%), (4,1.6%), (4,8.5%), (3,-4.2%)}
          【实战收益率(全局阈值,每日上限4)】平均实战收益率: 0.9%
          伪标签来源: 最佳A(第39轮, 收益+1.69%)
          伪标签统计: 伪正=5, 伪负=25, 不变=482

注意

模型并没有任何实战能力,现阶段预测波动性大于确定性,各种指标请参照代码算法的具体实现自行判断现实性,建议模型的输出仅作为参考或者筛选依据。

项目修改LOG

  • 2026.4.20谷雨:EquiNet v2归档,v3 start ~,v3将转为私有仓库继续开发。方向:应用因子规模化、参数规模化、架构重构,核心聚焦风险与稳定性。
  • 2026.4:新增正样本距离保护,添加AMP混合精度支持并优化模型评估
  • 2026.4.6:新增大盘指标特征,新增股票数据筛选功能并重构数据管理架构
  • 2026.3:修复数据集维护更新脚本中更新时的单位错误、复权方式错误等问题,优化收益率计算策略。新增特征两阶段归一化处理流程,简化模型embedding层,新增embedding层评估脚本。
  • 2026.3.8:EquiNet许可证从MIT改为Apache-2.0
  • 2026.2:优化实战评分机制的计算方法,新增推理脚本、数据集维护更新脚本,优化部分模块,增加一些数据的可视化。区分涨跌幅与收益率的关系,将收益率的计算方法与实战进行统一。重新使用可学习位置编码嵌入。
  • 2026.2.13:从简单涨幅阈值预测改为短期强势信号检测机制判断,减少了"有趋势但被标0"的矛盾样本,明确了模型的预测目标。二分类强迫模型做买卖二选一,新标签机制为扩展模型规模打下稳定性基础。新增实战收益率评估指标,修正收益率计算逻辑错误。未来主测评机制由原实际涨跌评分制(原收益率分数)改为“实战样本均分”评分机制。
  • 2026.2.10:强制过滤超过10%涨跌幅限制的样本,降低收益率与现实的差距,新增多种可选优化器和训练机制,完全解决了收益率被高涨幅限制股拉高的现象,修正后均值最高达到1.8%,均值为0.4%-1.2%。
  • 2026.1.23:新增注意力聚合机制,自适应加权所有时间步特征,替代原来仅使用最后时间步的机制,收益率最高上限提升至2.8%,均值为1.0%-1.5%
  • 2026.1.8:EquiNet v1归档,v2 start ~,v2的重点是将项目从实验性质全面转为对实战应用的评估性质。特征提取层改为FFN结构,修正收益率计算规则(将当日涨停股从收益率计算中剔除),优化采样机制:动态索引生成与循环采样支持。修正前收益率最高达到3%,修正后均值最高达到2%。
  • 2025.12.14:增加Top-N收益率测评机制,之前的固定阈值计算收益率并不符合实际应用,收益率由-3%-1.5%提升到-1%-0.3%。恢复软标签机制,收益率首次达到0.1%-0.7%的正值。使用克隆模型训练策略+多教师模型纠偏机制,进一步将模型的上限拉高到1%~1.8%
  • 2025.11:发现了数据泄露的问题,这意味着过去的评分全部失准。已修复测评集划分机制
  • 2025.10.18:v1实验性质的数据集统一放到huggingface。修复索引越界错误,修复动态权重计算错误。改积分评分制为实际涨跌评分制。
  • 2025.10.15:增加学习率预热和余弦退火调度机制,残差连接改为Pre-Norm架构,调整了部分参数。进一步提升了模型训练时的稳定性。
  • 2025.9.16:修正了原来错误的权重平衡方法,模型的预测能力各项指标普遍上涨5%-15%。取消专业头机制,优化训练时数据采样流程,改为每批次提前批量抽取数据,训练效率提升50%以上。
  • 2025.8.1:重构采用二分类方案,专注于预测股票是否会上涨,输出0-1之间的概率值,更符合实际交易需求。使用固定的31个测试文件和评估样本,确保评估的一致性和可重复性。模型准确率达到58%,接近60%目标。在预测为上涨的股票集中,股票上涨2%的概率高达49%,远超随机平均水平(34%-42%)
  • 2025.6.1:重新设计模型架构,增加模型维度(128)和层数(3),优化注意力头分配(价格3头、成交量2头、波动率2头、模式1头),使用时间感知注意力机制,提升模型表达能力。
  • 2025.5.31:积分制成为默认机制,增加时间感知位置编码、Focal Loss损失函数、结合标准正弦余弦位置编码、指数衰减机制、种类差异化多头注意力机制、多尺度注意力,加入了残差连接和层归一化。
  • 2025.5.12:增加mark积分制判别最优模型,但保留原判别机制
  • 2025.5.1:项目start ~

参与项目贡献的两种路径

  1. 联系hujiyo并加入项目维护者 --> 新建分支(dev_yourname)-->维护项目
  2. Fork 本仓库 --> 建立 Pull Request

联系方式

许可证

Apache License 2.0

致谢

项目出力清单(排名不分先后) ``` GLM-4.6/4.7/5 QwQ-32b Doubao系列 Claude 4 sonnet/4.1 opus/4.5 sonnet/4.5 opus/4.6 sonnet/4.6 opus deepseek-r1/v3/v3.1/v3.2 ChatGPT 4.1/5/5.1 codex/5.2/5.3 Gemini 2.5 flash/2.5 pro/3 flash/3 pro Qwen3.5系列 Qwen3系列 MiniMax 2.5 Kimi 2.5 ```
最最最初对QwQ的prompt 最最最初对QwQ的prompt,虽然QwQ当时表现特别差,(我的提示词在现在看来也是特别幼稚),当时我觉得它也是非常了不起的: ``` 背景介绍:现在你在进行一个利用python进行模型训练的2030年编程比赛,参赛者有中国昔日之光:deepseek-r1:671b满血版、openAI最新编程大神:ChatGPT6.0:9600b世界版、千问推理模型QwQ-32b(你)......注意,你可以无限长时间循环分步骤思考,但是你的机会只有一次! 现在是试卷的最后一题:在./下写一个.py模型训练程序,模型数据存放在./data下,那里有着319个.xlsx文件,每个文件对应一只股票,每个文件的有效行数为421行,其中第一行也就是表头字段分别有time start max min end volume marketvolume marketlimit marketrange这9个字段,2-421行都是数据,也就是说每个文件实际上都是包含一只股票420天的基本情况和当天大盘的情况。每个文件的time都是420天并且初始日期都是对照相同的,start/end 是开/收盘价,max/min是最高/低价,volume是股票量能,marketvolume是市场量能,marketlimit是大盘涨跌幅,marketrange是大盘指数的波动宽度,(比如marketlimit为-1%,marketrange为50,则暗示大盘下跌30个点,宽度在50个点,波动很大) 模型的输出结果是对未来3天的情况进行概率预测,分别是上涨3%的概率,下跌2%的概率,保持-2%~3%的概率,例如输出:涨5%:\n跌3%:54%,\n稳:25%。 提示: 1.建议使用transformer架构,程序开始需要提示用户输入想要的模型训练的大小参数和训练轮次。为避免用户不懂,你还要有提示信息(比如对最终模型效果的影响、对模型最终参数量的影响等等) 2.训练过程中,使用随机上下文长度(20天-100天),这种随机效果可以变相降低数据量有限的弊端,然后对下面3天进行预测 3.训练过程中要给出进度信息(包括学习率),每轮训练结束后要增加一个效果环节,具体如下:用相同的方法从数据中随机获得片段作为输入然后,将概率大的视为模型的选择,循环多次即可计算出当前模型预测成功的概率并打印。 4.不同股票的价格不同,模型的目标是掌握其中更深层次的规律,所以训练数据要进行统一的归一化 5.使用支持CUDA的gpu进行训练 6.time字段的格式为'2023/06/27' 7.不要提前确定好所有的数据然后轮流开始训练,这违背了我随机思想的初衷,我要的是训练输入上的完全随机,每轮1000组随机输入 ```

About

No description, website, or topics provided.

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages