# ETF Rotation **Repository Path**: hkcodex/etf-rotation ## Basic Information - **Project Name**: ETF Rotation - **Description**: 基于 RSRS 斜率动量的ETF轮动本地化示例 - **Primary Language**: Python - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: https://gitee.com/hkcodex/etf-rotation - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 3 - **Created**: 2025-12-05 - **Last Updated**: 2025-12-20 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # ETF 轮动回测工具 基于 RSRS 斜率动量的简单 ETF 轮动示例。项目包含两个脚本:一个按日选择需要持有的 ETF,另一个使用 Backtrader 对持仓序列进行回测。 ![backtesting](images/backtesting.png) ## 环境要求 - Python 3.9(与 `hkcodex.cp39-win_amd64.pyd` 对应) - 已编译好的 `hkcodex` 扩展(仓库根目录提供)。 ## 运行环境安装 ### 使用 pip 1. 安装 Python 3.9(目前仅支持 3.9)。 2. 安装依赖: ```bash pip install -r requirements/requirements.txt ``` 如果是在内地,可用清华镜像源安装: ```bash pip install -r requirements/requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple ``` ### 使用 conda 直接运行: ```bash conda env create -f requirements/environment.yml ``` 如果是在内地,可用清华镜像源安装: ```bash conda env create -f requirements/environment_m.yml ``` 命令会自动创建名为 hkcodex 的 conda 环境,Python 版本为 3.9,并安装全部依赖。 ## 目录结构 - `ETF_rotation_selection.py`:根据行情数据计算每日应持有的 ETF,并保存到 `ETF轮动/日期.txt` - `ETF_rotation_backtesting.py`:读取上述持仓结果,用 Backtrader 复现交易并输出统计 - `hkcodex.cp39-win_amd64.pyd`:自定义行情与工具库 ## 使用流程 1) **配置参数** - 两个脚本中的 `start_date`、`end_date` 要一致。 - 在 `ETF_rotation_selection.py` 内可调整:回归窗口 `reg_num`、候选 ETF 列表 `etf_libs`。 - 在 `ETF_rotation_backtesting.py` 内可调整:初始资金 `startcash`、持仓只数 `g.stk_num`、手续费滑点等。 2) **生成每日持仓** ```bash python ETF_rotation_selection.py ``` 作用: - 自动获取区间内(并向前外推 `reg_num` 天)的行情数据; - 计算每只 ETF 的年化收益斜率 × 拟合优度得分; - 每个交易日选择得分最高的 ETF,存储到 `ETF轮动/<交易日>.txt`。 3) **回测** ```bash python ETF_rotation_backtesting.py ``` 作用: - 读取 `ETF轮动` 目录中的每日持仓; - 使用 Backtrader 按开盘价调仓(先卖后买,按可用资金 98% 下单,100 股整数); - 输出: - `ETF轮动_portfolio.csv`:每日持仓、现金和资产净值记录; - `hx.analyzer(...)` 返回的绩效指标与图表(图名为策略名 `ETF轮动`)。 ## 策略逻辑简述 - 对每只候选 ETF 的 `reg_num` 日对数收盘价做线性回归,取斜率并年化; - 以决定系数 `R²` 调整动量得分:`score = annualized_returns * R²`; - 每个交易日持有得分最高的 ETF(`g.stk_num=1` 时只持一只); - 回测使用 `cheat_on_open=True`,在开盘价调仓,含极低手续费和滑点。 ## 可选调整 - 修改 `etf_libs` 以替换或增加候选 ETF。 - 提高 `g.stk_num` 以同时持有多只最高分 ETF(需同步扩展 CSV 列逻辑)。 - 根据实盘/回测需求调节手续费、滑点与仓位占比。 ## 常见问题 - **没有生成持仓文件**:确认 `ETF轮动` 目录可写,且 `hkcodex` 能正常返回行情。 - **回测报错找不到文件**:需先运行选股脚本,确保 `ETF轮动/<交易日>.txt` 存在且日期与回测区间一致。 - **依赖缺失**:`pip install pandas numpy backtrader`;`hkcodex` 已随仓库提供的 `pyd`。 ## 社区与交流 微信公众号推文里的相关代码都会提供在知识星球里,包括本地策略代码、接口、回测、测试等,欢迎加入交流。 ![hkcodex知识星球](images/zsxq.jpg) ![微信公众号](images/wxgzh.png) ![微信](images/wx.jpg) ## 许可证 本项目采用 [Apache License 2.0](LICENSE)。