# QuantTrading **Repository Path**: yxl/QuantTrading ## Basic Information - **Project Name**: QuantTrading - **Description**: QuantTrading - **Primary Language**: Python - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2014-02-24 - **Last Updated**: 2026-07-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # KP量化交易分析系统 v2.1 基于 **Python PyQt6 + PyQtGraph + pandas/numpy** 开发的 A股量化交易 GUI 应用,采用 **MVC 严格分层** 设计。核心数据源:**马瑞数据 API (鉴权)** + **东方财富公开接口 (情绪/板块/资金流,带熔断/缓存)**,辅以 **新浪/腾讯/AKShare/Tushare Pro** 多源混搭与自动回退。 --- ## 核心功能(6 大页面,按导航顺序) | 序号 | 页面 | 核心能力 | |-----|------|----------| | **0** | **行情中心** | A股实时行情(五档盘口)、自选股管理、PyQtGraph K 线图(MA5/10/20/60,鼠标缩放拖动)、股票资料弹窗 | | **1** | **股票预测** | 技术指标 + AI 大模型综合预测,K 线图支持 `ai_summary` 参数注入 AI 解读 | | **2** | **策略回测** | 双均线 / MACD / 布林带三大经典策略,可视化参数配置,**风控参数 5 项接入 GUI**,核心指标输出,CSV 导出 | | **3** | **市场情绪** | 涨跌家数/分布/涨跌停统计、大盘资金流、板块实时排行、推荐股票管线(板块领涨个股 → 多维打分 → 权重可调 → AI 摘要) | | **4** | **系统日志** | 分级日志实时展示、关键字筛选、CSV 导出 | | **5** | **关于我** | 作者信息、系统版本/主题/数据源/落库状态、免责声明,**版本胶囊 v2.1 可点击跳转** | --- ## 数据源架构(多源混搭 + 自动回退 + 缓存分层) 配置文件:`config/settings.ini` → `[DataSources]` | 数据类型 | 优先级链 | 关键特性 | |----------|----------|----------| | **实时行情** | `sina(主,含五档)` → `tencent(qt.gtimg.cn兜底)` → `akshare(兜底)` → `mairui(鉴权)` | Sina 五档真实盘口;腾讯无五档但稳;AKShare 底层爬东财同限流;马瑞鉴权稳 | | **K 线** | `sina` → `akshare` → `mairui` | 日/周/月线;AKShare 成交量「手→股」已转换 | | **涨跌停股池** | `mairui(专属, hslt/ztgc+dtgc)` | 权威、稳定 | | **市场情绪/资金流** | `tushare(优先, daily/涨跌家数/分布/涨跌停计数)` → `eastmoney(兜底)` | Tushare Pro 需 120 积分(已达标);盘中自动回退东财 | | **大盘资金流** | `tushare(moneyflow_mkt_dc, 需 ~2000积分)` → `eastmoney(push2主)` → `eastmoney(push2his备, 不同限流桶)` | 免费真正异源资金流不存在;UI 动态标记来源 | | **板块实时排行** | `eastmoney(仅源,缓存 30s + 熔断)` | 无稳定替代源 | **缓存策略**:实时行情 60s / K 线 300s / 东财 URL 缓存 30s(分布 60s 避免惊群) --- ## 技术栈 | 类别 | 技术 / 库 | |------|-----------| | GUI 框架 | **PyQt6** (首选) / PySide6 (兼容回退) | | 图表渲染 | **PyQtGraph** (高性能 GPU 加速) | | 数据处理 | **pandas**, **numpy** | | 核心数据源 | **马瑞数据 API** (`api.mairuiapi.com`, 需 License) | | 情绪/板块/资金流 | **东方财富公开接口** + 熔断/缓存/退避重试 | | 备选/兜底源 | **新浪财经** (五档)、**腾讯财经** `qt.gtimg.cn` (指数+个股、无五档)、**AKShare**、**Tushare Pro** (免费 token) | | 本地存储 | **MySQL** (`pymysql`) — 7 张表自动建表:`realtime_quotes/kline_data/predictions/trades/portfolio/recommended_stocks/sentiment_*` | | K 线表优化 | `executemany` 分批 2000、`get_kline_batch/get_kline_stats/export_kline_to_parquet/archive_old_daily` | | 架构模式 | **MVC 严格分层**:`view/` (界面) / `controller/` (调度) / `model/` (数据+策略) / `utils/` (工具) | | 配置管理 | `config/config_loader.py` `ConfigLoader` 单例驱动全局应用名/版本/默认值 | | 样式系统 | `config/style.qss` **Design Tokens** 为配色权威:涨红 `#FF5B5B` / 跌绿 `#2ECB70` / 平灰 / 主题蓝 `#5B8DEF` | --- ## 目录结构 ``` D:/PythonProject/QuantTrading/ ├── main.py # 程序入口,页面注册顺序 = 导航顺序 ├── requirements.txt # Python 依赖 ├── README.md # 本文件 ├── config/ │ ├── settings.ini # 系统配置(数据源链/缓存/账户/风控/API Key) │ └── style.qss # 深色量化主题样式表 ├── view/ # 界面层 (View) │ ├── main_window.py # 主窗口、标题栏、导航、堆叠页 │ ├── market_center.py # 行情中心页面 │ ├── prediction_page.py # 股票预测页面 │ ├── backtest_page.py # 策略回测页面(含风控折叠区) │ ├── market_sentiment_page.py # 市场情绪页面 │ ├── log_page.py # 系统日志页面 │ ├── about_me_page.py # 关于我页面 │ ├── charts.py # CandleChartWidget (K线+均线+AI摘要) │ ├── kline_window.py # K线弹窗 │ ├── stock_profile_dialog.py # 股票资料弹窗 │ ├── sentiment_panel.py # 市场情绪组件 │ └── __init__.py ├── controller/ # 控制层 │ ├── market_controller.py # 行情控制器 │ ├── prediction_controller.py # 预测控制器 │ ├── backtest_controller.py # 回测控制器 │ └── __init__.py ├── model/ # 数据与策略层 │ ├── market_data.py # MarketDataService 统一行情入口 │ ├── market_sentiment_data.py # MarketSentimentData (情绪/资金流/推荐管线) │ ├── mairui_api.py # 马瑞 API 封装 │ ├── tencent_api.py # 腾讯财经 API 封装 │ ├── tushare_api.py # Tushare Pro API 封装 │ ├── predictor.py # 预测模型 │ ├── indicators.py # 技术指标计算 │ ├── strategies.py # 策略算法 + 回测引擎 (含风控参数) │ ├── db_manager.py # DBManager (MySQL, 自动建表/优化) │ ├── data_warmup.py # DataWarmupWorker (启动后台预热自选股) │ ├── ai_common.py # AI 大模型通用调用 │ ├── data_models.py # 数据结构定义 │ └── __init__.py ├── data/ # 本地数据缓存 & 日志 │ ├── cache/ │ └── quant_trading.log ├── tests/ # 测试套件 │ ├── smoke/ # 冒烟测试 │ ├── test_config_loader.py │ ├── test_recommend_scoring.py │ └── test_accuracy_backtest.py ├── tools/ # 辅助工具 │ └── weight_sensitivity.py # 推荐权重敏感度分析 ├── utils/ │ ├── logger_setup.py # 日志系统 │ ├── helpers.py # 通用工具函数 │ └── __init__.py └── .workbuddy/ # WorkBuddy 项目记忆 └── memory/ ├── MEMORY.md # 项目长期记忆 └── YYYY-MM-DD.md # 每日工作日志 ``` --- ## 快速开始 ### 1. 环境要求 - **Python 3.10+** (推荐 3.13) - **Windows / macOS / Linux** - **MySQL 5.7+** (本地 `127.0.0.1:3306`, 数据库 `quant_trading`, 用户 `root`, 密码 `root`) ### 2. 安装依赖 ```bash pip install -r requirements.txt ``` 核心依赖:`PyQt6`, `pyqtgraph`, `pandas`, `numpy`, `pymysql`, `tushare`, `akshare`, `requests`, `pyyaml` > **Qt 测试环境**:项目在 `D:/anaconda3/python.exe` (Anaconda 环境) 下开发测试,托管 Python 无 PyQt6/Tushare。 ### 3. 配置 API Key (必填项) 编辑 `config/settings.ini`: ```ini [Mairui] licence = YOUR_MAIRUI_LICENCE # https://www.mairui.club 获取 [Tushare] enabled = True token = YOUR_TUSHARE_PRO_TOKEN # https://tushare.pro 注册 -> 个人主页 -> 接口 token ``` - 马瑞 License:实时行情/K线/涨跌停股池 **核心必需** - Tushare Token:涨跌家数/分布/涨跌停计数 **免费 120 积分即可**;大盘资金流需 ~2000 积分 ### 4. 运行程序 ```bash python main.py ``` --- ## 核心交互与快捷键 | 操作 | 触发方式 | |------|----------| | 刷新行情 | `F5` | | 导出数据 | `Ctrl+E` | | 查看股票资料 | 行情中心工具栏「查看资料」按钮 / 双击行 | | 切换页面 | 顶部导航栏 / 版本胶囊 v2.1 点击 → 「关于我」 | | 实时指数条 | 标题栏中央 `LiveIndexTicker` (上证/深证/创业/科创,5s 刷新) | | 数据状态/时钟 | 标题栏右侧胶囊 | --- ## 默认配置 (config/settings.ini) | 参数 | 默认值 | 说明 | |------|--------|------| | `initial_capital` | 1,000,000 | 初始资金 (元) | | `commission_rate` | 0.00025 | 手续费率 (万 2.5) | | `stamp_tax_rate` | 0.001 | 印花税 (卖出单边, 千 1) | | `max_single_position_ratio` | 0.30 | 单笔最大仓位 | | `max_daily_loss_limit` | 0.05 | 单日最大亏损 | | `max_position_ratio` | 0.95 | 总仓位上限 | | `default_stop_loss_ratio` | 0.05 | 默认止损 | | `default_take_profit_ratio` | 0.15 | 默认止盈 | | `quote_cache_seconds` | 60 | 实时行情缓存窗口 | | `kline_cache_seconds` | 300 | K线缓存窗口 | **均线配色**:MA5 白 / MA10 金黄 / MA20 紫 / MA60 青 --- ## 关键特性详解 ### 推荐股票管线 (`model/market_sentiment_data.py`) 1. 取板块领涨个股快照 2. `_score_recommendations` 四维打分:情绪 0.30 / 动量 0.30 / 资金 0.25 / 板块 0.15 3. `return_raw=False` 返回排序后列表;`=True` 返回 `(ranked, raw)` 供权重试算本地重排 (无网络) 4. UI `_SentimentWorker` 写入 `data["recommended"]` / `data["_recommended_raw"]` 5. `_on_weight_tune` 本地重排,**字段陷阱**:raw 中个股 `main_net` 必须取 `ld.get("main_net")` (领涨股自身主力净流),误用 `board_main_net` 会恒为 None → 资金维度得分归零 ### 市场广度卡片 (`view/sentiment_panel.py` `AdvanceDeclineWidget`) - `DistributionChart.setFixedHeight(190)` 隔离直方图防重叠 - 下方 5 列统计网格 (标签+数值+占比) + 均值±% 胶囊 - `fetch_advance_decline` 合理性校验:单边 0 家 (`up==0` 或 `down==0`) 判失真 → 降级 (分布推导 / 诚实返回 None,**绝不编造**) ### Tushare Pro 集成细节 - `model/tushare_api.py` `TushareAPI`:`fetch_market_snapshot` (pro.daily)、`fetch_market_fundflow` (pro.moneyflow_mkt_dc) - `_resolve_trade_date()` 用 `trade_cal` 解析最近交易日 (修复周末误判);失败回退「周末→上周五」 - 经典 `get_today_all()` 已失效 → 全部改用 Pro 官方接口 - `available()=True` 但积分不足时各方法返回 `None` 优雅回退东财 ### MySQL 数据库 (`model/db_manager.py` `DBManager`) - 连接池单例,表自动建表:`realtime_quotes, kline_data, predictions, trades, portfolio, recommended_stocks, sentiment_*` - K 线表优化:批量写入 2000 条/批、批量读取、统计聚合、Parquet 导出、旧日归档 - 注释补全陷阱:`ALTER MODIFY id` 列禁写 `PRIMARY KEY` (用 `"BIGINT AUTO_INCREMENT"`),失败仅 DEBUG 不降级 ### 数据预热 (`model/data_warmup.py`) - 启动 1 秒后后台异步拉取自选股实时行情入库 - 主窗口关闭时安全停止线程 (最多等 3 秒) --- ## UI 文字约定 - **禁用 Emoji** (PyQt 控件渲染异常) → 用 `▲▼●━◆┄—` 或 `QIcon` - `QTabWidget.setUsesScrollButtons(True)` + 深色箭头样式 - 中文宽度用 `QFontMetrics` 计算固定宽 --- ## 测试与质量 ```bash # 运行全部测试 pytest -v # 冒烟测试 pytest tests/smoke/ -v # 单项验证 pytest tests/test_config_loader.py -v pytest tests/test_recommend_scoring.py -v pytest tests/test_accuracy_backtest.py -v ``` - `py_compile` 全文件通过 - 回归测试 79/79 断言全绿 --- ## 常见问题 | 现象 | 原因 | 解决 | |------|------|------| | 启动白屏 | 未强制 Fusion 风格 | `main.py` 已强制 `app.setStyle("Fusion")` + 深色调色板兜底 | | 东财限流 429/503 | 高频请求 | 已内置 URL 缓存 30s + 指数退避 + 熔断;盘中自动回退 Tushare | | 周末涨跌家数显示异常 | 休市无实时数据 | `_fallback_advance_decline_sina` 已改为诚实返回 None,面板显示「数据暂不可用」 | | 推荐股票永远为空 | `fetch_all` 缺 `recommended` 字段 | 已修复:正常路径调用 `fetch_recommended_stocks(snap, return_raw=True)` | | 权重试算按钮不可用 | `_recommended_raw` 缺失 | 已同步修复 | | Tushare daily 无权限 | 积分 < 120 | 完善个人信息 (改昵称) +20 分 → 120 解锁 | | MySQL 注释修改报错 | `ALTER MODIFY id` 含 PK | 已规避:用 `BIGINT AUTO_INCREMENT`,失败仅 DEBUG | --- ## 版本历史 | 版本 | 日期 | 核心变更 | |------|------|----------| | **v2.1** | 2026-07-18~19 | 标题栏重构 + LiveIndexTicker + About Me 页 + 腾讯兜底 + Tushare Pro 接入 + 市场广度修复 + 推荐管线修复 + ConfigLoader 统一驱动 + RiskControl 接入回测 GUI + 应用命名统一 | | v2.0 | 2026-06~07 | MVC 重构、马瑞核心数据源、PyQtGraph K线、MySQL 落库、策略回测三大经典策略 | | v1.x | 2026 早期 | 原型阶段,基于 AKShare 单一数据源 | --- ## License MIT License — 仅供学习研究使用,**不构成投资建议**。A股涨红跌绿配色遵循中国市场惯例,与美股相反。所有交易行为均为模拟,不涉及真实资金。 --- ## 致谢 - **马瑞数据** `api.mairuiapi.com` — 稳定鉴权行情/K线/涨跌停接口 - **东方财富** 公开接口 — 情绪/板块/资金流数据源 (配合缓存/熔断使用) - **Tushare Pro** `tushare.pro` — 免费 120 积分解锁盘后涨跌家数/分布/涨跌停计数 - **腾讯财经** `qt.gtimg.cn` — 无 Key 稳定指数/个股行情兜底 - **AKShare** `akshare.xyz` — 开源量化生态兜底 - **新浪财经** `hq.sinajs.cn` — 五档盘口主数据源