# ETF轮动策略通用化重构方案 ## 一、重构目标与范围 ### 1.1 核心目标 **将现有轮动策略重构为通用量化框架**,支持: - ✅ 轮动策略(动量选股 + Top N) - ✅ 趋势跟踪策略(趋势因子 + 信号跟随) - ✅ 反转策略(反转因子 + 超买超卖) - ✅ 自定义策略扩展 ### 1.2 重构范围 | 模块 | 是否重构 | 重构内容 | 保持不变 | |------|----------|----------|----------| | **数据层** | ✅ 部分重构 | 添加DataSource抽象接口 | 混合数据源逻辑保留 | | **因子层** | ✅ 重构 | FactorBase抽象 + 注册器 + 组合器 | 因子计算逻辑保留 | | **信号层** | ✅ 重构 | SignalGenerator抽象(TopN/Trend/Reversal) | 选股逻辑迁移 | | **风控层** | ✅ 新增 | 回调钩子 + 风控组件库 | 无(原为分散化) | | **执行层** | ⚠️ 保持 | 回测引擎不变 | 回测逻辑完整保留 | | **报告层** | ⚠️ 保持 | KPI计算不变 | 可视化保留 | | **配置层** | ✅ 重构 | YAML配置驱动 | 参数结构保留 | --- ## 二、核心设计决策(需确认) ### 决策点1:因子抽象方式 **选项A:Freqtrade风格(方法内定义)** ```python def populate_indicators(self, dataframe): dataframe['momentum'] = calculate_momentum(dataframe, 25) dataframe['rsi'] = ta.RSI(dataframe, 14) return dataframe ``` - 优点:简单直观,与Freqtrade一致 - 缺点:因子不可复用,难以组合 **选项B:注册器风格(模块化)** ```python class MomentumFactor(FactorBase): def compute(self, data): return calculate_momentum(data, self.n_days) FactorRegistry.register(MomentumFactor) # 在策略中使用 factors = FactorCombiner([ FactorRegistry.get('momentum', n_days=25), FactorRegistry.get('volatility', period=20) ]) ``` - 优点:因子可复用、可组合、可插拔 - 缺点:复杂度略高 **建议**:**选择B(注册器风格)**,保持我们的模块化优势。 --- ### 决策点2:回调钩子范围 **参考Freqtrade的回调设计**: | 回调钩子 | 用途 | 是否需要 | |----------|------|----------| | `before_entry` | 入场前检查(溢价、崩盘) | ✅ 需要 | | `after_entry` | 入场后记录 | ⚠️ 可选 | | `before_exit` | 出场前检查 | ⚠️ 可选 | | `after_exit` | 出场后记录 | ⚠️ 可选 | | `dynamic_stoploss` | 动态止损 | ✅ 需要 | | `custom_exit` | 自定义出场条件 | ✅ 需要 | | `position_adjust` | DCA/部分止盈 | ❌ 不需要(轮动不适用) | **建议**:**实现5个核心回调**(before_entry, dynamic_stoploss, custom_exit, after_entry, after_exit)。 --- ### 册策点3:参数装饰器设计 **Freqtrade风格**: ```python class RotationStrategy: n_days = IntParameter(10, 60, default=25, space='factor') select_num = IntParameter(1, 5, default=3, space='signal') ``` **简化风格(无Hyperopt)**: ```python class RotationStrategy: n_days = 25 # 类属性,可被配置覆盖 select_num = 3 ``` **建议**:**先实现简化版(类属性 + 配置覆盖)**,后续再添加参数装饰器 + Hyperopt。 --- ### 决策点4:信号生成抽象 **选项A:统一SignalGenerator接口** ```python class SignalGenerator(ABC): def generate(self, factor_data: DataFrame) -> DataFrame class TopNSelector(SignalGenerator): def generate(self, factor_data): # Top N选股逻辑 class TrendFollower(SignalGenerator): def generate(self, factor_data): # 趋势跟随逻辑 ``` **选项B:策略直接生成信号** ```python class RotationStrategy: def generate_signals(self, data): # 直接在策略内生成 ``` **建议**:**选择A(统一SignalGenerator)**,信号逻辑可复用、可插拔。 --- ### 决策点5:执行模式支持 **Freqtrade支持**:backtest / hyperopt / dry / live **当前系统支持**:backtest only **需要添加**: - ✅ dry-run(模拟盘):验证策略逻辑 - ⚠️ live(实盘):需券商API对接 - ❌ hyperopt:后期添加 **建议**:**仅添加dry-run模式**,实盘执行器延后。 --- ## 三、分阶段实施路径 ### 阶段一:因子层抽象(P1,预估2天) **目标**:因子可插拔、可组合 **实施内容**: 1. 创建`FactorBase`抽象基类 2. 创建`FactorRegistry`注册器 3. 创建`FactorCombiner`组合器 4. 重构现有动量因子为`MomentumFactor` 5. 添加技术因子(`TrendFactor`, `ReversalFactor`) **验收标准**: - 因子可注册、可获取、可组合 - 现有轮动策略功能不变(回归测试) --- ### 阶段二:信号层抽象(P1,预估1天) **目标**:信号生成可插拔 **实施内容**: 1. 创建`SignalGenerator`抽象基类 2. 创建`TopNSelector`实现(迁移现有选股逻辑) 3. 创建`TrendFollower`实现 4. 创建`ReversalTrader`实现 **验收标准**: - 三种信号生成器可独立运行 - TopNSelector与原逻辑一致 --- ### 阶段三:回调钩子机制(P1,预估1天) **目标**:生命周期可控 **实施内容**: 1. 在`StrategyBase`中添加回调钩子定义 2. 实现`before_entry`回调(溢价过滤) 3. 实现`dynamic_stoploss`回调 4. 实现`custom_exit`回调 **验收标准**: - 回调可正常触发 - 溢价过滤生效 - 动态止损生效 --- ### 阶段四:配置驱动重构(P2,预估1天) **目标**:策略参数可配置 **实施内容**: 1. YAML配置结构设计 2. 配置加载与验证 3. 配置覆盖类属性 4. 策略工厂(根据配置创建策略) **验收标准**: - 可通过YAML配置运行策略 - 配置可覆盖策略默认参数 --- ### 阶段五:趋势/反转策略实现(P3,预估2-3天) **目标**:验证框架扩展性 **实施内容**: 1. 实现`TrendFollowStrategy` 2. 实现`ReversalStrategy` 3. 回测验证 **验收标准**: - 新策略可正常运行 - 回测报告正常生成 --- ## 四、预期收益与风险 ### 4.1 预期收益 | 维度 | 当前状态 | 重构后 | 提升 | |------|----------|--------|------| | **代码复用** | 因子/信号耦合 | 模块化复用 | 50%+ | | **策略扩展** | 仅轮动策略 | 支持3+策略类型 | - | | **参数调优** | 手动修改代码 | 配置驱动 | 效率提升 | | **风控灵活性** | 固定分散化 | 回调动态控制 | - | | **维护成本** | 多处修改 | 单点修改 | 降低50% | ### 4.2 风险评估 | 风险 | 等级 | 应对措施 | |------|------|----------| | **回归风险**:重构导致原有逻辑变化 | 🔴高 | 每阶段完成后运行回测验证 | | **性能风险**:抽象层增加性能损耗 | 🟡中 | 保持向量化计算,避免循环 | | **复杂度风险**:抽象层增加理解成本 | 🟡中 | 完善文档 + 示例代码 | | **时间风险**:预估时间不准 | 🟢低 | 分阶段验收,及时调整 | --- ## 五、关键架构图 ### 5.1 最终架构 ``` ┌─────────────────────────────────────────────────────────────┐ │ QuantStrategyFramework │ ├─────────────────────────────────────────────────────────────┤ │ │ │ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │ │ │ DataSource │ │ FactorLayer │ │ SignalLayer │ │ │ │ │ │ │ │ │ │ │ │ - HybridSrc │ │ - FactorBase │ │ - SignalGen │ │ │ │ - Tushare │ │ - Registry │ │ - TopN │ │ │ │ - YFinance │ │ - Combiner │ │ - Trend │ │ │ │ │ │ │ │ - Reversal │ │ │ └──────────────┘ └──────────────┘ └──────────────┘ │ │ │ │ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │ │ │ StrategyBase │ │ RiskLayer │ │ ExecLayer │ │ │ │ │ │ │ │ │ │ │ │ - populate_* │ │ - Callbacks │ │ - Backtest │ │ │ │ - 回调钩子 │ │ - StopLoss │ │ - DryRun │ │ │ │ │ │ - Position │ │ │ │ │ └──────────────┘ └──────────────┘ └──────────────┘ │ │ │ ├─────────────────────────────────────────────────────────────┤ │ Config (YAML驱动) │ ├─────────────────────────────────────────────────────────────┤ │ │ │ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │ │ │RotationStrat │ │ TrendStrat │ │ ReversalStrat│ │ │ │ │ │ │ │ │ │ │ │ 动量因子 │ │ 趋势因子 │ │ 反转因子 │ │ │ │ TopN选股 │ │ 趋势跟随 │ │ 反转交易 │ │ │ │ 回调过滤 │ │ 动态止损 │ │ 快速止损 │ │ │ └──────────────┘ └──────────────┘ └──────────────┘ │ │ │ └─────────────────────────────────────────────────────────────┘ ``` ### 5.2 因子层设计 ```python # 因子基类 class FactorBase(ABC): @abstractmethod def compute(self, data: DataFrame) -> Series @property @abstractmethod def name(self) -> str # 因子注册 FactorRegistry.register(MomentumFactor) FactorRegistry.register(TrendFactor) # 因子组合 factors = FactorCombiner([ FactorRegistry.get('momentum', n_days=25, weight=0.7), FactorRegistry.get('volatility', period=20, weight=0.3) ]) ``` ### 5.3 信号层设计 ```python # 信号生成器 class TopNSelector(SignalGenerator): def generate(self, factor_data): # 按因子值排序,选Top N class TrendFollower(SignalGenerator): def generate(self, factor_data): # 趋势强度 > 阈值 → 入场 class ReversalTrader(SignalGenerator): def generate(self, factor_data): # 超买超卖 → 反转信号 ``` ### 5.4 回调钩子设计 ```python class StrategyBase: # 入场前回调 def before_entry(self, code: str, price: float, **kwargs) -> bool: """可拒绝交易""" if kwargs.get('premium', 0) > 0.10: return False return True # 动态止损回调 def dynamic_stoploss(self, position: Position) -> float: """根据持仓时间调整止损""" if position.holding_days > 10: return -0.03 return -0.10 # 自定义出场回调 def custom_exit(self, position: Position) -> bool: """反转信号强制出场""" return False ``` --- ## 六、需确认事项清单 | 序号 | 决策点 | 选项 | 建议 | 你的选择 | |------|--------|------|------|----------| | 1 | 因子抽象方式 | A:方法内 / B:注册器 | **B** | ? | | 2 | 回调钩子范围 | 5个 / 7个 / 全部 | **5个核心** | ? | | 3 | 参数装饰器 | 简化版 / Freqtrade风格 | **先简化版** | ? | | 4 | 信号生成抽象 | 统一接口 / 策略内生成 | **统一接口** | ? | | 5 | 执行模式支持 | 仅backtest / +dry-run / +live | **+dry-run** | ? | | 6 | 实施优先级 | 全部实施 / 分阶段 | **分阶段** | ? | | 7 | 时间安排 | 立即开始 / 等待确认 | **等待确认** | ? | --- ## 七、下一步行动 **确认方案后,我将开始**: 1. 创建`FactorBase`抽象基类 2. 创建`FactorRegistry`注册器 3. 重构现有动量因子 4. 运行回测验证功能不变 **请确认以下内容**: - ✅ 重构范围是否合理 - ✅ 设计决策是否认可 - ✅ 实施路径是否可行 - ✅ 时间安排是否同意 --- *方案版本:V1.0* *生成时间:2026-05-08* *等待用户确认*