一个基于 Python 的量化研究框架,覆盖 数据 → 因子 → 合成 → 选股 → 回测 → 归因 全链路, 配置驱动,组件可插拔。
Note
定位:课程期间做的因子研究框架,研究/教学用途,不是交易系统。回测撮合基于 Backtrader, 未做真实成交约束(滑点、涨跌停、停牌、资金容量)的完整建模,没有经过实盘验证, 不要用于实盘下单或作为投资依据。
状态:已完成的个人项目,不再主动开发;issue 与 PR 可能不会及时回复。
- 装饰器注册 + 动态加载(
core/registry.py/core/loader.py):新增因子、数据源、 选股器、分配器都不需要改框架代码,放进去就被扫描注册;main.py --mode list_components可以打印出当前注册表全貌。 - 因子流水线分层(
factors/pipeline/):标准化器(ZScore / Rank / MAD)、合成器 (等权 / 固定权重 / 动态显著性 / RollingICIR / RollingRegression / LightGBM)、 滚动计算器三层解耦,同一批因子可以换不同合成方式做 A/B 对比。 - 行业中性处理(
factors/library/industry_neutral/):每个原始因子都有对应的 行业中性版本,避免因子收益被行业 beta 吃掉。 - 回测组件化(
backtest/pipeline/):选股器(TopN / 行业中性)、权重分配器 (最大夏普 / 最小方差 / 风险平价)、资金管理器(Kelly)分别在独立目录里, 由 YAML 配置串联。 - 工程侧:
uv管理依赖并提交uv.lock保证可复现,argparse四种运行模式, 日志按配置动态调级。
- 数据流水线是线性串联的:
data/manager.py里下载 → 清洗 → 落库顺序执行, 新增一层加工(比如复权因子切换、多频率对齐)要动主流程,这是当初最影响扩展的地方。 正确做法是拆成 DataSource / Transform / Store 三段,用 pipeline 对象串起来。 test/目录混着开发期的调试脚本:debug_*.py、test_*_fix.py是当时定位问题 随手写的,不是测试套件。真正的单元测试只有test_*_unit.py那批。- 没有 CI:测试靠手动跑,回归没有自动化守卫。
- 因子评估只有 IC/IR 一类指标,缺分层回测和换手率/容量分析。
- 多数据源支持 - Tushare、Akshare、本地 SQLite 数据库
- 因子系统 - 30+ 预定义因子(技术面+基本面),支持行业中性处理
- 智能因子合成 - LightGBM机器学习、滚动优化、动态加权等多种策略
- 回测引擎 - 基于 Backtrader 的事件驱动回测框架,支持自动调仓
- Kelly Criterion资金管理 - 基于凯利公式的仓位管理系统
- 高级组合优化 - 最大夏普率、最小方差、风险平价等分配策略
- 可插拔架构 - 装饰器自动注册,易于扩展新组件
- 配置驱动 - YAML 配置文件,参数化管理
Quant_Project/
├── core/ # 核心框架层
│ ├── registry.py # 组件注册表
│ ├── loader.py # 动态模块加载器
│ ├── config.py # 配置管理
│ └── abstractions.py # 抽象基类
├── data/ # 数据层
│ ├── manager.py # 数据提供管理器
│ ├── calendar.py # 交易日历
│ ├── providers/ # 数据源驱动
│ └── handlers/ # 数据库处理器
├── factors/ # 因子系统
│ ├── library/ # 因子库
│ │ ├── momentum.py # 技术面因子(动量、反转等)
│ │ ├── rsi.py # 技术指标(RSI、MACD、KDJ等)
│ │ ├── ep.py # 基本面因子(EP、BP、ROE等)
│ │ ├── complex_factor_base.py # 复合因子基类
│ │ └── industry_neutral/ # 行业中性因子目录
│ ├── pipeline/ # 处理流水线
│ │ ├── combiners/ # 因子合成器(LightGBM、滚动优化等)
│ │ ├── standardizers/ # 标准化器(ZScore、Rank等)
│ │ └── rolling/ # 滚动计算器
│ └── analysis/ # 因子分析
├── backtest/ # 回测系统
│ ├── core/ # 回测核心
│ ├── pipeline/ # 回测流水线
│ │ ├── selectors/ # 选股器(TopN、行业中性等)
│ │ ├── allocators/ # 权重分配器(最大夏普、最小方差等)
│ │ └── capital/ # 资金管理器(Kelly公式等)
│ └── triggers/ # 触发器(自动调仓、止损等)
├── configs/ # 配置文件
│ ├── universe.yaml # 股票池配置
│ ├── data/ # 数据配置
│ ├── factors/ # 因子配置
│ └── backtest/ # 回测配置
├── scripts/ # 执行脚本
├── database/ # 数据库存储
├── output/ # 输出目录
│ ├── logs/ # 日志文件
│ ├── factor_reports/ # 因子分析报告
│ └── bt_reports/ # 回测报告
└── test/ # 测试文件
- Python 3.12+
- uv (包管理器)
# 克隆项目
git clone <repository-url>
cd Quant_Project
# 安装依赖
uv sync编辑 configs/data/config.yaml:
start_date: 2023-01-01
end_date: 2024-01-01
database:
db_path: "./database/quant_data.db"
download:
num_checker_threads: 16
num_downloader_threads: 16
batch_size: 200
provider_priority:
- sqlite如需使用 Tushare,请设置 token:
tushare:
token: "your_tushare_token"编辑 configs/universe.yaml 配置股票池(默认沪深300成分股)。
python main.py --mode download_datapython main.py --mode factor_analysispython main.py --mode backtestpython main.py --mode list_components技术面因子:
- Momentum - 动量因子(价格变化率)
- Reversal20D - 20日反转因子(加权反转)
- RSI - 相对强弱指标(14日)
- MACD - 移动平均收敛发散指标
- KDJ - 随机指标
- BollingerBands - 布林带指标
- MovingAverageCross - 均线交叉因子
- ADXDMI - ADX/DMI趋势强度指标
- VolumeSpike - 成交量突增因子
基本面因子:
- EP - 市盈率倒数(盈利收益率)
- BP - 市净率倒数(账面市值比)
- ROE - 净资产收益率
- GPM - 毛利率
- SalesGrowth - 营收同比增长率
- CFOP - 经营现金流市价率
- AssetTurnover - 总资产周转率
- CurrentRatio - 流动比率
行业中性因子(上述因子的行业中性版本):
- IndNeu_Momentum - 行业中性动量
- IndNeu_Reversal20D - 行业中性反转
- IndNeu_EP - 行业中性市盈率倒数
- IndNeu_BP - 行业中性市净率倒数
- IndNeu_ROE - 行业中性净资产收益率
- IndNeu_GPM - 行业中性毛利率
- IndNeu_SalesGrowth - 行业中性营收增长
- IndNeu_CFOP - 行业中性经营现金流
- IndNeu_AssetTurnover - 行业中性资产周转率
- IndNeu_CurrentRatio - 行业中性流动比率
- IndNeu_VolumeCV - 行业中性成交量变异系数
静态策略:
EqualWeights- 等权合成(所有因子权重相同)FixedWeights- 固定权重合成(手动指定各因子权重)DynamicSignificance- 动态显著性加权(根据因子显著性自动调整)
滚动优化策略:
RollingICIR- IC/IR滚动优化(基于历史IC/IR动态调整权重)RollingRegression- 回归滚动优化(多因子回归求解最优权重)
机器学习策略:
LightGBM_Periodic- LightGBM模型(周期性重新训练的梯度提升树)
LLM增强策略:
AdversarialLLM- 对抗式LLM优化(使用大语言模型辅助权重调整)
编辑 configs/factors/config.yaml 选择使用的因子和合成策略:
# 启用的因子列表
enabled_factors:
# 技术面因子
- Momentum
- MACD
- RSI
# 基本面因子
- EP # 市盈率倒数
- BP # 市净率倒数
- GPM # 毛利率
# 行业中性因子
- IndNeu_Momentum
- IndNeu_EP
# 因子合成策略
default_strategy: LightGBM_Periodic # 使用机器学习策略
# 标准化方法
default_standardizer: ZScore # Z-Score标准化- 在
factors/library/中创建新文件:
from factors.library.base import BaseFactor
from core.registry import register_factor
@register_factor("MyFactor")
class MyFactor(BaseFactor):
def calculate(self, df):
# 实现因子计算逻辑
return df['close'].pct_change(periods=10)- 在配置文件
configs/factors/config.yaml的enabled_factors列表中添加该因子名称
编辑 configs/backtest/config.yaml:
broker:
initial_cash: 1000000 # 初始资金
commission:
rate: 0.003 # 佣金费率(万分之十)
selector: TopN # 选股器
allocator: MaxSharpe # 权重分配器
capital_manager: FullKelly # 资金管理器
triggers:
- type: RebalanceDay # 自动调仓触发器
config_file: rebalance.yaml
- type: StopLoss # 止损触发器
config_file: stop_loss.yaml
benchmark: "600519" # 基准股票选股器 (Selector):
TopN- 选择因子值最高的 N 只股票IndustryNeutral- 行业中性选股(各行业均衡选择)
权重分配器 (Allocator):
EqualWeight- 等权分配MaxSharpe- 最大夏普率优化(基于历史协方差矩阵)MinimumVariance- 最小方差优化(降低组合波动性)RiskParity- 风险平价(各资产风险贡献相等)
资金管理器 (Capital Manager):
FullPosition- 全仓管理(固定仓位)FullKelly- 完全凯利公式(最优增长率,高风险)HalfKelly- 半凯利公式(平衡收益与风险)QuarterKelly- 四分之一凯利公式(保守策略)
触发器 (Trigger):
RebalanceDay- 自动定期调仓(支持按月、按周等频率)StopLoss- 止损触发(设定阈值自动止损)
Kelly Criterion 资金管理
Kelly公式根据预期收益率和风险动态调整仓位,实现长期资本最优增长:
FullKelly- 使用完整凯利公式计算的最优仓位(f* = μ/σ²),适合风险偏好型投资者HalfKelly- 使用一半凯利仓位(f*/2),在收益与风险之间取得平衡QuarterKelly- 使用四分之一凯利仓位(f*/4),更加保守稳健
组合优化算法
基于现代投资组合理论的多种优化策略:
MaxSharpe- 最大化夏普率(收益风险比),寻找风险调整后收益最优的组合MinimumVariance- 最小化组合方差,降低投资组合波动性RiskParity- 风险平价配置,使各资产对组合风险的贡献相等
自动调仓机制
回测系统支持灵活的自动调仓配置:
- 无需手动指定调仓日期
- 支持按月、按周、按日等多种调仓频率
- 与触发器系统配合,可实现复杂的调仓逻辑
| 依赖 | 用途 |
|---|---|
| tushare | Tushare 金融数据 API |
| akshare | Akshare 免费财经数据 |
| backtrader | 事件驱动回测框架 |
| pandas | 数据分析和处理 |
| numpy | 数值计算 |
| lightgbm | AI 因子合成 |
| scikit-learn | 机器学习 |
| matplotlib | 数据可视化 |
| plotly | 交互式绘图 |
| pyyaml | 配置解析 |
-
因子分析报告:
output/factor_reports/- IC、Rank IC分析
- 因子收益率分析
- 分层回测结果
- 因子相关性矩阵
- HTML交互式报告(可选)
-
回测报告:
output/bt_reports/- 每日持仓明细
- 交易记录(买入/卖出)
- 投资组合净值曲线
- 业绩指标(年化收益率、夏普率、最大回撤等)
- 与基准的对比分析
-
日志文件:
output/logs/- 详细的运行日志
pytest test/系统采用可插拔的组件架构:
┌─────────────────────────────────────────────────────────┐
│ main.py │
├─────────────────────────────────────────────────────────┤
│ core/registry.py (组件注册表) │
├─────────────────────────────────────────────────────────┤
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │ data/ │ │ factors/ │ │ backtest/ │ │
│ │ 数据管理 │ → │ 因子计算 │ → │ 策略回测 │ │
│ └─────────────┘ └─────────────┘ └─────────────┘ │
├─────────────────────────────────────────────────────────┤
│ configs/ (YAML) │
└─────────────────────────────────────────────────────────┘
MIT