Skip to content

randomshit699/stockauto

Repository files navigation

A股自动化交易程序

这是一个基于强化学习(PPO算法)的A股自动化交易程序,支持多股票组合交易。程序通过键鼠模拟(easytrader)与同花顺客户端交互,实现自动化交易。所以这个程序会占用一台设备的使用权。

📖 程序概述

本程序采用**"选股 + 训练 + 交易"**的三阶段自动化交易流程:

  1. 选股阶段:使用 a/app.py 中的经典选股策略(基于技术指标、财务数据等),从A股市场中筛选出具有潜力的股票,形成候选股票池(保存在 codes.json 中)

  2. 训练阶段:针对候选股票池中的每个股票,使用强化学习(PPO算法)训练一个专门的自动化盯盘模型:

    • 基于该股票的历史5分钟K线数据(复权)进行训练
    • 模型学习在5分钟bar级别上进行买卖决策
    • 考虑A股T+1交易规则、整手交易、手续费等实际约束
    • 每个股票对应一个独立的模型,保存在 trained_model/{code}/ 目录
  3. 交易阶段:在实盘交易中,程序会:

    • 在每个5分钟bar开始时,使用训练好的模型对持仓股票进行推理
    • 根据模型输出的目标持仓比例,自动执行买入/卖出操作
    • 动态管理多股票组合,根据模型信号自动调整持仓
    • 从候选股票池中选择新股票加入组合(当持仓数量 < topK 时)

核心优势

  • 每个股票都有专门的模型,针对性强
  • 5分钟bar级别的决策,响应及时
  • 自动化执行,减少人为情绪干扰
  • 多股票组合管理,分散风险

⚠️ 重要提示

  • 风险自负:本程序仅供学习和研究使用,使用本程序进行实盘交易的所有风险由使用者自行承担
  • 系统要求:本程序在Windows系统上开发和测试,推荐使用Python 3.10
  • 交易时间:程序仅在A股交易时间内执行交易(上午9:30-11:30,下午13:00-15:00), 但是一旦运行可以一直挂在后台
  • 除权日警告:不能在除权日当天运行程序,数据会失真

📋 目录

✨ 功能特性

多股票组合交易

  • 支持同时持有多个股票(通过 topK 参数控制)
  • 自动从候选股票池中选择优质股票
  • 动态调整持仓,根据模型信号自动买入/卖出
  • 智能资金分配,按 topK 平均分配资金

智能模型训练

  • 自动跳过已有最佳模型的股票,节省训练时间
  • 自动记录训练时长和最佳模型step数
  • 训练完成后自动保存模型信息到JSON文件
  • 支持Transformer和MLP两种模型架构

数据管理

  • 自动从BaoStock拉取历史数据
  • 智能数据验证,精确检查缺失日期
  • 缺失数据在允许范围内(≤1500条)不重新拉取,提高效率
  • 自动使用历史K线数据更新推理数据

实盘交易

  • 自动从easytrader读取初始持仓
  • 使用买卖盘价格(bid/ask)进行更精确的交易
  • 支持动态资金分配,根据持仓市值调整可用资金
  • 在每个5分钟bar开始时自动清除零持仓标
  • 新加入的标立即进行交易,不拖到下个bar

🔧 环境要求

