# 微网格策略实施计划

**版本**: 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 行）
```typescript
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`** 补充：
```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`** 修改：
```typescript
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`** 补充：
```typescript
export interface GridLevel {
  index: number;
  side: Side;
  px: number;
  orderId?: string;
  filled: boolean;
  timestamp: number;
}
```

#### 5. 测试用例

**`packages/strategies/__tests__/gridMaker.test.ts`**（新建）
```typescript
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 触发时，网格自动暂停

### 时间表

```yaml
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`** 扩展：
```typescript
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;
    }
  }
}
```

**配置**：
```yaml
grid:
  adaptive_recenter:
    enabled: true
    recenter_threshold_bps: 200  # 偏离 2% 重置
```

#### 2. 趋势检测与暂停

**`packages/strategies/trendFilter.ts`**（新建）
```typescript
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**：
```typescript
async onTimer() {
  if (this.trendFilter.isTrending()) {
    logger.warn('Trend detected, pausing grid');
    await this.pause();  // 撤销所有挂单
    return;
  }

  // 正常逻辑...
}
```

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

#### 3. 低波动处理

**`packages/strategies/volatilityMonitor.ts`**（新建）
```typescript
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;
      }
    }
  }
}
```

**配置**：
```yaml
grid:
  volatility_monitor:
    enabled: true
    min_daily_range_bps: 80
    action: notify  # notify | reduce_step | switch_strategy
```

#### 4. 多标的支持

**Runner 修改**：
```typescript
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);
}
```

**配置**：
```yaml
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`**（新建）
```typescript
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**：
```bash
pnpm backtest:grid --symbol BTC --start 2024-08-01 --end 2024-10-31 --config config/grid_bt.yaml
```

### 交付清单

```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 (回测使用指南)
```

### 验收标准

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

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

回测：
  - ✅ 回测月收益率 > 0.8%（震荡市数据）
  - ✅ Sharpe > 2.5
  - ✅ 最大回撤 < -2%
```

### 时间表

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

---

## M3.5 – 混合策略（可选，+1-2 周）

### 目标
将网格与剥头皮策略结合，最大化收益。

### 架构设计

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

### 策略协调规则

```typescript
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;
  }
}
```

### 配置示例

```yaml
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  # 冲突时取消低优先级
```

### 交付清单

```yaml
新增：
  - 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
    - 冲突检测准确性
    - 优先级执行顺序
```

### 验收标准

```yaml
- ✅ 网格与剥头皮无自成交事件
- ✅ 冲突检测准确率 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 与监控

### 实时监控指标

```yaml
网格特定指标：
  - 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
```

### 告警规则

```yaml
- 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 策略层补充：
```markdown
### GridMaker（可选策略）
- 在价格区间内均匀分布买卖订单，捕捉震荡市价差
- 买单成交 → 挂卖单；卖单成交 → 挂买单
- 批量对冲：Delta 累积到阈值触发
- 自适应调整：价格偏离时重置网格中心
- 趋势检测：单边行情时自动暂停
```

### PRD 补充

在第 4 节策略设计后补充：
```markdown
### 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 章节。
