# QMT策略工厂
基于多种数据源获取股票日线数据,使用遗传编程自动生成QMT能直接运行的交易策略。如果有测试的需求,请联系:Bogutongjin20230618
## 功能特性
- ✅ 支持**选股策略**:从股票池中选择股票进行买入/卖出
- ✅ 支持**择时策略**:对单只股票进行买入/卖出时机判断
- ✅ 支持**多种数据源**:AKShare、Baostock、Tushare、TDX(通达信)
- ✅ 支持**因子类型选择**:技术因子和财务因子
- ✅ 使用遗传编程自动生成交易因子
- ✅ 生成符合QMT API规范的策略代码
- ✅ 支持策略回测评估
- ✅ 提供**GUI图形界面**和命令行两种使用方式
- ✅ 支持打包成独立可执行文件(.exe)
## 项目结构
QMT_factory/
├── docs/ # QMT API文档
├── data/ # 数据获取模块
│ ├── init.py
│ ├── ak_data_loader.py # AKShare数据加载器
│ ├── baostock_data_loader.py # Baostock数据加载器
│ ├── tushare_data_loader.py # Tushare数据加载器
│ └── tdx_data_loader.py # TDX(通达信)数据加载器
├── core/ # 核心算法模块
│ ├── init.py
│ ├── gp_engine_stock.py # 股票遗传编程引擎
│ ├── factor_evaluator_stock.py # 股票因子评估器
│ ├── factor_functions.py # 因子函数库
│ ├── strategy_generator_qmt.py # QMT策略代码生成器
│ └── license_manager.py # 授权管理模块
├── gui/ # GUI界面模块
│ ├── init.py
│ ├── main_window.py # 主窗口
│ ├── timing_strategy_tab.py # 择时策略标签页
│ ├── selection_strategy_tab.py # 选股策略标签页
│ ├── strategy_worker.py # 策略生成工作线程
│ ├── payment_dialog.py # 支付对话框
│ └── font_config.py # 字体配置
├── tools/ # 工具脚本
│ ├── generate_license.py # 授权生成工具
│ └── README.md
├── generated/ # 生成的策略文件
│ └── strategies/
├── pytdx2-main/ # TDX数据源依赖库
├── main.py # 主程序入口(命令行)
├── gui_main.py # GUI主程序入口
├── setup.py # 打包配置
├── requirements.txt # 依赖包列表
└── README.md # 本文档
## 安装依赖
```bash
pip install -r requirements.txt
主要依赖:
akshare: 股票数据获取(主要数据源,推荐)
baostock: 股票数据获取(可选,独立数据源)
tushare: 股票数据获取(可选,需要token)
gplearn: 遗传编程算法库
pandas, numpy: 数据处理
scikit-learn: 机器学习工具
PyQt5: GUI界面框架
matplotlib: 数据可视化
joblib: 并行计算
- 其他依赖见
requirements.txt
注意:
- QMT的Python接口(xtquant)需要从QMT客户端安装,不在pip仓库中
- baostock、tushare和TDX是可选的数据源,如果不需要可以不安装
- TDX数据源使用项目内置的pytdx2库,无需额外安装
使用方法
方法1: GUI界面运行(推荐)
Windows系统:
# 方式1:直接运行Python脚本
python gui_main.py
# 方式2:使用批处理文件(如果已打包)
run_gui.bat
功能说明:
- 图形化界面,操作简单直观
- 支持选择数据源(AKShare、Baostock、Tushare)
- 支持选择因子类型(技术因子、财务因子)
- 实时显示策略生成进度
- 自动保存生成的策略文件
方法2: 命令行交互式运行
Windows系统:
# 方式1:直接运行Python脚本
python main.py
# 方式2:使用批处理文件
run_cli.bat
然后按照提示选择策略类型(选股或择时),输入相关参数。
方法3: 编程调用
生成择时策略
from main import generate_timing_strategy
# 生成择时策略
strategy_info = generate_timing_strategy(
stock_code='000001', # 股票代码
start_date='2022-01-01', # 开始日期
end_date='2024-01-01', # 结束日期
population_size=100, # 种群大小
generations=50, # 进化代数
max_iterations=10 # 最大迭代次数
)
if strategy_info and strategy_info.get('success'):
# 保存策略文件
with open(f"generated/strategies/{strategy_info['filename']}", 'w', encoding='utf-8') as f:
f.write(strategy_info['code'])
print(f"策略文件已保存: {strategy_info['filename']}")
生成选股策略
from main import generate_selection_strategy
# 生成选股策略
strategy_info = generate_selection_strategy(
stock_pool=['000001', '000002', '600000'], # 股票池
start_date='2022-01-01',
end_date='2024-01-01',
hold_count=10, # 持仓数量
rebalance_period=5, # 调仓周期(天)
population_size=100,
generations=50,
max_iterations=10
)
if strategy_info and strategy_info.get('success'):
# 保存策略文件
with open(f"generated/strategies/{strategy_info['filename']}", 'w', encoding='utf-8') as f:
f.write(strategy_info['code'])
print(f"策略文件已保存: {strategy_info['filename']}")
策略类型说明
择时策略
- 功能:对单只股票进行买入/卖出时机判断
- 输入:股票代码、历史数据日期范围、数据源、因子类型
- 输出:QMT策略代码文件
- 逻辑:
- 使用遗传编程生成因子表达式(技术因子或财务因子)
- 计算因子值,与阈值比较生成买卖信号
- 因子值 > 买入阈值 → 买入
- 因子值 < 卖出阈值 → 卖出
- 适用场景:单只股票的交易时机判断
选股策略
- 功能:从股票池中选择股票进行买入/卖出
- 输入:股票池列表、持仓数量、调仓周期、数据源、因子类型
- 输出:QMT策略代码文件
- 逻辑:
- 使用遗传编程生成选股因子表达式(技术因子或财务因子)
- 对每只股票计算因子值
- 按因子值排序,选择前N只股票
- 等权重买入,定期调仓
- 适用场景:从股票池中选择优质股票构建投资组合
因子类型
-
技术因子:基于价格、成交量等技术指标生成的因子
- 使用MA、EMA、RSI、MACD等技术指标
- 适合短期交易和择时策略
-
财务因子:基于财务数据生成的因子
- 使用财务指标如ROE、ROA、PE、PB等
- 适合中长期投资和选股策略
生成的策略代码
生成的策略代码符合QMT API规范,包含:
initialize(): 策略初始化
handle_data(): 主处理函数
- 技术指标计算函数(MA、EMA、RSI、MACD等)
- 因子计算逻辑(由遗传编程生成)
生成的策略文件保存在 QMT_factory/generated/strategies/ 目录下。
使用生成的策略
- 将生成的策略文件复制到QMT策略目录
- 在QMT中创建新策略,选择该文件
- 根据QMT的实际API调整策略代码中的接口调用(如数据获取、交易下单等)
- 运行策略进行回测或实盘交易
注意:生成的策略代码中的QMT API调用可能需要根据实际QMT版本和API文档进行调整。代码中已标注需要调整的部分。
参数说明
遗传编程参数
population_size: 种群大小,默认100,越大搜索空间越大但计算时间越长
generations: 进化代数,默认50,越多可能找到更好的因子但计算时间越长
max_iterations: 最大迭代次数,默认10,用于多次尝试找到更好的因子
选股策略参数
hold_count: 持仓数量,默认10只
rebalance_period: 调仓周期,默认5天
数据源说明
项目支持多种数据源,可在GUI界面中选择:
-
AKShare(推荐):
- 免费、数据全面
- 支持A股、指数、期货等
- 数据更新及时
- 需要网络连接
-
Baostock:
- 免费、稳定
- 可作为独立数据源使用
- 数据质量较高
- 需要网络连接
-
Tushare:
- 需要注册获取token
- 数据质量高、专业
- 部分数据需要积分
- 需要网络连接
-
TDX(通达信):
- 使用通达信服务器
- 数据实时性好
- 无需注册
- 需要网络连接
数据源切换:
- 在GUI界面中可以选择使用哪个数据源
- 如果某个数据源获取失败,程序会自动尝试其他已安装的数据源
- 建议优先使用AKShare,作为备用可使用Baostock或TDX
打包和安装
打包成可执行文件
项目支持使用PyInstaller打包成独立的Windows可执行文件:
# 使用批处理文件打包(推荐)
build_exe.bat # 完整打包
build_exe_simple.bat # 简化打包
build_exe_debug.bat # 调试模式打包
# 或使用PyInstaller直接打包
pyinstaller qmt_factory.spec
打包后的可执行文件位于 dist/ 目录下,可以直接运行,无需安装Python环境。
安装为Python包
# 安装到Python环境
pip install -e .
# 或使用setup.py
python setup.py install
注意事项
-
数据获取:
- 首次运行需要从数据源下载数据,可能需要一些时间
- 建议在网络良好的环境下运行
- 如果某个数据源失败,程序会自动尝试其他数据源
-
计算时间:
- 遗传编程需要较长时间,建议使用较小的参数进行测试
- 种群大小和进化代数越大,计算时间越长
- GUI界面会显示实时进度
-
策略验证:
- 生成的策略建议先在QMT中回测验证,再考虑实盘使用
- 回测结果仅供参考,实盘表现可能不同
-
因子表达式:
- 生成的因子表达式可能较复杂,建议理解其逻辑后再使用
- 可以手动调整阈值参数以优化策略表现
-
QMT API:
- 生成的策略代码中的QMT API调用需要根据实际QMT版本进行调整
- 代码中已标注需要调整的部分
- 参考
docs/ 目录下的QMT API文档
-
数据源选择:
- 如果某个数据源不可用,可以在GUI中选择其他数据源
- 建议安装多个数据源作为备用
-
Python版本:
- 建议使用Python 3.7-3.11
- Python 3.12及以上版本可能存在兼容性问题
技术细节
因子表达式
遗传编程生成的因子表达式使用以下特征:
技术因子特征:
- 价格数据:close, open, high, low, volume
- 技术指标:MA(5,10,20,30), EMA(5,10,20), RSI(14), MACD, STD(10,20)
- 差分和引用:diff(1,5), ref(1,5)
- 其他技术指标:BOLL, KDJ, CCI等
财务因子特征:
- 财务指标:ROE, ROA, PE, PB, PS, 净利润增长率等
- 需要确保数据源支持财务数据获取
适应度函数
使用收益/回撤比值作为主要适应度指标,同时考虑:
- 总收益率
- 夏普比率
- 最大回撤
- 胜率(择时策略)
- 年化收益率
遗传编程参数
- 种群大小(population_size):控制搜索空间,默认100
- 进化代数(generations):控制进化深度,默认50
- 最大迭代次数(max_iterations):多次尝试找到更好的因子,默认10
- 交叉率、变异率:控制进化过程,使用gplearn默认值
示例
示例1: 生成平安银行择时策略
from main import generate_timing_strategy
strategy_info = generate_timing_strategy(
stock_code='000001',
start_date='2022-01-01',
end_date='2024-01-01'
)
示例2: 生成沪深300成分股选股策略
from main import generate_selection_strategy
# 沪深300部分成分股
stock_pool = [
'000001', '000002', '000858', '000876',
'600000', '600036', '600519', '600887'
]
strategy_info = generate_selection_strategy(
stock_pool=stock_pool,
start_date='2022-01-01',
end_date='2024-01-01',
hold_count=5,
rebalance_period=10
)
常见问题
Q: 数据获取失败怎么办?
A: 检查网络连接,AKshare可能需要访问特定网站。可以尝试多次运行。
Q: 生成的策略表现不好?
A: 可以尝试:
- 增加进化代数或迭代次数
- 调整股票池或数据日期范围
- 手动优化阈值参数
Q: 如何理解生成的因子表达式?
A: 因子表达式使用gplearn格式,可以查看生成的策略代码中的注释。
Q: 生成的策略代码在QMT中无法运行?
A: 请根据QMT的实际API文档调整策略代码中的接口调用。代码中已标注需要调整的部分。
快速开始
-
克隆或下载项目
git clone <repository-url>
cd QMT_factory
-
安装依赖
pip install -r requirements.txt
-
运行GUI界面
python gui_main.py
-
选择策略类型和数据源
- 在GUI中选择"择时策略"或"选股策略"
- 选择数据源(推荐AKShare)
- 输入相关参数
-
生成策略
- 点击"生成策略"按钮
- 等待策略生成完成
- 查看生成的策略文件
-
在QMT中使用
- 将生成的策略文件复制到QMT策略目录
- 在QMT中创建新策略并选择该文件
- 根据实际QMT API调整代码
- 进行回测或实盘交易
参考文档
开发说明
项目结构说明
data/: 数据获取模块,支持多种数据源
core/: 核心算法模块,包含遗传编程引擎和策略生成器
gui/: GUI界面模块,使用PyQt5开发
tools/: 工具脚本,包含授权管理等工具
docs/: QMT API相关文档
贡献指南
欢迎提交Issue和Pull Request来改进项目。
许可证
本项目基于主项目的许可证。