必需软件

  1. Python 3.10(推荐使用Anaconda或Miniconda)
  2. 同花顺客户端(v9.30.90,下载地址
  3. Tesseract OCR(用于验证码识别,安装教程

系统要求

  • Windows 10/11(64位)
  • 至少8GB内存(推荐16GB)
  • 支持CUDA的NVIDIA显卡(可选,用于加速训练, 但是PPO下CPU更快也够用了)

📦 详细安装教程

步骤1:安装Python环境

  1. 下载Anaconda

    • 访问 Anaconda官网
    • 下载Windows 64位版本
    • 安装时勾选"Add Anaconda to PATH"
  2. 创建虚拟环境

    # 打开Anaconda Prompt或PowerShell
    conda create -n py310 python=3.10
    conda activate py310

步骤2:安装Tesseract OCR

  1. 下载Tesseract

  2. 安装并配置环境变量

    • 运行安装程序,安装到默认路径(如:C:\Program Files\Tesseract-OCR
    • 将Tesseract的bin目录添加到系统PATH环境变量:
      • 右键"此电脑" → "属性" → "高级系统设置" → "环境变量"
      • 在"系统变量"中找到"Path",点击"编辑"
      • 添加:C:\Program Files\Tesseract-OCR
    • 验证安装:
      tesseract --version

步骤3:安装同花顺客户端

  1. 下载同花顺

    • 访问 同花顺官网
    • 下滑到底部,下载旧版本(v9.30.90)
    • ⚠️ 重要:easytrader暂时不兼容新版同花顺
  2. 安装并登录

    • 安装同花顺客户端
    • 登录你的交易账户
    • 确保可以正常交易

步骤4:安装Python依赖

  1. 克隆或下载项目

    # 如果使用Git
    git clone <repository-url>
    cd fin
    
    # 或者直接下载ZIP文件并解压
  2. 安装依赖包

    # 激活虚拟环境
    conda activate py310
    
    # 进入项目目录
    cd fin
    
    # 安装PyTorch(CPU版本,配置简单)
    pip install torch torchvision --index-url https://download.pytorch.org/whl/cpu
    
    # 或者安装GPU版本(如果有NVIDIA显卡)
    # pip install torch torchvision --index-url https://download.pytorch.org/whl/cu118
    
    # 安装其他依赖
    pip install -r requirements.txt
  3. 验证安装

    python -c "import easytrader; import baostock; import akshare; import torch; print('所有依赖安装成功!')"

步骤5:配置easytrader

  1. 创建配置文件

    • 在项目根目录创建 config.json 文件
    • 参考 easytrader文档 配置
    • 基本配置示例:
    {
      "universal_client": {
        "path": "C:\\同花顺软件\\同花顺\\xiadan.exe"
      }
    }
  2. 修改main.py中的路径

    • 打开 main.py
    • 找到第72行,修改为你的同花顺路径:
    user.connect(r"C:\\同花顺软件\\同花顺\\xiadan.exe")
  3. 测试easytrader连接

    python test.py

步骤6:准备配置文件

  1. 创建codes.json
    • 在项目根目录创建 codes.json 文件
    • 格式如下:
    {
      "codes": [
        {
          "code": "sz.000528",
          "name": "柳工机械"
        },
        {
          "code": "sz.000543",
          "name": "皖能电力"
        }
      ]
    }
    根目录下的a/app.py是一个选股程序,基于的是经典的策略,可以从输出的结果中挑选合适的股票

🚀 快速开始

1. 训练模型

  1. 配置训练参数

    • 打开 train.py
    • 设置以下参数:
      • model_mode: "transformer""mlp" 实测mlp更好
      • device: None(自动选择)或 "cuda" / "cpu", 推荐cpu
      • indicators: 技术指标列表
      • env_kwargs: 环境参数
      • ppo_kwargs: PPO算法参数
      • total_timesteps: 训练步数
  2. 开始训练

    python train.py
    • 训练过程会自动从 codes.json 读取股票代码
    • 每个股票会自动拉取历史数据
    • 一个股票对应一个模型,如果已有最佳模型,会自动跳过, 想重新训练某个模型,直接删除模型即可
    • 训练完成后会生成 model_info.json

2. 实盘交易

  1. 配置交易参数

    • 打开 main.py
    • 设置以下参数:
      • topK: 希望持有的股票数量(默认2)
      • min_fee: 最低手续费(需与训练时一致)
      • fee_rate: 手续费比例(需与训练时一致)
  2. 准备同花顺客户端

    • 打开同花顺客户端
    • 点击"买入"打开交易窗口
    • 切换到旧版(右上角)
    • 清空买入框内的值
    • 交易窗口不能最小化(但不需要最大化)
  3. 启动交易程序

    python main.py # 需要先打开同花顺交易小窗口

📝 配置文件说明

codes.json

用于指定候选股票池:

{
  "codes": [
    {
      "code": "sz.000528",
      "name": "柳工机械"
    },
    {
      "code": "sh.600926",
      "name": "杭州银行"
    }
  ]
}

train.py 参数说明

# 模型配置
model_mode = "transformer"  # "transformer" 或 "mlp"
device = None  # None(自动选择)、"cuda" 或 "cpu"

# 技术指标
indicators = ["macd", "rsi_1440", "cci_1440", "dx_1440", "close_1440_sma"]

# 环境参数
env_kwargs = {
    "window_size": 2400,        # 历史窗口大小
    "decision_interval": 5,     # 决策间隔(分钟)
    "reward_scaling": 1.0,      # 奖励缩放
    "reward_use_log_return": True,  # 使用对数收益
    "turnover_penalty": 0.0001,    # 换手惩罚
    "trade_bonus": 0.0,         # 交易奖励
}

# PPO算法参数
ppo_kwargs = {
    "learning_rate": 3e-4,
    "n_steps": 2048,
    "batch_size": 64,
    "n_epochs": 10,
    "gamma": 0.99,
    "gae_lambda": 0.95,
}

# 训练参数
cash = 100000.0          # 训练资金
fee_rate = 0.0003        # 手续费比例(万三)
min_fee = 5.0            # 最低手续费(免五设为0)
total_timesteps = 20000000  # 训练步数

main.py 参数说明

# 交易配置
topK = 2          # 希望持有的股票数量
min_fee = 5.0     # 最低手续费(需与训练时一致)
fee_rate = 0.0003 # 手续费比例(需与训练时一致)

# 交易时间(A股标准交易时间)
time1 = 9:30-11:30   # 上午交易时段
time2 = 13:00-15:00  # 下午交易时段

🎯 训练模型

训练流程

  1. 自动数据拉取

    • 程序会自动从BaoStock拉取历史5分钟K线数据
    • 数据会自动保存到 data/{code}.csv
    • 如果数据不完整(缺失>1500条),会自动重新拉取
  2. 数据验证

    • 使用 sh.603323.csv 作为基准文件
    • 自动检查缺失的日期
    • 显示缺失的具体日期列表
  3. 模型训练

    • 使用PPO算法训练
    • 自动保存最佳模型(基于累计收益)
    • 训练2000万步后自动停止
  4. 模型保存

    • 最佳模型保存到 trained_model/{code}/best_model.zip
    • 归一化参数保存到 trained_model/{code}/vecnormalize.pkl
    • 模型信息保存到 trained_model/{code}/model_info.json

模型信息文件

model_info.json 包含以下信息:

  • train_time: 训练时间
  • training_duration_seconds: 完整训练时长(秒)
  • best_model_step: 最佳模型的step数
  • cumulative_return: 累计收益
  • cumulative_return_pct: 累计收益率
  • avg_daily_return_pct: 平均日收益率
  • train_start_date: 训练数据起始日期
  • train_end_date: 训练数据结束日期
  • start_open_price: 训练起始日期开盘价
  • end_open_price: 训练结束日期开盘价
  • price_change_pct: 价格变化百分比
  • initial_cash: 初始资金
  • code: 股票代码
  • rank: 在codes.json中的排名(从1开始)
  • name: 股票中文名

💹 实盘交易

交易逻辑

  1. 初始化

    • 从easytrader读取当前持仓
    • 更新所有持仓标和候选标的历史K线数据
    • 对所有候选标做一次infer并格式化输出
  2. 每个5分钟bar的执行流程

    • 取消所有未成交委托
    • 更新所有持仓标的状态
    • 清除所有实际持仓为0的持仓标(唯一清除检查点)
    • 对现有持仓标进行交易
    • 调仓检查(新增持仓标)
    • 对新添加的标立即进行交易
  3. 交易策略

    • 目标持仓 > 0.7:满仓买入
    • 目标持仓 < 0.3:清仓卖出
    • 0.3 ≤ 目标持仓 ≤ 0.7:保持当前持仓
  4. 资金分配

    • 按照 topK 平均分配资金
    • 每个标分配 总资产 / topK
    • 如果实际持仓市值大于分配资产,保持现状

交易时间

  • 交易时段:上午 9:30-11:30,下午 13:00-15:00
  • 非交易时间:程序只等待,不执行任何交易操作
  • 跨日处理:每天跨日时会更新所有数据并重新infer所有候选标

📊 数据管理

数据来源

  • 训练数据:BaoStock(历史5分钟K线,复权)
  • 实时数据:Akshare(实时行情和买卖盘)
  • 数据验证:使用 sh.603323.csv 作为基准

数据验证机制

  • 缺失数据 ≤ 1500条:只给出警告,不重新拉取
  • 缺失数据 > 1500条:删除文件并重新拉取
  • 精确日期检查:可以精确到具体哪一天的数据缺失

数据注意事项

  • 不能在除权日当天运行程序:BaoStock和Akshare的复权算法不一致
  • 数据复权比例:可通过 x_ak.pyset_ratio 函数验证
  • 训练集和验证集:默认以2019-2024年作为训练集,2025至今作为验证集

❓ 常见问题

1. 同花顺连接失败

问题easytrader 无法连接同花顺

解决方案

  • 确保使用同花顺v9.30.90(旧版本)
  • 确保同花顺路径正确
  • 确保交易窗口已打开
  • 检查是否有杀毒软件拦截

2. Tesseract OCR错误

问题pytesseract.pytesseract.TesseractNotFoundError

解决方案

  • 确保已安装Tesseract OCR
  • 确保Tesseract的bin目录已添加到PATH环境变量
  • 重启命令行窗口或IDE

3. 数据拉取失败

问题:BaoStock或Akshare数据拉取失败

解决方案

  • 检查网络连接
  • 检查股票代码格式(如:sh.601988
  • 等待一段时间后重试(可能是API限流)

4. 模型训练很慢

问题:训练速度慢

解决方案

  • 减少 window_size 参数
  • 使用MLP模式而不是Transformer模式

5. 32位/64位警告

问题32-bit application should be automated using 32-bit Python

解决方案

  • 这是警告,不是错误,可以忽略
  • 同花顺是32位程序,但使用64位Python和操作系统是正常的

6. Gym版本警告

问题gym version is outdated

解决方案

  • 这是警告,不是错误,可以忽略
  • 程序使用的是 gymnasium,不是 gym

🏗️ 技术架构

模型架构

  • Transformer模式:使用Transformer编码器提取特征,适合复杂模式识别
  • MLP模式:使用多层感知机,训练速度快,适合简单模式

训练算法

  • PPO(Proximal Policy Optimization):稳定的策略梯度算法
  • 自动保存最佳模型:基于累计收益自动保存
  • 数据归一化:使用VecNormalize进行数据归一化

交易环境

  • AStockT1Env:自定义Gymnasium环境
  • T+1交易规则:支持A股T+1交易规则
  • 整手交易:自动处理整手交易(100股)
  • 手续费计算:支持最低手续费和手续费比例

📚 相关资源

📄 许可证

本项目仅供学习和研究使用,使用本程序进行实盘交易的所有风险由使用者自行承担。

🤝 贡献

欢迎提交Issue和Pull Request!

📝 更新日志

最新更新

  • ✅ 修改交易时间段为A股标准交易时间(9:30-11:30, 13:00-15:00)
  • ✅ 在每个5分钟bar一开始清除所有实际持仓为0的持仓标
  • ✅ 新加入的标立即进行交易,不拖到下个bar
  • ✅ 在启动和跨天时对所有候选标做infer并格式化输出
  • ✅ 完善数据验证机制,支持精确日期检查
  • ✅ 优化资金分配逻辑,按照topK平均分配

再次提醒:本程序仅供学习和研究使用,使用本程序进行实盘交易的所有风险由使用者自行承担。

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages