Skip to content

Latest commit

 

History

33 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Qlib-Trader — Qlib 到 MiniQMT 无人值守实盘交易系统

Python Platform License

Logo

Qlib-Trader 将 Qlib 机器学习量化模型对接 MiniQMT(国金证券极速交易接口),实现"模型预测 → 策略信号 → 自动下单 → 钉钉告警"的完整闭环,支持崩溃自动重启和健康检查。


系统架构

┌──────────────────────────────────────────────────────────────┐
│  Windows Task Scheduler                                       │
│  20:00 数据更新  |  23:00 生成 pred_score.csv                  │
├──────────────────────────────────────────────────────────────┤
│  qlib_trader                                                   │
│                                                                │
│  ┌──────────┐   ┌────────────┐   ┌──────────────────────────┐ │
│  │ Strategy  │──▶│ SignalQueue│──▶│ SignalConsumer (执行器)   │ │
│  │ (Producer)│   │ (PriorityQ)│   └───────────┬──────────────┘ │
│  └──────────┘   └────────────┘               │                │
│                                               ▼                │
│  ┌─────────────┐  ┌─────────────┐    ┌──────────────┐         │
│  │HealthChecker│  │TradingSched │    │    MiniQMT    │         │
│  └─────────────┘  └─────────────┘    │   (xtquant)   │         │
│                                       └──────┬───────┘         │
│  ┌─────────────┐  ┌─────────────┐           │                 │
│  │RobustTrader │  │ DingTalkBot │           ▼                 │
│  └─────────────┘  └─────────────┘    ┌──────────────┐         │
│                                       │  券商交易网关  │         │
│                                       └──────────────┘         │
└──────────────────────────────────────────────────────────────┘

模块说明

文件 职责
main.py 入口:加载配置、编排全部组件
trading_engine.py 交易引擎核心:优先级信号队列、生产者/消费者模式、限价委托
strategy.py TopkDropout 策略:读取 pred_score.csv,计算买卖清单
alert.py 钉钉机器人:文本/Markdown 消息推送
logger.py 日志系统:分文件日志(主/委托/信号)、交易监控、定时报告
scheduler.py 交易时间调度:交易日判断、9:25 启 / 15:05 停 / 15:10 日报
health_checker.py 健康检查:连接、5 分钟心跳、内存 < 500MB
robust.py 崩溃重启:最多重试 10 次,间隔 60 秒
recorder.py 资产记录:每日收盘记录当日资产、持仓、交易
script/generate_pred_score.py 加载 Qlib 模型 → 推理 → 输出 pred_score.csv
script/update_qlib_data.py 数据更新(CSV → Qlib 二进制)

策略

当前策略 MyStrategy 实现 TopkDropout 日频策略(中证全指指数增强):

  • 信号来源:Qlib 模型每日预测的 pred_score.csv
  • 调仓时间:每个交易日 14:50
  • 持仓数量:topk = 250 只
  • 每次卖出:n_drop = 25 只
  • 买入金额:每只 20,000 元
  • 默认分数:无预测分数的持仓股赋予最低分数,确保优先卖出
  • 科创板支持:688 开头股票交易单位为 200 股,其余为 100 股
  • 停牌/涨停保护:卖一价为 0 时跳过买入

每日运行流程

20:00  数据更新     → 数据下载 → 转 Qlib 二进制
23:00  预测生成     → Qlib 推理 → ml/pred_score.csv
09:20  交易启动     → python qlib_trader/main.py
09:25  调度器启动   → TradingEngine.start()
09:30  策略就绪     → Strategy._generate_signals() 每秒轮询
        |
        +- 14:50 调仓 → 读取 pred_score → 计算买卖清单 → 下单 → MiniQMT
        |              回调 → 日志 → 钉钉通知
        +- 每分钟健康检查
        |
15:05  调度器停止   → TradingEngine.stop()
15:10  日报推送     → 钉钉 Markdown 汇总

环境搭建

前提

  • Windows 10/11(MiniQMT 仅支持 Windows)
  • QMT 客户端已安装并登录

安装

# 1. 创建 conda 环境
conda create -n qlib python=3.12.13 -y
conda activate qlib

# 2. 安装依赖
pip install pyqlib xtquant

# 3. Qlib 数据
cd script
.\update_qlib_data.ps1

# 4. 训练模型
cd ml
jupyter notebook
# 记录输出的模型路径

配置

复制 configs/config.yaml.example 为 configs/config.yaml,填入实际配置:

qmt_path: "C:/Users/xxx/gjzq/gjzqQMT/userdata_mini"
session_id: 123456
account_id: "888600xxxx"
dingtalk_webhook: "https://oapi.dingtalk.com/robot/send?access_token=YOUR_TOKEN"
dingtalk_secret: "SEC_YOUR_SECRET"
model_path: "C:/Users/xxx/Desktop/qlib_trader/ml/mlruns/xxx/artifacts/trained_model"

运行

python qlib_trader/main.py

定时任务

cd script
.\CreateScheduledTasks.ps1 # 数据更新(每日 20:00) / 预测分数生成(每日 23:00)

开发指南

添加新策略

from trading_engine import SignalProducer, SignalType

class MyNewStrategy(SignalProducer):
    def __init__(self, queue, xt_trader, acc, logger, alert):
        super().__init__(queue)
        self.strategy_name = "MyNewStrategy"
        self.xt_trader = xt_trader
        self.acc = acc
        self.logger = logger
        self.alert = alert

    def _generate_signals(self):
        # 读取 pred_score.csv 并生成买卖信号
        self.emit_signal(
            signal_type=SignalType.BUY,
            stock_code="000001.SZ",
            price=10.5, volume=100,
            reason="pred_score > 0.8",
            priority=5
        )

在 main.py 中注册:

from my_strategy import MyNewStrategy
engine.add_strategy(MyNewStrategy(engine.signal_queue, trader, acc, logger, alert))

项目结构

qlib_trader/
├── qlib_trader/                  # 交易系统核心
│   ├── main.py                   # 入口
│   ├── trading_engine.py         # 交易引擎
│   ├── strategy.py               # 策略
│   ├── alert.py                  # 钉钉告警
│   ├── logger.py                 # 日志与监控
│   ├── scheduler.py              # 时间调度
│   ├── health_checker.py         # 健康检查
│   ├── recorder.py               # 资产记录
│   └── robust.py                 # 崩溃重启
├── ml/                           # 模型训练
│   ├── workflow_by_code.ipynb    # 训练脚本
│   ├── pred_score.csv            # 每日预测输出
│   └── mlruns/                   # MLflow artifacts
├── script/
│   ├── CreateScheduledTasks.ps1  # 定时任务脚本
│   ├── generate_pred_score.py    # 预测分数生成
│   ├── generate_pred_score.ps1   # PowerShell 封装
│   ├── update_qlib_data.ps1      # 数据更新封装
│   ├── update_qlib_data.py       # 数据采集脚本
│   └── dump_bin.py               # 将 CSV 格式转换为 Qlib 格式
├── configs/
│   ├── config.yaml               # 实际配置(不入库)
│   └── config.yaml.example       # 配置模板
└── logs/                         # 运行时日志

注意事项

  1. 仅支持 Windows:MiniQMT SDK 为 Windows 专有
  2. QMT 需提前登录:运行前确保 QMT 客户端已登录且 MiniQMT 已启用
  3. 配置文件不入库:config.yaml 含敏感信息,已在 .gitignore 中排除
  4. 日志不自动清理:按天生成,建议定期归档
  5. 模型路径需更新:重新训练后模型路径变化,需更新 config.yaml

请作者喝杯咖啡☕️

支付宝 微信支付

支付宝              微信支付

许可

仅供学习和研究使用。实盘交易有风险,请充分测试后再投入使用。

About

QlibTrader 是一个轻量级的量化交易框架,连接 miniQMT 实盘接口与 Qlib 机器学习预测引擎。实现每日自动调仓、异常监控、日志记录和消息推送,专为 A 股无人值守交易设计。

Resources

Stars

11 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages