d0a9d66a11501139b40225686fac4d97cbeb4107
讨论背景: - 159980.SZ(有色ETF)是商品型基金,跟踪上期所有色金属期货价格指数 - 应使用期货价格(CU.SHF沪铜)作为信号源,与黄金(AU.SHF)/原油(CL.NYM)保持一致 - 上证红利(000015.SH)与中证红利低波(H30269.CSI)高度相关,同属A股大类 在diversified模式下只能选1个,保留两个无实际意义 配置变更: - rotation.yaml: 新增CU.SHF→159980.SZ映射(market=COMMODITY) - rotation.yaml: 移除000015.SH上证红利(与红利低波冗余) - hybrid_source.py: FUTURES_CODE_MAP新增CU.SHF铜期货 - ab_test_iterations.py: 同步更新有色market为COMMODITY 实证结果 - CU.SHF加入前后对比(11只池,2019-2026): 无CU(11只): CAGR=47.37%, Sharpe=2.25, MaxDD=-17.86%, Calmar=2.65 含CU(12只): CAGR=46.16%, Sharpe=2.21, MaxDD=-17.86%, Calmar=2.58 影响: CAGR-1.2%, 商品大类内部竞争加剧(黄金/原油/有色三选一) 2020/2022铜价暴涨时有色贡献额外收益,整体影响很小 实证结果 - 移除上证红利后(11只,2019-2026): 含上证红利: CAGR=46.16%, Sharpe=2.21, MaxDD=-17.86%, Calmar=2.58 移除后: CAGR=46.42%, Sharpe=2.22, MaxDD=-17.33%, Calmar=2.68 所有指标均改善,消除冗余标的提升选择效率 实证结果 - diversified=true vs false(11只,select_num=3): true(跨类分散): CAGR=46.45%, Sharpe=2.22, MaxDD=-17.33%, Calmar=2.68 false(纯Top3): CAGR=44.19%, Sharpe=2.13, MaxDD=-18.12%, Calmar=2.44 关键差异在2022年(+17.63%): false模式选3只商品同时回调 结论: diversified=true全面优于false,保持当前配置 最终候选池(11只,7大类): A股: 创业板(399006.SZ), 红利低波(H30269.CSI) 美股: 纳指100(NDX) | 日本: 日经225(N225) | 欧洲: 德国DAX(GDAXI) 港股: 恒生指数(HSI), 恒生科技(HSTECH.HK) 商品: 黄金(AU.SHF), 原油(CL.NYM), 有色金属(CU.SHF) 固收: 30年国债(931862.CSI)
ETF轮动策略系统
基于多因子动量的ETF轮动量化交易系统,支持多市场数据(A股/港股/美股/加密货币),提供回测分析、定时调度和自动通知功能。
架构设计
┌─────────────────────────────────────────────────────────────────────────────┐
│ 应用层 (Applications) │
├─────────────────────────────────────────────────────────────────────────────┤
│ ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐ │
│ │ run_rotation │ │ daily_scheduler │ │ test_chart │ │
│ │ (回测入口) │ │ (定时调度) │ │ (图表测试) │ │
│ └────────┬────────┘ └────────┬────────┘ └─────────────────┘ │
└───────────┼────────────────────┼──────────────────────────────────────────────┘
│ │
▼ ▼
┌─────────────────────────────────────────────────────────────────────────────┐
│ 策略层 (Strategies) │
├─────────────────────────────────────────────────────────────────────────────┤
│ ┌─────────────────────────────────────────────────────────────────────┐ │
│ │ ETF Rotation Strategy │ │
│ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ ┌───────────┐ │ │
│ │ │ Engine │ │ Report │ │ Portfolio │ │ Signal │ │ │
│ │ │ (回测引擎) │ │ (报告生成) │ │ (持仓跟踪) │ │ (信号生成) │ │ │
│ │ └─────────────┘ └─────────────┘ └─────────────┘ └───────────┘ │ │
│ └─────────────────────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────────────────────┐
│ 核心层 (Core) │
├─────────────────────────────────────────────────────────────────────────────┤
│ ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐ │
│ │ Data Sources │ │ Factors │ │ Utils │ │
│ │ ┌───────────┐ │ │ ┌───────────┐ │ │ ┌───────────┐ │ │
│ │ │ Tushare │ │ │ │ Momentum │ │ │ │ Metrics │ │ │
│ │ │ (A股指数) │ │ │ │ (动量因子) │ │ │ │ (绩效计算) │ │ │
│ │ ├───────────┤ │ │ └───────────┘ │ │ └───────────┘ │ │
│ │ │ YFinance │ │ │ │ │ │ │
│ │ │ (港美加密) │ │ │ ┌───────────┐ │ │ ┌───────────┐ │ │
│ │ ├───────────┤ │ │ │ CCI │ │ │ │ Chart │ │ │
│ │ │SSH Tunnel │ │ │ │ (CCI因子) │ │ │ │ (图表绘制) │ │ │
│ │ │(代理支持) │ │ │ └───────────┘ │ │ └───────────┘ │ │
│ │ └───────────┘ │ │ │ │ │ │
│ └─────────────────┘ └─────────────────┘ └─────────────────┘ │
└─────────────────────────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────────────────────┐
│ 基础设施层 (Infrastructure) │
├─────────────────────────────────────────────────────────────────────────────┤
│ ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐ │
│ │ Notification │ │ OSS Storage │ │ Database │ │
│ │ ┌───────────┐ │ │ ┌───────────┐ │ │ ┌───────────┐ │ │
│ │ │ DingTalk │ │ │ │ Aliyun │ │ │ │ PostgreSQL│ │ │
│ │ │ (钉钉) │ │ │ │ OSS │ │ │ │ │ │ │
│ │ └───────────┘ │ │ └───────────┘ │ │ └───────────┘ │ │
│ └─────────────────┘ └─────────────────┘ └─────────────────┘ │
└─────────────────────────────────────────────────────────────────────────────┘
核心特性
1. 多市场数据支持
- A股指数: 通过 Tushare 获取沪深300、中证500等17只指数
- 港股/美股/加密货币: 通过 YFinance 获取恒生科技、纳斯达克、BTC、ETH等
- 交易日历对齐: 以A股交易日为基准,非A股市场数据前向填充
2. 混合数据源架构
# config/strategies/rotation.yaml
ssh_tunnel:
enabled: true
host: "x.x.x.x" # 阿里云香港ECS
key_path: "hk_ecs.pem" # SSH私钥(相对路径)
data_source:
china_indices: "tushare"
global_indices: "yfinance"
3. 定时调度系统
# 本地运行
python scripts/daily_scheduler.py
# Docker运行
docker run -d --name etf-scheduler \
-v $(pwd)/hk_ecs.pem:/app/hk_ecs.pem:ro \
192.168.0.115:5000/etf-scheduler:latest
4. 自动报告通知
- 策略绩效对比表格(转置布局)
- 最新调仓信号(支持调入/调出/维持标记)
- 净值曲线、回撤分析、持仓分布
- 钉钉图文推送(OSS图床)
项目结构
.
├── config/
│ └── strategies/
│ └── rotation.yaml # 策略配置(code_list/benchmark/SSH等)
├── core/
│ ├── common/
│ │ ├── notify.py # 钉钉通知
│ │ ├── oss_utils.py # 阿里云OSS
│ │ └── utils.py # 通用工具
│ ├── data/
│ │ ├── hybrid_source.py # 混合数据源(Tushare+YFinance)
│ │ └── yfinance_source.py # YFinance数据源
│ └── factors/
│ ├── momentum.py # 动量因子计算
│ └── cci.py # CCI因子计算
├── strategies/
│ └── rotation/
│ ├── engine.py # 回测引擎
│ ├── report.py # 报告生成
│ ├── portfolio.py # 持仓跟踪
│ └── signal.py # 信号生成
├── scripts/
│ ├── run_rotation.py # 回测入口
│ └── daily_scheduler.py # 定时调度
├── Dockerfile # 应用镜像
├── Dockerfile_base # 基础镜像
├── build-and-push.sh # 构建脚本
└── docker-compose.yml # 部署配置
快速开始
1. 环境配置
# 创建 .env 文件
cp .env.example .env
# 编辑配置
vim .env
2. 本地运行
# 安装依赖
pip install -r requirements.txt
# 运行回测
python scripts/run_rotation.py
# 定时调度
python scripts/daily_scheduler.py --run-now
3. Docker部署
# 构建并推送
./build-and-push.sh etf-scheduler
# 运行容器
docker-compose up -d
配置说明
rotation.yaml
# 标的配置(字典格式)
code_list:
"000300.SH": "沪深300"
"HSTECH": "恒生科技"
"BTC": "比特币"
# 基准配置
benchmark:
code: "000300.SH"
name: "沪深300指数"
# SSH隧道(用于YFinance)
ssh_tunnel:
enabled: true
host: "your-ecs-ip"
key_path: "hk_ecs.pem"
# 回测参数
start_date: "2020-01-01"
factor_type: "slope_r2"
select_num: 5
rebalance_days: 1
技术栈
- Python 3.12: 核心语言
- Pandas/NumPy: 数据处理
- Matplotlib: 图表绘制
- Tushare/YFinance: 金融数据
- Schedule: 定时任务
- Docker: 容器化部署
- OSS: 图片存储
- DingTalk: 消息通知
Description
Languages
Python
97.5%
HTML
1.9%
Shell
0.6%