Files
etf/docs/ETF轮动策略通用化重构方案.md
aszerW c54ba442ad docs: 添加策略框架调研与设计方案
包含4份核心文档:
- 轮动策略系统架构分析报告
- 量化策略通用框架抽象设计
- Freqtrade架构调研与对比分析
- ETF轮动策略通用化重构方案

调研结论:三种策略可抽象通用框架
设计决策:因子注册器风格 + 5个核心回调钩子 + TopN/Trend/Reversal信号生成器
2026-05-11 22:17:41 +08:00

13 KiB
Raw Blame History

ETF轮动策略通用化重构方案

一、重构目标与范围

1.1 核心目标

将现有轮动策略重构为通用量化框架,支持:

  • 轮动策略(动量选股 + Top N
  • 趋势跟踪策略(趋势因子 + 信号跟随)
  • 反转策略(反转因子 + 超买超卖)
  • 自定义策略扩展

1.2 重构范围

模块 是否重构 重构内容 保持不变
数据层 部分重构 添加DataSource抽象接口 混合数据源逻辑保留
因子层 重构 FactorBase抽象 + 注册器 + 组合器 因子计算逻辑保留
信号层 重构 SignalGenerator抽象TopN/Trend/Reversal 选股逻辑迁移
风控层 新增 回调钩子 + 风控组件库 无(原为分散化)
执行层 ⚠️ 保持 回测引擎不变 回测逻辑完整保留
报告层 ⚠️ 保持 KPI计算不变 可视化保留
配置层 重构 YAML配置驱动 参数结构保留

二、核心设计决策(需确认)

决策点1因子抽象方式

选项AFreqtrade风格方法内定义

def populate_indicators(self, dataframe):
    dataframe['momentum'] = calculate_momentum(dataframe, 25)
    dataframe['rsi'] = ta.RSI(dataframe, 14)
    return dataframe
  • 优点简单直观与Freqtrade一致
  • 缺点:因子不可复用,难以组合

选项B注册器风格模块化

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风格

class RotationStrategy:
    n_days = IntParameter(10, 60, default=25, space='factor')
    select_num = IntParameter(1, 5, default=3, space='signal')

简化风格无Hyperopt

class RotationStrategy:
    n_days = 25  # 类属性,可被配置覆盖
    select_num = 3

建议先实现简化版(类属性 + 配置覆盖),后续再添加参数装饰器 + Hyperopt。


决策点4信号生成抽象

选项A统一SignalGenerator接口

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策略直接生成信号

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 因子层设计

# 因子基类
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 信号层设计

# 信号生成器
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 回调钩子设计

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 等待用户确认