# FactorModel **Repository Path**: zhiyizhilu/factor-model ## Basic Information - **Project Name**: FactorModel - **Description**: 因子选股自动化交易 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2025-09-01 - **Last Updated**: 2026-04-23 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # FactorModel 股票因子模型交易系统 ## 项目介绍 FactorModel 是一个基于因子模型的股票自动化交易系统,通过聚宽平台获取因子数据,结合QMT交易系统实现自动化选股和交易。 ### 核心特性 - **多因子选股模型**:基于因子评分对股票进行排名和筛选 - **周期性自动交易**:按照设定的交易周期(交易日)自动执行策略 - **智能仓位管理**:等权重分配资金,支持单票持仓比例限制 - **日内止盈机制**:当股票涨幅超过阈值时自动触发卖出 - **动态补仓功能**:日内止盈后自动补仓,保持持仓数量 - **实时行情订阅**:订阅持仓和目标股票的tick行情数据 - **邮件通知系统**:启动通知、交易报告、异常警告等邮件提醒 - **完善的状态管理**:持久化策略状态,支持断点续运行 - **详细日志记录**:完整记录策略运行和交易过程 ## 项目架构 ``` FactorModel/ ├── FactorModel.py # 主程序入口,策略核心逻辑 ├── config/ # 配置文件目录 │ ├── config.py.example # 配置文件示例 │ └── mail.json.example # 邮件配置示例 ├── utils/ # 工具模块目录 │ ├── get_single_factor.py # 从聚宽获取因子数据 │ ├── sort_stocks_by_factor.py # 根据因子值排序股票 │ ├── StrategyCallback.py # QMT策略回调处理 │ ├── email_service.py # 邮件服务模块 │ ├── email_utils.py # 邮件工具函数 │ ├── qmt.py # QMT交易接口封装 │ ├── record.py # 记录管理(状态、收益等) │ ├── log.py # 日志配置和初始化 │ ├── selenium_manager.py # Selenium浏览器控制 │ └── other.py # 其他工具函数 ├── logs/ # 日志文件目录 ├── tmp_data/ # 临时数据存储目录 ├── example/ # 示例文件目录 ├── requirements.txt # Python依赖包列表 ├── 1.安装依赖包x64(pypi).bat # 依赖安装脚本(PyPI源) ├── 1.安装依赖包x64(清华源).bat # 依赖安装脚本(清华源) ├── 1.安装依赖包x64(阿里源).bat # 依赖安装脚本(阿里源) └── 2.启动程序x64.bat # 程序启动脚本 ``` ## 系统要求 ### 软件环境 - **Python**: 3.12 或更高版本 - **Google Chrome**: 最新稳定版 - **QMT交易系统**: 国金QMT客户端 - **聚宽账号**: 用于获取因子数据 ### Python依赖 - `selenium`: 浏览器自动化控制 - `baostock`: 股票数据获取 - `xtquant`: QMT量化交易接口 - 其他标准库:`pandas`, `numpy`, `tqdm` 等 ## 安装步骤 ### 1. ChromeDriver配置 > [!IMPORTANT] > ChromeDriver版本必须与Chrome浏览器版本匹配,否则会导致Selenium无法正常工作。 - 检查Chrome浏览器版本(地址栏输入 `chrome://version/`) - 下载对应版本的ChromeDriver:https://googlechromelabs.github.io/chrome-for-testing/#stable - 将下载的 `chromedriver.exe` 替换到 `utils/` 目录下 - Chrome自动更新后需要同步更新ChromeDriver ### 2. 配置文件设置 #### 主配置文件 (config/config.py) 1. 复制 `config/config.py.example` 为 `config/config.py` 2. 修改以下配置项: **账户配置 (ACCOUNT_CONFIG)** ```python ACCOUNT_CONFIG = { 'account_id': 'your_account_id', # QMT账户ID 'qmt_path': r'C:\path\to\qmt', # QMT安装路径 'trade_type': 'STOCK', # 交易类型 'init_cash': 100000 # 策略初始资金 } ``` **策略参数 (STRATEGY_PARAMS)** ```python STRATEGY_PARAMS = { 'trade_cycle_days': 5, # 交易周期(交易日) 'trade_time': '14:50:00', # 每日交易时间 'stock_selection_count': 25, # 选股数量 'max_single_stock_ratio': 0.1, # 单票最大持仓比例(10%) 'min_adjust_money': 1000, # 最小调整金额 'commission_rate': 0.0003, # 手续费率 'intraday_profit_threshold': 0.05, # 日内止盈阈值(5%) 'enable_intraday_profit_taking': True, # 启用日内止盈 'is_debug': False # 调试模式 } ``` **因子数据配置** - `FACTOR_NOTEBOOK_URL`: 聚宽notebook地址 - `FACTOR_RESULT_URL`: 因子结果数据URL - `FACTOR_FILE_PATH`: 本地因子数据文件路径 #### 邮件配置 (config/mail.json) 1. 复制 `config/mail.json.example` 为 `config/mail.json` 2. 填写邮件服务器信息: ```json { "sender": "你的QQ邮箱", "receiver": "你的QQ邮箱", "smtpserver": "smtp.qq.com", "username": "你的QQ邮箱", "password": "你的QQ邮箱授权码" } ``` ### 3. 安装依赖包 根据网络情况选择合适的安装脚本: - **PyPI官方源**:`1.安装依赖包x64(pypi).bat`(推荐境外用户) - **清华镜像源**:`1.安装依赖包x64(清华源).bat`(推荐国内用户) - **阿里镜像源**:`1.安装依赖包x64(阿里源).bat`(推荐国内用户) 或手动安装: ```bash pip install -r requirements.txt ``` ## 使用方法 ### 启动流程 1. **启动QMT交易客户端** - 打开QMT并登录交易账户 - 确保账户状态正常 2. **启动Chrome并登录聚宽** - 打开Chrome浏览器 - 访问聚宽平台并登录账号 - 保持浏览器窗口打开 3. **启动策略程序** - 运行 `2.启动程序x64.bat` - 系统将自动初始化并等待交易时机 ### 运行逻辑 - 程序启动后会自动加载历史状态和持仓信息 - 在每个交易日的指定时间(`trade_time`)检查是否满足交易周期 - 满足条件时自动执行选股、计算仓位、执行交易 - 交易日内持续监控持仓,触发日内止盈条件时自动卖出 - 日内止盈后自动补仓,保持持仓数量 - 每日15:00后自动退出程序 ## 策略参数详解 | 参数名称 | 类型 | 说明 | 示例值 | |---------|------|------|--------| | `trade_cycle_days` | int | 交易周期,每隔N个交易日执行一次调仓 | 5 | | `trade_time` | str | 每日交易执行时间(HH:MM:SS) | '14:50:00' | | `stock_selection_count` | int | 选股数量,持仓股票数量上限 | 25 | | `max_single_stock_ratio` | float | 单票最大持仓比例(占总资产) | 0.1 (10%) | | `min_adjust_money` | float | 最小调整金额,低于此值不执行调仓 | 1000 | | `commission_rate` | float | 交易手续费率 | 0.0003 | | `intraday_profit_threshold` | float | 日内止盈阈值,涨幅超过此值触发卖出 | 0.05 (5%) | | `enable_intraday_profit_taking` | bool | 是否启用日内止盈功能 | True | | `is_debug` | bool | 调试模式,启用后1分钟后触发交易 | False | ## 核心功能说明 ### 1. 因子数据获取 - 通过Selenium控制Chrome浏览器访问聚宽平台 - 自动执行notebook获取最新因子数据 - 数据保存为JSON格式到本地 - 每日首次运行时自动更新数据 - 如果数据不是最新会发送邮件警告 ### 2. 选股与仓位计算 - 根据因子评分对股票进行排序 - 选取评分最高的N只股票(`stock_selection_count`) - 采用等权重分配资金 - 考虑单票持仓比例上限(`max_single_stock_ratio`) - 自动过滤涨幅已超过止盈阈值的股票 ### 3. 交易执行 **卖出逻辑**: - 清仓不在目标持仓中的股票 - 减持超过目标仓位的股票 - 使用限价单,价格为当前价的0.995倍 **买入逻辑**: - 买入新的目标股票 - 增持低于目标仓位的股票 - 使用限价单,价格为当前价的1.005倍 - 检查最小调整金额限制 ### 4. 日内止盈 - 实时监控持仓股票涨幅 - 涨幅超过阈值(`intraday_profit_threshold`)时触发卖出 - 卖出后自动补仓其他目标股票 - 避免重复触发止盈(记录已止盈股票) ### 5. 补仓机制 - 日内止盈后持仓数量减少时触发 - 从目标股票中选择未持有的股票 - 按照等权重计算买入数量 - 自动撤销未成交的补仓挂单 ### 6. 状态管理 - 持久化保存策略状态(资金、持仓、交易日期等) - 程序重启后自动恢复状态 - 记录每日收益和交易结果 - 支持断点续运行 ### 7. 邮件通知 系统会在以下情况发送邮件: - **启动通知**:策略启动时发送账户状态 - **交易报告**:每次交易完成后发送交易详情 - **因子数据警告**:因子数据不是最新时提醒 - **异常通知**:系统运行异常时告警 ## 工作流程 ```mermaid graph TD A[程序启动] --> B[初始化配置] B --> C[连接QMT] C --> D[加载因子数据] D --> E[恢复历史状态] E --> F[订阅行情数据] F --> G{到达交易时间?} G -->|否| H[监控日内止盈] H --> I{触发止盈?} I -->|是| J[执行止盈卖出] J --> K[自动补仓] K --> G I -->|否| G G -->|是| L{满足交易周期?} L -->|否| G L -->|是| M[获取最新因子数据] M --> N[选股并排序] N --> O[计算目标仓位] O --> P[执行卖出调整] P --> Q[执行买入调整] Q --> R[保存状态] R --> S[发送交易报告] S --> G ``` ## 日志说明 日志文件保存在 `logs/` 目录下,包含: - **策略运行日志**:初始化、选股、交易执行等详细信息 - **交易记录**:每笔交易的委托、成交情况 - **持仓变化**:仓位调整、市值变化 - **异常信息**:错误堆栈、警告提示 日志级别:INFO(常规信息)、WARNING(警告)、ERROR(错误) ## 注意事项 > [!WARNING] > 以下事项请务必注意,否则可能导致策略无法正常运行: 1. **QMT客户端**:运行策略前必须启动QMT并登录交易账户 2. **聚宽登录**:获取因子数据前必须在Chrome中登录聚宽平台 3. **配置文件**:首次运行前必须正确配置 `config.py` 和 `mail.json` 4. **ChromeDriver版本**:必须与Chrome浏览器版本匹配 5. **交易时间**:建议设置在14:30-14:50之间,避开开盘和尾盘 6. **网络连接**:确保网络稳定,能够访问聚宽平台和QMT服务器 7. **资金充足**:确保账户资金充足,否则可能导致交易失败 > [!CAUTION] > 本系统为量化交易工具,涉及真实资金交易,使用前请: > - 充分理解策略逻辑和风险 > - 在模拟账户中充分测试 > - 根据自身风险承受能力设置参数 > - 定期检查策略运行状态和持仓情况 ## 常见问题 **Q: 程序启动后没有执行交易?** A: 检查是否满足交易周期条件,查看日志中的周期检查信息。 **Q: 无法获取因子数据?** A: 确认Chrome已登录聚宽,检查 `FACTOR_NOTEBOOK_URL` 配置是否正确。 **Q: ChromeDriver报错?** A: 检查ChromeDriver版本是否与Chrome浏览器版本匹配。 **Q: 交易未成交?** A: 检查委托价格是否合理,市场流动性是否充足,可调整价格系数。 **Q: 日内止盈未触发?** A: 确认 `enable_intraday_profit_taking` 为True,检查涨幅是否达到阈值。 ## 更新日志 - **2025-11-26**: 更新README文档,完善项目说明和使用指南 - 详细的版本历史请查看Git提交记录