🐕 二狗子为大老板打造
aquant/
├── aquant/ # 核心包
│ ├── data/ # 数据引擎
│ ├── strategy/ # 策略引擎
│ │ ├── indicators.py # 技术指标库
│ │ └── __init__.py # 内置策略 + ML
│ ├── risk/ # 风控模块
│ ├── execution/ # 交易执行
│ ├── backtest/ # 回测引擎(支持在线学习模式)
│ ├── visualization/ # 可视化
│ ├── utils/ # 工具集
│ └── ml/ # 机器学习模块
│ ├── __init__.py # 特征工程 + ML策略
│ └── online.py # 在线学习(增量训练 + 漂移检测)
├── config/
├── scripts/
│ ├── train_ml.py # ML批量训练
│ ├── train_online.py # 在线学习训练
│ ├── run_backtest.py
│ └── dashboard.py
├── tests/
├── data/
├── logs/
├── models/ # 训练好的模型
└── reports/ # 回测报告
- Python 3.10+
- 数据源: AkShare / Tushare
- 存储: Parquet
- 回测: 事件驱动引擎
- 可视化: Plotly / Streamlit
- ML: scikit-learn / XGBoost / LightGBM
- 在线学习: 滑动窗口 / 概念漂移检测
- A股实时/历史行情
- 复权处理
- 本地缓存
- ✅ 双均线 (DualMA)
- ✅ 动量 (Momentum)
- ✅ 布林带 (Bollinger)
- ✅ RSI超买超卖
- ✅ MACD金叉死叉
- ✅ 海龟交易 (Turtle)
- ✅ 三均线 (TripleMA)
- ✅ 通道突破 (Breakout)
- ✅ RandomForest - 随机森林
- ✅ XGBoost - 梯度提升
- ✅ SVM - 支持向量机
- ✅ Logistic - 逻辑回归
- ✅ 滑动窗口更新 - 固定窗口大小,定期重训练
- ✅ 增量学习 - 仅用新数据更新(支持partial_fit的模型)
- ✅ 扩展窗口 - 累积所有历史数据
- ✅ 概念漂移检测 - 自动检测市场变化并触发更新
- ✅ 版本管理 - 自动保存模型版本,支持回滚
- ✅ 实时更新 - 逐Bar回调,模拟实盘环境
- 价格动量: 1/5/10/20日收益率、对数收益
- 移动平均: 5/10/20/60日SMA、EMA及其比值
- 震荡指标: RSI(14)、MACD(DIF/DEA/Hist)、KD、ADX
- 通道指标: 布林带上中下轨、带宽、位置
- 波动率: ATR(14)、20日波动率
- 成交量: 量比(5/20)、OBV、量价相关性
- 滞后特征: 1/2/3/5日收盘价/收益率滞后
triple_barrier: 三重障碍(目标盈/止损/时间)threshold: 固定阈值(N日后涨幅)quantile: 分位数标签
- 仓位管理、止损止盈
- 模拟撮合(含滑点、佣金、印花税)
- 事件驱动回测 + 绩效评估
- 支持在线学习模式(逐Bar回调)
# 安装依赖
pip install -e ".[dev,ml]"
# 1. 运行技术策略回测
aquant backtest -s dual_ma --symbol 000001
aquant backtest -s macd --symbol 000001
# 2. 训练ML模型(批量)
aquant train --symbol 000001 --model rf --start 2020-01-01 --backtest
# 3. 在线学习(滑动窗口 + 增量更新)🚀
aquant online --symbol 000001 --model rf --start 2020-01-01 --mode sliding --window 60 --backtest
# 4. 在线学习(漂移检测触发)🚀
aquant online --symbol 000001 --model xgb --mode drift --backtest
# 5. 批量回测
aquant batch -s macd --symbols 000001,600519,300750
# 6. Web面板
aquant dashboard| 模式 | 说明 | 适用场景 |
|---|---|---|
incremental |
纯增量(partial_fit) | 大型数据集,流式数据 |
sliding |
滑动窗口(固定大小) | 市场环境稳定,旧数据失效 |
expanding |
扩展窗口(累积) | 数据量逐渐增长 |
drift |
漂移检测触发 | 自动适应市场变化 |
1. 预热期 (warmup_period)
└─ 积累初始数据,训练第一版模型
2. 逐Bar处理
├─ 更新特征
├─ 生成标签(模拟)
├─ 检查是否达到更新条件
│ ├─ 窗口满?
│ ├─ 频率到?
│ └─ 漂移检测?
└─ 触发更新 → 重训练 → 保存版本
3. 预测信号
└─ 使用最新模型生成交易信号
检测器监控以下指标:
- 准确率下降: 滑动窗口准确率持续下降
- 预测分布: 预测概率分布离散度异常
- 模型僵化: 长期只预测单一类别
触发漂移后自动重训练。
基于参数调优,推荐配置:
| 参数 | 推荐值 | 说明 |
|---|---|---|
n_estimators |
100 | 树数量,平衡速度与精度 |
max_depth |
10 | 限制深度防过拟合(关键!) |
min_samples_split |
2 | 保持默认 |
min_samples_leaf |
1 | 保持默认 |
max_features |
0.8 | 使用80%特征(优于默认 sqrt) |
window_size |
60 | 滑动窗口大小(约2个月) |
warmup_period |
50 | 预热期(至少大于window_size) |
性能预期:夏普 1.1-1.2,年化 8-10%,最大回撤 <4%
# 滑动窗口模式(60日窗口,每20日检查一次)
aquant online \
--symbol 000001 \
--model rf \
--start 2020-01-01 \
--mode sliding \
--window 60 \
--frequency 20 \
--backtest
# 漂移检测模式(自动适应市场变化)
aquant online \
--symbol 000001 \
--model xgb \
--mode drift \
--backtest📊 加载 000001 数据: 562 条
🏋️ 初始训练... ✅ 样本: 120 条
🔄 模拟在线学习过程...
📍 2024-06-15 模型更新: 滑动窗口满(120条)
📍 2024-07-10 模型更新: 概念漂移: 准确率下降趋势: 45.00%
📍 2024-08-05 模型更新: 滑动窗口满(120条)
✅ 在线学习完成 | 共更新 3 次
📦 模型版本:
v001: 2024-06-15 | 样本120 | 准确率52.33%
v002: 2024-07-10 | 样本120 | 准确率54.17%
v003: 2024-08-05 | 样本120 | 准确率51.67%
📊 回测结果:
总收益: +8.23%
年化: 4.12%
夏普: 0.78
最大回撤: -3.45%
交易次数: 24
# 1. 批量训练(全量数据)
from aquant.ml import RandomForestStrategy
from aquant.data.fetcher import DataFetcher
fetcher = DataFetcher()
df = fetcher.get_daily("000001", date(2020,1,1), date.today())
strategy = RandomForestStrategy(n_estimators=200)
metrics = strategy.train(df)
print(f"准确率: {metrics['accuracy']:.2%}")
strategy.save("./models/rf_000001.pkl")
# 2. 在线学习(增量更新)
from aquant.ml.online import create_online_learner, OnlineStrategyWrapper
learner, fe, lg = create_online_learner(
model_type="rf",
update_mode="sliding", # sliding/drift/incremental/expanding
window_size=120,
)
# 包装为策略
online_strategy = OnlineStrategyWrapper(
online_learner=learner,
feature_engineer=fe,
confidence_threshold=0.6,
warmup_period=100,
)
# 回测
from aquant.backtest import BacktestEngine
engine = BacktestEngine(online_strategy, initial_capital=1_000_000)
result = engine.run(df)
# 查看版本历史
for v in learner.versions:
print(f"{v.version_id}: {v.accuracy:.2%} | {v.created_at}")训练后查看哪些特征对预测最重要:
metrics = strategy.train(df)
for feat, imp in list(metrics["feature_importance"].items())[:10]:
print(f"{feat}: {imp:.4f}")输出:
sma_60: 0.0365
bb_width: 0.0307
atr_ratio: 0.0296
ema_26: 0.0294
macd_dif: 0.0290
| 策略 | 总收益 | 年化 | 夏普 | 最大回撤 |
|---|---|---|---|---|
| DualMA | +12.72% | 5.52% | 0.61 | -2.58% |
| MACD | +29.32% | 12.22% | 1.77 | -1.62% |
| Bollinger | +11.94% | 5.19% | 0.66 | -3.07% |
| 模型 | 准确率 | 说明 |
|---|---|---|
| RandomForest | 33-55% | 单股预测难度大 |
| XGBoost | 35-58% | 特征工程是关键 |
滑动窗口模式:
更新次数: 3次 / 2年
平均准确率: 52.75%
夏普: 0.78 (略高于批量训练)
漂移检测模式:
检测到漂移: 2次
自动重训练: 2次
夏普: 0.82 (自适应效果更佳)
- 数据引擎 + 8大技术策略
- 机器学习框架(特征工程 + 标签生成)
- 4个ML模型 + 批量训练
- 在线学习框架(滑动窗口 + 漂移检测)🎉
- 多因子选股框架
- 参数自动优化
- 实盘接口 (QMT)
- LSTM/Transformer时序模型
- 强化学习策略
本系统仅供学习研究,不构成任何投资建议。股市有风险,投资需谨慎。