基于广发证券《交易性择时策略研究之十五:125个经典技术指标择时分析》的量化策略实现
本项目实现了广发证券研报中的8个经典技术指标择时策略,支持双指数对比回测(沪深300 & 创业板指数)。
| 序号 | 策略名称 | 指标类型 | 状态 |
|---|---|---|---|
| 1 | VWAP | 量价指标 | ✅ 已完成 |
| 2 | DPO | 趋势指标 | ✅ 已完成 |
| 3 | ER (Elder Ray) | 动量指标 | ✅ 已完成 |
| 4 | TII | 趋势强度指标 | ✅ 已完成 |
| 5 | PO | 价格震荡指标 | ✅ 已完成 |
| 6 | MADisplaced | 趋势指标 | ✅ 已完成 |
| 7 | MAAMT | 量价指标 | ✅ 已完成 |
| 8 | SuperTrend | 趋势跟踪指标 | ✅ 已完成 |
- 沪深300指数:主要回测标的(2005-2019)
- 创业板指数:2025年至今对比回测
- 同时展示两个指数的策略表现
- 数据获取:akshare免费数据源
- 信号生成:严格按照广发研报逻辑
- 收益计算:避免未来函数
- 指标评估:20+项核心指标
- 累计收益曲线对比图
- 策略指标对比表格(3/4/5列动态布局)
- 简洁专业的图表风格
公众号/
├── code/
│ ├── vwap_strategy.py # VWAP择时策略
│ ├── dpo_strategy.py # DPO择时策略
│ ├── er_strategy.py # ER择时策略
│ ├── tii_strategy.py # TII择时策略
│ ├── po_strategy.py # PO择时策略
│ ├── madisplaced_strategy.py # MADisplaced择时策略
│ ├── maamt_strategy.py # MAAMT择时策略
│ ├── supertrend_strategy.py # SuperTrend择时策略
│ ├── get_data.py # 数据获取工具
│ └── requirements.txt # Python依赖包
├── articles/ # 研报资料
└── README.md # 项目说明
cd code
pip install -r requirements.txt- pandas: 数据处理
- numpy: 数值计算
- matplotlib: 可视化
- akshare: A股数据获取(免费)
cd code
python vwap_strategy.py # VWAP策略
python dpo_strategy.py # DPO策略
python er_strategy.py # ER策略
python tii_strategy.py # TII策略
python po_strategy.py # PO策略
python madisplaced_strategy.py # MADisplaced策略
python maamt_strategy.py # MAAMT策略
python supertrend_strategy.py # SuperTrend策略from vwap_strategy import backtest_vwap_strategy
# 运行回测(包含2025年双指数对比)
df, metrics = backtest_vwap_strategy(
start_date='20050408',
end_date='20191223',
period=20,
include_2025=True # 启用2025年双指数对比
)- ✅ 详细的回测过程日志
- ✅ 完整的策略评价指标
- ✅ 与广发研报的对比
- ✅ 2025年双指数回测结果
文件名: {strategy}_backtest.png
布局(上下结构):
- 上方:累计收益曲线对比图
- 策略收益 vs 基准指数
- 清晰的趋势展示
- 下方:策略指标对比表格
- 本次回测 vs 广发研报
- 2025沪深300 vs 2025创业板指
每个策略生成3个CSV文件:
{strategy}_results.csv- 主回测详细数据{strategy}_results_2025_hs300.csv- 2025沪深300回测{strategy}_results_2025_cyb.csv- 2025创业板指回测
指标公式:
Typical = (HIGH + LOW + CLOSE) / 3
MF = VOLUME × Typical
VWAP = SUM(MF, N) / SUM(VOLUME, N)
信号规则:
- 买入:收盘价上穿VWAP
- 卖出:收盘价下穿VWAP
广发研报结果(2005-2019):
- 累积收益率:1967.90%
- 年化收益率:23.84%
- 最大回撤:-34.11%
- 胜率:27.53%
- 盈亏比:4.99
指标公式:
DPO = CLOSE - REF(MA(CLOSE, N), N/2+1)
信号规则:
- 买入:DPO上穿0线
- 卖出:DPO下穿0线
广发研报结果(2005-2019):
- 累积收益率:2143.12%
- 年化收益率:24.37%
指标公式:
BullPower = HIGH - EMA(CLOSE, N)
BearPower = LOW - EMA(CLOSE, N)
信号规则:
- 买入:BullPower > 0 且 BearPower > 前值
- 卖出:BearPower < 0 且 BullPower < 前值
趋势强度指标,衡量价格趋势的强度。
价格震荡指标,通过两条EMA的差值判断趋势。
移动平均位移指标,提前预判趋势变化。
基于成交金额的移动平均策略。
基于ATR的趋势跟踪指标,动态止损。
| 指标 | 说明 |
|---|---|
| 交易次数 | 买入+卖出信号总数 |
| 完整交易对数 | 买卖配对后的交易对数 |
| 盈利交易对数 | 盈利的交易对数 |
| 判断正确率 | 盈利对数 / 总对数 |
| 盈亏比 | 平均盈利 / 平均亏损 |
| 累积收益率 | 期间总收益(复利) |
| 年化收益率 | 年化后的收益率 |
| 最大回撤 | 最大跌幅 |
| 波动率 | 收益率的年化标准差 |
| 信息比 | 超额收益质量 |
-
数据获取
- 使用akshare获取沪深300/创业板指数数据
- 支持自定义时间区间
-
指标计算
- 严格按照广发研报公式实现
- 滚动窗口计算
-
信号生成
- 识别上穿/下穿动作
- 避免未来函数
-
收益计算
- 使用shift(1)避免前视偏差
- 复利计算累计收益
-
指标评估
- 计算20+项核心指标
- 与广发研报对比
# 信号生成(以VWAP为例)
for i in range(1, len(df)):
# 上穿:前一日≤VWAP,今日>VWAP
if df['close'].iloc[i-1] <= df['vwap'].iloc[i-1] and \
df['close'].iloc[i] > df['vwap'].iloc[i]:
df.loc[df.index[i], 'signal'] = 1 # 买入
# 下穿:前一日≥VWAP,今日<VWAP
elif df['close'].iloc[i-1] >= df['vwap'].iloc[i-1] and \
df['close'].iloc[i] < df['vwap'].iloc[i]:
df.loc[df.index[i], 'signal'] = -1 # 卖出
# 收益计算(避免未来函数)
df['strategy_returns'] = df['returns'] * df['position'].shift(1)- 使用akshare(新浪财经)免费数据
- 与广发研报数据源可能有差异
- 结果略有不同属于正常
- 不考虑交易成本和滑点
- 不考虑停牌和涨跌停限制
- 使用收盘价成交假设
- 历史回测≠未来收益
- 本项目仅供学习研究
- 不构成任何投资建议
- 实盘交易请谨慎
- 注意风险控制
修改策略文件中的main()函数参数。
- 沪深300:sh000300
- 创业板指:sz399006
- 上证指数:sh000001
- 深证成指:sz399001
- 检查网络连接
- 更新akshare:
pip install --upgrade akshare - 稍后重试
- 数据源不同
- 除权除息处理方式不同
- 计算精度差异
- ±10%的差异属于正常范围
- ✅ 新增7个策略(DPO, ER, TII, PO, MADisplaced, MAAMT, SuperTrend)
- ✅ 支持双指数对比(沪深300 & 创业板指)
- ✅ 修复VWAP策略缩进错误
- ✅ 优化可视化表格布局(3/4/5列动态显示)
- ✅ 统一代码风格和注释
- ✅ 作者信息更新为kevin
- 改为上下布局
- 表格字体和行高优化
- 修正信号生成逻辑(上穿/下穿)
- 修正收益计算(避免未来函数)
- 完成VWAP策略实现
Kevin
如有问题或建议,欢迎提Issue!
本项目仅供学习研究使用,不构成任何投资建议。
⭐ 如果这个项目对您有帮助,欢迎Star支持!