基于 AKShare + 聚宽因子 的本地量化回测系统
- 数据层: 使用 AKShare 获取 A 股实时/历史行情、财务数据
- 因子层: 落地实现聚宽因子库 200+ 因子计算
- 策略层: 支持均值回归、多因子排序、动量等多种策略
- 回测层: 完整的回测引擎,支持绩效分析
- 可视化: 自动生成回测报告和因子分析图表
quant_system/
├── data/
│ ├── __init__.py
│ └── data_fetcher.py # AKShare 数据获取与缓存
├── factors/
│ ├── __init__.py
│ └── jq_factors.py # 聚宽因子计算实现
├── backtest/
│ ├── __init__.py
│ └── backtest_engine.py # 回测引擎
├── utils/
│ ├── __init__.py
│ └── visualization.py # 可视化工具
├── main.py # 基础主程序
├── run.py # 增强版主程序(推荐)
├── strategies.py # 策略模板与示例
├── config.py # 配置文件
├── requirements.txt # Python依赖
└── README.md # 说明文档
cd quant_system
pip install -r requirements.txtPSY心理线均值回归策略:
python run.py --mode full --strategy psy --symbols 000001,000002,600519多因子综合策略:
python run.py --mode full --strategy multi --symbols 000001,000002,000333,600519,601318动量策略:
python run.py --mode full --strategy momentum因子分析(仅分析因子表现,不回测):
python run.py --mode analyze --symbols 000001,000002运行后会生成:
report_{strategy}.png- 回测报告图表returns_{strategy}.csv- 每日收益数据cache/- 数据缓存目录
| 因子代码 | 名称 | 计算公式 |
|---|---|---|
| PSY12 | 心理线指标 | 12日内上涨天数/12 × 100 |
| VR26 | 成交量比率 | (AVS+0.5CVS)/(BVS+0.5CVS) |
| AR26 | 人气指标 | Σ(最高-开盘)/Σ(开盘-最低) × 100 |
| BR26 | 意愿指标 | Σ(最高-昨收)/Σ(昨收-最低) × 100 |
| WVAD6 | 威廉变异离散量 | Σ[(收盘-开盘)/(最高-最低)×成交量] |
| VROC12 | 量变动速率 | (当日成交量-12日前成交量)/12日前成交量 × 100 |
| 因子代码 | 名称 | 说明 |
|---|---|---|
| Variance20 | 20日收益方差 | 年化收益方差 |
| Skewness20 | 20日收益偏度 | 收益率分布偏度 |
| Kurtosis20 | 20日收益峰度 | 收益率分布峰度 |
| Sharpe20 | 20日夏普比率 | (年化收益-无风险利率)/年化波动率 |
| 因子代码 | 名称 | 计算公式 |
|---|---|---|
| BIAS5/20 | 乖离率 | (收盘价-N日均价)/N日均价 × 100 |
| ROC12 | 变动速率 | (当日收盘价-N日前收盘价)/N日前收盘价 × 100 |
| CCI14 | 顺势指标 | (TYP-MA)/(0.015×AVEDEV) |
| 因子代码 | 名称 | 说明 |
|---|---|---|
| MA5/20 | 移动均线 | N日收盘价的简单平均 |
| EMA12/26 | 指数移动平均 | 指数加权移动平均 |
| ATR14 | 平均真实振幅 | 14日真实波幅的移动平均 |
| MACD | 平滑异同移动平均 | EMA12-EMA26及其信号线 |
| Bollinger | 布林带 | 中轨±2倍标准差 |
from backtest.backtest_engine import BacktestConfig
from strategies import PSYMeanReversionStrategy
# 配置
config = BacktestConfig(
start_date='20230101',
end_date='20241231',
initial_capital=1000000,
commission_rate=0.0003,
slippage=0.001,
max_positions=5,
rebalance_freq='W' # 每周调仓
)
# 创建策略
strategy = PSYMeanReversionStrategy(
config,
buy_threshold=25, # PSY低于25买入
sell_threshold=75 # PSY高于75卖出
)
# 运行回测
result = strategy.run(factor_data, price_data)from strategies import BaseStrategy
class MyStrategy(BaseStrategy):
def run(self, factor_data, price_data):
self.engine.reset()
dates = sorted(factor_data['date'].unique())
for date in dates:
self.engine.current_date = pd.to_datetime(date)
# 获取当日因子数据
day_data = factor_data[factor_data['date'] == date]
# 自定义选股逻辑...
selected_stocks = self.my_stock_selector(day_data)
# 执行交易
# ...
# 更新组合市值
self.engine.update_portfolio(market_data)
return {
'returns': self.engine.get_returns(),
'metrics': self.engine.get_performance_metrics(),
'trades': self.engine.trades
}所有因子计算公式参考自聚宽官方文档: https://www.joinquant.com/help/api/help?name=factor_values
文档中包含了 200+ 个因子的详细计算说明,包括:
- 质量因子(ROE、毛利率、周转率等)
- 基础因子(营收TTM、净利润TTM等)
- 成长因子(营收增长率、净利润增长率等)
- 情绪因子(VR、PSY、AR、BR等)
- 风险因子(夏普比率、方差、偏度等)
- 技术因子(MACD、布林带、均线等)
- 动量因子(乖离率、ROC、CCI等)
- 数据缓存: 首次运行会下载数据并缓存到
cache/目录,后续从缓存读取,加快运行速度 - 回测限制: AKShare 数据有延迟,不适合高频交易回测
- 实盘风险: 回测结果仅供参考,实盘需考虑更多市场因素
- 财务因子: 当前版本主要实现了量价因子,财务因子需要接入财务报表数据
在 factors/jq_factors.py 中添加:
def my_factor(self, param: int = 10) -> FactorResult:
"""
我的自定义因子
计算公式: ...
"""
values = self.price['close'].rolling(window=param).mean()
return FactorResult(f"MyFactor{param}", values, self.price['date'])在 strategies.py 中继承 BaseStrategy:
class MyStrategy(BaseStrategy):
def run(self, factor_data, price_data):
# 实现策略逻辑
pass- akshare >= 1.14.0 (财经数据接口)
- pandas >= 2.0.0 (数据处理)
- numpy >= 1.24.0 (数值计算)
- matplotlib >= 3.7.0 (可视化)
- seaborn >= 0.12.0 (统计图表)
MIT