这是一个基于强化学习(PPO算法)的A股自动化交易程序,支持多股票组合交易。程序通过键鼠模拟(easytrader)与同花顺客户端交互,实现自动化交易。所以这个程序会占用一台设备的使用权。
本程序采用**"选股 + 训练 + 交易"**的三阶段自动化交易流程:
-
选股阶段:使用
a/app.py中的经典选股策略(基于技术指标、财务数据等),从A股市场中筛选出具有潜力的股票,形成候选股票池(保存在codes.json中) -
训练阶段:针对候选股票池中的每个股票,使用强化学习(PPO算法)训练一个专门的自动化盯盘模型:
- 基于该股票的历史5分钟K线数据(复权)进行训练
- 模型学习在5分钟bar级别上进行买卖决策
- 考虑A股T+1交易规则、整手交易、手续费等实际约束
- 每个股票对应一个独立的模型,保存在
trained_model/{code}/目录
-
交易阶段:在实盘交易中,程序会:
- 在每个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
- Windows 10/11(64位)
- 至少8GB内存(推荐16GB)
- 支持CUDA的NVIDIA显卡(可选,用于加速训练, 但是PPO下CPU更快也够用了)
-
下载Anaconda
- 访问 Anaconda官网
- 下载Windows 64位版本
- 安装时勾选"Add Anaconda to PATH"
-
创建虚拟环境
# 打开Anaconda Prompt或PowerShell conda create -n py310 python=3.10 conda activate py310
-
下载Tesseract
- 访问 Tesseract GitHub Releases
- 下载Windows安装包(推荐最新版本)
-
安装并配置环境变量
- 运行安装程序,安装到默认路径(如:
C:\Program Files\Tesseract-OCR) - 将Tesseract的bin目录添加到系统PATH环境变量:
- 右键"此电脑" → "属性" → "高级系统设置" → "环境变量"
- 在"系统变量"中找到"Path",点击"编辑"
- 添加:
C:\Program Files\Tesseract-OCR
- 验证安装:
tesseract --version
- 运行安装程序,安装到默认路径(如:
-
下载同花顺
- 访问 同花顺官网
- 下滑到底部,下载旧版本(v9.30.90)
⚠️ 重要:easytrader暂时不兼容新版同花顺
-
安装并登录
- 安装同花顺客户端
- 登录你的交易账户
- 确保可以正常交易
-
克隆或下载项目
# 如果使用Git git clone <repository-url> cd fin # 或者直接下载ZIP文件并解压
-
安装依赖包
# 激活虚拟环境 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
-
验证安装
python -c "import easytrader; import baostock; import akshare; import torch; print('所有依赖安装成功!')"
-
创建配置文件
- 在项目根目录创建
config.json文件 - 参考 easytrader文档 配置
- 基本配置示例:
{ "universal_client": { "path": "C:\\同花顺软件\\同花顺\\xiadan.exe" } } - 在项目根目录创建
-
修改main.py中的路径
- 打开
main.py - 找到第72行,修改为你的同花顺路径:
user.connect(r"C:\\同花顺软件\\同花顺\\xiadan.exe")
- 打开
-
测试easytrader连接
python test.py
- 创建codes.json
- 在项目根目录创建
codes.json文件 - 格式如下:
根目录下的a/app.py是一个选股程序,基于的是经典的策略,可以从输出的结果中挑选合适的股票{ "codes": [ { "code": "sz.000528", "name": "柳工机械" }, { "code": "sz.000543", "name": "皖能电力" } ] } - 在项目根目录创建
-
配置训练参数
- 打开
train.py - 设置以下参数:
model_mode:"transformer"或"mlp"实测mlp更好device:None(自动选择)或"cuda"/"cpu", 推荐cpuindicators: 技术指标列表env_kwargs: 环境参数ppo_kwargs: PPO算法参数total_timesteps: 训练步数
- 打开
-
开始训练
python train.py
- 训练过程会自动从
codes.json读取股票代码 - 每个股票会自动拉取历史数据
- 一个股票对应一个模型,如果已有最佳模型,会自动跳过, 想重新训练某个模型,直接删除模型即可
- 训练完成后会生成
model_info.json
- 训练过程会自动从
-
配置交易参数
- 打开
main.py - 设置以下参数:
topK: 希望持有的股票数量(默认2)min_fee: 最低手续费(需与训练时一致)fee_rate: 手续费比例(需与训练时一致)
- 打开
-
准备同花顺客户端
- 打开同花顺客户端
- 点击"买入"打开交易窗口
- 切换到旧版(右上角)
- 清空买入框内的值
- 交易窗口不能最小化(但不需要最大化)
-
启动交易程序
python main.py # 需要先打开同花顺交易小窗口
用于指定候选股票池:
{
"codes": [
{
"code": "sz.000528",
"name": "柳工机械"
},
{
"code": "sh.600926",
"name": "杭州银行"
}
]
}# 模型配置
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 # 训练步数# 交易配置
topK = 2 # 希望持有的股票数量
min_fee = 5.0 # 最低手续费(需与训练时一致)
fee_rate = 0.0003 # 手续费比例(需与训练时一致)
# 交易时间(A股标准交易时间)
time1 = 9:30-11:30 # 上午交易时段
time2 = 13:00-15:00 # 下午交易时段-
自动数据拉取
- 程序会自动从BaoStock拉取历史5分钟K线数据
- 数据会自动保存到
data/{code}.csv - 如果数据不完整(缺失>1500条),会自动重新拉取
-
数据验证
- 使用
sh.603323.csv作为基准文件 - 自动检查缺失的日期
- 显示缺失的具体日期列表
- 使用
-
模型训练
- 使用PPO算法训练
- 自动保存最佳模型(基于累计收益)
- 训练2000万步后自动停止
-
模型保存
- 最佳模型保存到
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: 股票中文名
-
初始化
- 从easytrader读取当前持仓
- 更新所有持仓标和候选标的历史K线数据
- 对所有候选标做一次infer并格式化输出
-
每个5分钟bar的执行流程
- 取消所有未成交委托
- 更新所有持仓标的状态
- 清除所有实际持仓为0的持仓标(唯一清除检查点)
- 对现有持仓标进行交易
- 调仓检查(新增持仓标)
- 对新添加的标立即进行交易
-
交易策略
- 目标持仓 > 0.7:满仓买入
- 目标持仓 < 0.3:清仓卖出
- 0.3 ≤ 目标持仓 ≤ 0.7:保持当前持仓
-
资金分配
- 按照
topK平均分配资金 - 每个标分配
总资产 / topK - 如果实际持仓市值大于分配资产,保持现状
- 按照
- 交易时段:上午 9:30-11:30,下午 13:00-15:00
- 非交易时间:程序只等待,不执行任何交易操作
- 跨日处理:每天跨日时会更新所有数据并重新infer所有候选标
- 训练数据:BaoStock(历史5分钟K线,复权)
- 实时数据:Akshare(实时行情和买卖盘)
- 数据验证:使用
sh.603323.csv作为基准
- 缺失数据 ≤ 1500条:只给出警告,不重新拉取
- 缺失数据 > 1500条:删除文件并重新拉取
- 精确日期检查:可以精确到具体哪一天的数据缺失
- 不能在除权日当天运行程序:BaoStock和Akshare的复权算法不一致
- 数据复权比例:可通过
x_ak.py的set_ratio函数验证 - 训练集和验证集:默认以2019-2024年作为训练集,2025至今作为验证集
问题:easytrader 无法连接同花顺
解决方案:
- 确保使用同花顺v9.30.90(旧版本)
- 确保同花顺路径正确
- 确保交易窗口已打开
- 检查是否有杀毒软件拦截
问题:pytesseract.pytesseract.TesseractNotFoundError
解决方案:
- 确保已安装Tesseract OCR
- 确保Tesseract的bin目录已添加到PATH环境变量
- 重启命令行窗口或IDE
问题:BaoStock或Akshare数据拉取失败
解决方案:
- 检查网络连接
- 检查股票代码格式(如:
sh.601988) - 等待一段时间后重试(可能是API限流)
问题:训练速度慢
解决方案:
- 减少
window_size参数 - 使用MLP模式而不是Transformer模式
问题:32-bit application should be automated using 32-bit Python
解决方案:
- 这是警告,不是错误,可以忽略
- 同花顺是32位程序,但使用64位Python和操作系统是正常的
问题: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平均分配
再次提醒:本程序仅供学习和研究使用,使用本程序进行实盘交易的所有风险由使用者自行承担。