GRID_IMPLEMENTATION_PLAN.md 16 KB

微网格策略实施计划

版本: v1.0.0 日期: 2025-10 目标: 在现有架构基础上快速实现网格策略,作为剥头皮策略的替代/补充方案


总体策略

实施路径

M1.5 (MVP)        M2.5 (增强版)      M3.5 (混合策略)
   ↓                   ↓                   ↓
2-3 天            +1 周               +1-2 周
固定网格          自适应网格           网格+剥头皮
验证对冲          生产就绪             最大化收益

与现有里程碑的关系

M1 (核心骨架) → M1.5 (网格 MVP) → M2 (剥头皮) 或 M2.5 (增强网格)
                    ↓
                验证对冲架构
                    ↓
            若成功 → 继续优化网格
            若失败 → 修复对冲再做剥头皮

M1.5 – 网格策略 MVP(2-3 天)

目标

用最小代码量验证:

  1. 双账户对冲架构是否可行
  2. 资金费率是否真的对冲
  3. 对冲延迟是否可接受
  4. 网格策略是否有正 EV

范围

包含功能

  • ✅ 固定网格(不支持动态调整)
  • ✅ 单一标的(BTC)
  • ✅ 批量对冲(累积阈值触发)
  • ✅ 基础风控(max_base_abs 熔断)
  • ✅ 复用现有模块(OrderRouter, HedgeEngine, RiskEngine)

不包含功能

  • ❌ 趋势检测
  • ❌ 动态网格中心调整
  • ❌ 多标的支持
  • ❌ 复杂低波动处理
  • ❌ 自适应参数

交付清单

1. 核心模块

packages/strategies/gridMaker.ts(新建,约 200 行)

export interface GridConfig {
  symbol: string;
  gridStepBps: number;     // 网格间距(bps)
  gridRangeBps: number;    // 网格范围(bps)
  baseClipUsd: number;     // 单层订单大小(USD)
  maxLayers: number;       // 最大层数
  hedgeThresholdBase: number; // 对冲阈值
}

export interface GridLevel {
  index: number;           // 网格索引(正=卖单,负=买单)
  side: Side;
  px: number;
  orderId?: string;
  filled: boolean;
}

export class GridMaker {
  private grids: Map<number, GridLevel> = new Map();
  private currentDelta: number = 0;

  constructor(
    private config: GridConfig,
    private router: OrderRouter,
    private hedgeEngine: HedgeEngine,
    private shadowBook: ShadowBook
  ) {}

  // 初始化网格
  async initialize(): Promise<void>;

  // Fill 回调
  async onFill(fill: Fill): Promise<void>;

  // 重置网格(清除旧订单,重新布置)
  async reset(): Promise<void>;

  // 私有方法
  private async placeGridOrder(index: number, side: Side, px: number): Promise<string>;
  private findGridLevel(orderId: string): GridLevel | undefined;
  private updateDelta(fill: Fill): void;
}

功能点

  • initialize(): 在当前 mid 周围布置双边网格
  • onFill(): 成交后挂对手单,更新 Delta,检查对冲阈值
  • reset(): 撤销所有旧订单,重新布网格

2. 配置扩展

config/config.yaml 补充:

# 策略选择
strategy_mode: grid  # grid | scalper | both

# 网格策略配置
grid:
  enabled: true
  symbol: BTC
  grid_step_bps: 100   # 1%
  grid_range_bps: 400  # 4%
  base_clip_usd: 500
  max_layers: 4
  hedge_threshold_base: 0.3  # 累积 0.3 BTC 触发对冲

3. Runner 集成

apps/runner/src/index.ts 修改:

const cfg = parse(readFileSync("config/config.yaml","utf8"));

if (cfg.strategy_mode === 'grid' || cfg.strategy_mode === 'both') {
  const gridMaker = new GridMaker(
    cfg.grid,
    router,
    hedgeEngine,
    shadow
  );

  await gridMaker.initialize();

  // 监听 Fill 事件
  adapter.onFill((fill) => gridMaker.onFill(fill));
}

if (cfg.strategy_mode === 'scalper' || cfg.strategy_mode === 'both') {
  // 原有 Scalper 逻辑
}

4. 类型定义补充

packages/domain/src/types.ts 补充:

export interface GridLevel {
  index: number;
  side: Side;
  px: number;
  orderId?: string;
  filled: boolean;
  timestamp: number;
}

5. 测试用例

packages/strategies/__tests__/gridMaker.test.ts(新建)

describe('GridMaker', () => {
  it('should initialize grid orders correctly');
  it('should place opposite order on fill');
  it('should trigger hedge when delta exceeds threshold');
  it('should not exceed max_base_abs');
});

验收标准

功能验收

  • ✅ 网格初始化成功,双边各 N 层订单
  • ✅ 买单成交后,自动挂卖单在更高价
  • ✅ 卖单成交后,自动挂买单在更低价
  • ✅ Delta 累积到阈值,触发对冲
  • ✅ 对冲完成后,Delta 归零

性能验收

  • ✅ 初始化耗时 < 5s
  • ✅ Fill 处理延迟 < 500ms
  • ✅ 对冲触发延迟 < 1s

风控验收

  • ✅ |Delta| 始终 < max_base_abs
  • ✅ 单笔订单 sz < max_order_sz
  • ✅ Kill-switch 触发时,网格自动暂停

时间表

Day 1:
  - 实现 GridMaker 核心逻辑(initialize + onFill)
  - 配置扩展
  - Runner 集成

Day 2:
  - 测试用例
  - 本地模拟测试(mock adapter)
  - 修复 bug

Day 3:
  - 测试网小额测试(1-2 小时)
  - 观察指标:成交率、对冲延迟、Delta 控制
  - 文档更新

M2.5 – 增强版网格(+1 周)

目标

在 MVP 基础上,增加生产级功能,使其可长期稳定运行。

新增功能

1. 自适应网格中心调整

packages/strategies/gridMaker.ts 扩展:

class GridMaker {
  private gridCenter: number;  // 当前网格中心

  async onTimer() {
    const mid = this.shadowBook.mid();
    const deviation = Math.abs(mid - this.gridCenter) / this.gridCenter;

    if (deviation > this.config.recenterThresholdBps / 1e4) {
      logger.info(`Grid recenter triggered: deviation=${deviation}`);
      await this.reset();  // 撤旧单,以新 mid 为中心重新布网格
      this.gridCenter = mid;
    }
  }
}

配置

grid:
  adaptive_recenter:
    enabled: true
    recenter_threshold_bps: 200  # 偏离 2% 重置

2. 趋势检测与暂停

packages/strategies/trendFilter.ts(新建)

export class TrendFilter {
  private priceHistory: Array<{ts: number, price: number}> = [];

  isTrending(): boolean {
    if (this.priceHistory.length < this.config.lookbackPeriods) {
      return false;
    }

    const oldest = this.priceHistory[0].price;
    const latest = this.priceHistory[this.priceHistory.length - 1].price;
    const change = Math.abs(latest - oldest) / oldest;

    return change > this.config.trendThresholdBps / 1e4;
  }
}

集成到 GridMaker

async onTimer() {
  if (this.trendFilter.isTrending()) {
    logger.warn('Trend detected, pausing grid');
    await this.pause();  // 撤销所有挂单
    return;
  }

  // 正常逻辑...
}

配置

grid:
  trend_filter:
    enabled: true
    lookback_periods: 12  # 12 * 5min = 1h
    trend_threshold_bps: 50  # 1h 涨跌 > 0.5%

3. 低波动处理

packages/strategies/volatilityMonitor.ts(新建)

export class VolatilityMonitor {
  async checkDailyRange(): Promise<void> {
    const range = this.calc24hRange();

    if (range < this.config.minDailyRangeBps / 1e4) {
      logger.warn(`Low volatility detected: ${range}`);

      switch (this.config.action) {
        case 'notify':
          await this.sendAlert('Low volatility');
          break;
        case 'reduce_step':
          this.gridMaker.updateGridStep(0.5);  // 缩小到 0.5%
          break;
        case 'switch_strategy':
          await this.switchToMM();
          break;
      }
    }
  }
}

配置

grid:
  volatility_monitor:
    enabled: true
    min_daily_range_bps: 80
    action: notify  # notify | reduce_step | switch_strategy

4. 多标的支持

Runner 修改

const grids = new Map<string, GridMaker>();

for (const gridCfg of cfg.grid.symbols) {
  const gridMaker = new GridMaker(gridCfg, ...);
  await gridMaker.initialize();
  grids.set(gridCfg.symbol, gridMaker);
}

配置

grid:
  symbols:
    - symbol: BTC
      grid_step_bps: 100
      grid_range_bps: 400
    - symbol: ETH
      grid_step_bps: 120
      grid_range_bps: 500

5. 完整回测框架

packages/backtest/gridBacktest.ts(新建)

export class GridBacktest {
  async run(params: {
    symbol: string;
    startDate: Date;
    endDate: Date;
    gridConfig: GridConfig;
  }): Promise<BacktestResult> {
    // 事件重放
    // 模拟 Fill
    // 计算 PnL
    // 输出报告
  }
}

export interface BacktestResult {
  totalReturn: number;
  sharpeRatio: number;
  maxDrawdown: number;
  roundTrips: number;
  avgProfitPerRound: number;
  hedgeCost: number;
  fundingCost: number;
}

CLI

pnpm backtest:grid --symbol BTC --start 2024-08-01 --end 2024-10-31 --config config/grid_bt.yaml

交付清单

新增模块:
  - packages/strategies/trendFilter.ts (100 行)
  - packages/strategies/volatilityMonitor.ts (80 行)
  - packages/backtest/gridBacktest.ts (300 行)

扩展模块:
  - packages/strategies/gridMaker.ts (+150 行)
    - adaptive recenter
    - pause/resume
    - 多标的支持

配置:
  - config/config.yaml (新增 adaptive/trend/volatility 配置)
  - config/grid_backtest.example.yaml (新建)

测试:
  - packages/strategies/__tests__/trendFilter.test.ts
  - packages/strategies/__tests__/volatilityMonitor.test.ts
  - packages/backtest/__tests__/gridBacktest.test.ts

文档:
  - 更新 GRID_STRATEGY_DESIGN.md (v2.0 特性说明)
  - 新增 GRID_BACKTEST_GUIDE.md (回测使用指南)

验收标准

功能:
  - ✅ 网格自动重置触发准确率 > 90%
  - ✅ 趋势检测准确率 > 70%
  - ✅ 低波动告警及时性 < 30 分钟延迟
  - ✅ 多标的并行运行无冲突

性能:
  - ✅ 3 个标的同时运行,CPU < 30%
  - ✅ 内存占用 < 500MB

回测:
  - ✅ 回测月收益率 > 0.8%(震荡市数据)
  - ✅ Sharpe > 2.5
  - ✅ 最大回撤 < -2%

时间表

Week 1:
  Day 1-2: 自适应网格中心 + 趋势过滤器
  Day 3-4: 低波动监控 + 多标的支持
  Day 5: 回测框架核心逻辑
  Day 6: 回测报告与参数优化
  Day 7: 集成测试 + 文档更新

M3.5 – 混合策略(可选,+1-2 周)

目标

将网格与剥头皮策略结合,最大化收益。

架构设计

┌─────────────────────────────────────────┐
│       Strategy Coordinator              │
│  (优先级管理 + 冲突检测)                 │
└──────┬─────────────────────┬────────────┘
       │                     │
┌──────▼────────┐    ┌───────▼──────────┐
│  GridMaker    │    │  MicroScalper    │
│  (底层做市)   │    │  (极端信号叠加)  │
└───────────────┘    └──────────────────┘
       │                     │
       └──────────┬──────────┘
                  │
          ┌───────▼────────┐
          │  Order Router  │
          └────────────────┘

策略协调规则

class StrategyCoordinator {
  async submitIntent(intent: OrderIntent, source: 'grid' | 'scalper'): Promise<boolean> {
    // 1. 优先级检查
    if (source === 'scalper' && this.hasGridOrderAt(intent.px)) {
      logger.warn('Scalper intent conflicts with grid, rejecting');
      return false;
    }

    // 2. 方向冲突检查
    const existingIntent = this.getIntentAt(intent.symbol, intent.px);
    if (existingIntent && existingIntent.side !== intent.side) {
      logger.warn('Direction conflict, canceling lower priority');
      await this.cancel(existingIntent);
    }

    // 3. 通过检查,执行
    await this.router.sendLimitChild(intent.toOrder());
    return true;
  }
}

配置示例

strategy_mode: both

grid:
  enabled: true
  symbol: BTC
  grid_step_bps: 100
  grid_range_bps: 400
  priority: 1  # 高优先级

scalper:
  enabled: true
  trigger:
    spread_bps: 3.0  # 仅极端 spread 触发(避免与网格频繁冲突)
    min_cooldown_ms: 500
  tp_bps: 5
  sl_bps: 10
  max_clip_ratio: 0.2  # 仓位小于网格
  priority: 2  # 低优先级

strategy_coordinator:
  conflict_resolution: cancel_lower  # 冲突时取消低优先级

交付清单

新增:
  - packages/strategies/coordinator.ts (200 行)
    - 优先级管理
    - 冲突检测与解决
    - 意向订单队列

扩展:
  - packages/strategies/gridMaker.ts (+50 行)
    - 改为提交 intent 而非直接下单
  - packages/strategies/microScalper.ts (+50 行)
    - 改为提交 intent

配置:
  - config/config.yaml (新增 strategy_coordinator 配置)

测试:
  - packages/strategies/__tests__/coordinator.test.ts
    - 冲突检测准确性
    - 优先级执行顺序

验收标准

- ✅ 网格与剥头皮无自成交事件
- ✅ 冲突检测准确率 100%
- ✅ 混合策略月收益率 > 单一策略 20%
- ✅ Delta 控制依然有效(P95 < max_base_abs * 0.5)

风险评估与缓解

风险 1:网格表现不如预期(EV < 0)

缓解

  • M1.5 快速验证(2-3 天),失败成本低
  • 若失败,问题大概率在对冲架构而非策略
  • 修复对冲后,任何策略都能跑

风险 2:趋势市导致单边持仓

缓解

  • M1.5 有 max_base_abs 熔断
  • M2.5 增加趋势检测自动暂停
  • Kill-switch 作为最后保护

风险 3:资金费率双重支付

缓解

  • 标的筛选器(M4)拒绝 funding correlation < 0.8
  • 实时监控 funding_cost_net_bps
  • 超过阈值自动减仓

风险 4:开发资源分散

缓解

  • M1.5 仅 2-3 天,不影响主线(剥头皮)
  • 可并行开发:一人网格,一人剥头皮
  • 若网格验证失败,立即回归剥头皮

KPI 与监控

实时监控指标

网格特定指标:
  - grid_active_orders: 当前活跃网格订单数
  - grid_filled_orders_per_hour: 每小时成交次数
  - grid_recenter_count: 网格重置次数
  - grid_trend_pause_count: 趋势暂停次数
  - grid_round_trip_count: 往返成交次数
  - grid_avg_profit_per_round: 单次往返平均利润

复用现有指标:
  - delta_abs
  - hedge_success_rate
  - hedge_latency_p99
  - funding_cost_net_bps
  - pnl_intraday

告警规则

- grid_filled_orders_per_hour < 1 (持续 2 小时)
  → 告警:低成交率,检查波动率

- grid_recenter_count > 5 (单日)
  → 告警:频繁重置,可能趋势市

- grid_avg_profit_per_round < 0 (持续 1 小时)
  → 告警:负收益,检查手续费或对冲成本

- delta_abs > max_base_abs * 0.8
  → 告警:库存接近上限

与现有文档的整合

ARCHITECTURE_DESIGN.md 补充

在 3.10 策略层补充:

### GridMaker(可选策略)
- 在价格区间内均匀分布买卖订单,捕捉震荡市价差
- 买单成交 → 挂卖单;卖单成交 → 挂买单
- 批量对冲:Delta 累积到阈值触发
- 自适应调整:价格偏离时重置网格中心
- 趋势检测:单边行情时自动暂停

PRD 补充

在第 4 节策略设计后补充:

### 4.5 网格策略(备选方案)
- 适用场景:震荡市、高波动低趋势
- 收益模型:grid_step * 往返次数 - 手续费 - 对冲成本
- 优势:实现简单、对冲压力小、参数稳定
- 劣势:趋势市表现差、理论收益上限低

总结

推荐路径

1. 完成 M1(核心骨架)
   ↓
2. 用 2-3 天实现 M1.5(网格 MVP)
   ↓
3. 测试网验证 2-4 小时
   ↓
4. 若成功 → M2.5(增强网格)或 M2(剥头皮)
   若失败 → 修复对冲架构,再回到 M1.5

成功标准

M1.5 成功

  • 网格能稳定运行 24 小时
  • Delta 控制有效
  • 对冲成功率 > 95%
  • 月收益率 > 0.5%(即使低于预期,只要为正即算成功)

M2.5 成功

  • 月收益率 > 0.8%
  • Sharpe > 2.5
  • 可长期无人值守运行

下一步行动

  1. 立即开始 M1.5(若 M1 已完成)
  2. 2-3 天后决策:继续网格 or 切换剥头皮
  3. 保持灵活:两个策略不互斥,最终可能都实现

文档完成。代码实现见 CODE_DELIVERY_PLAN.md M1.5 & M2.5 章节。