# 渠道多模型定价与路由策略

> 输入：渠道报价矩阵 + 预期毛利率 → 输出：渠道配置矩阵（分组归属、Priority、Weight）。

## 核心公式链

```
基准价[m] = median(各渠道对模型 m 的有效报价)
用户价[m] = round(基准价[m] ÷ (1 − 毛利率), 取整粒度)

分组卖价[m][g] = 用户价[m] × 分组倍率[g]
利润[渠道][模型][分组] = 分组卖价[模型][分组] − 渠道成本[渠道][模型]
利润 > 0 → 该 渠道×模型 可加入该分组

同 group + model 下：
  Priority: 按利润降序、三等分 → 3/2/1（值越大越优先）
  Weight:  同 Priority 层内，weight = round(100 × 利润 ÷ 层内最大利润)
```

---

## 一、输入

### 渠道报价矩阵（CSV）

一行一个上游渠道，一列一个模型。空白 = 该渠道不支持该模型。

```csv
渠道, M1, M2, M3, M4, M5, M6
甲, 8.0, 15.0, 12.0, 14.0, 13.0, 16.0
乙, 9.0, 10.0,, 11.0, 12.0,
丙, 11.0, 12.0, 13.0, 12.0,, 15.0
丁,, 9.0, 15.0, 13.0, 16.0, 12.0
戊, 10.0, 11.0, 14.0,, 9.0, 14.0
己, 12.0, 13.0, 10.0, 16.0, 11.0,
```

### 参数

| 参数 | 示例值 | 说明 |
|------|--------|------|
| 预期毛利率 `margin` | 0.2 | 利润 / 售价 |
| 分组倍率 | ce=0.9, hp=1.1 | 可自定义（ce < 1, hp > 1） |
| 取整粒度 | 0.5 | 用户价取整 |

---

## 二、计算（margin=0.2, ce=0.9, hp=1.1）

### Step 1: 基准价（内部分类用）

| 模型 | 有效报价 | 基准价 |
|------|---------|--------|
| M1 | 8, 9, 10, 11, 12 | **10.0** |
| M2 | 9, 10, 11, 12, 13, 15 | **11.5** |
| M3 | 10, 12, 13, 14, 15 | **13.0** |
| M4 | 11, 12, 13, 14, 16 | **13.0** |
| M5 | 9, 11, 12, 13, 16 | **12.0** |
| M6 | 12, 14, 15, 16 | **14.5** |

> 基准价是中位数（偶数个取中间两个均值），只用于内部价格分类，不对用户收费。

### Step 2: 用户价

`用户价 = 基准价 / (1−margin)`，取整到 0.5。

| 模型 | 基准价 | 计算值 | **用户价** |
|------|--------|--------|-----------|
| M1 | 10.0 | 12.50 | **12.5** |
| M2 | 11.5 | 14.38 | **14.5** |
| M3 | 13.0 | 16.25 | **16.0** |
| M4 | 13.0 | 16.25 | **16.0** |
| M5 | 12.0 | 15.00 | **15.0** |
| M6 | 14.5 | 18.13 | **18.0** |

### Step 3: 分组卖价

`分组卖价 = 用户价 × 分组倍率`

| 模型 | 用户价 | **ce (×0.9)** | **hp (×1.1)** |
|------|--------|---------------|---------------|
| M1 | 12.5 | **11.25** | **13.75** |
| M2 | 14.5 | **13.05** | **15.95** |
| M3 | 16.0 | **14.40** | **17.60** |
| M4 | 16.0 | **14.40** | **17.60** |
| M5 | 15.0 | **13.50** | **16.50** |
| M6 | 18.0 | **16.20** | **19.80** |

### Step 4: 利润判断 → 分组归属

`利润 = 分组卖价 − 渠道成本`。利润 > 0 → 入组。

**M1 示例**（ce=11.25, hp=13.75）：

| 渠道 | 成本 | ce 利润 | hp 利润 | 归属 |
|------|------|---------|---------|------|
| 甲 | 8.0 | **+3.25** ✓ | **+5.75** ✓ | ce, hp |
| 乙 | 9.0 | **+2.25** ✓ | **+4.75** ✓ | ce, hp |
| 戊 | 10.0 | **+1.25** ✓ | **+3.75** ✓ | ce, hp |
| 丙 | 11.0 | **+0.25** ✓ | **+2.75** ✓ | ce, hp |
| 己 | 12.0 | −0.75 ✗ | **+1.75** ✓ | hp |
| 丁 | — | — | — | 不支持 |

全部模型汇总：

| 渠道 | ce 归属模型 | hp 归属模型 |
|------|------------|------------|
| 甲 | M1 M3 M4 M5 M6 | M1 M2 M3 M4 M5 M6 |
| 乙 | M1 M2 M4 M5 | M1 M2 M4 M5 |
| 丙 | M1 M2 M3 M4 M6 | M1 M2 M3 M4 M6 |
| 丁 | M2 M4 M6 | M2 M3 M4 M5 M6 |
| 戊 | M1 M2 M3 M5 M6 | M1 M2 M3 M5 M6 |
| 己 | M2 M3 M5 | M1 M2 M3 M4 M5 |

> 甲对 M2 在 ce 组亏损（13.05−15.0=−1.95）→ 只进 hp。同理 M4 己-ce 亏损、M5 丁-ce 亏损等，均被自动剔除。

### Step 5: Priority 与 Weight

> 系统路由机制：同 `group × model` 下，渠道按 **Priority 降序**排列。优先层故障后才降级到下一层。**同 Priority 层内**按 Weight 加权随机分流。

**规则**：
- **Priority**：按利润降序排列，三等分 → 3（高利润）/ 2（中利润）/ 1（低利润兜底）。每层独立，高利润层整体故障才整体降级
- **Weight**：`max(1, round(100 × 利润 ÷ 该层最大利润))`

**M1 结果**：

| 组 | Pri | 渠道 | 利润 | Weight |
|----|-----|------|------|--------|
| ce | 3 | 甲 | 3.25 | 100 |
| ce | 2 | 乙 | 2.25 | 100 |
| ce | 1 | 戊 | 1.25 | 100 |
| ce | 1 | 丙 | 0.25 | 20 |
| hp | 3 | 甲 | 5.75 | 100 |
| hp | 2 | 乙 | 4.75 | 100 |
| hp | 1 | 戊 | 3.75 | 100 |
| hp | 1 | 丙 | 2.75 | 73 |
| hp | 1 | 己 | 1.75 | 47 |

---

## 三、输出：渠道配置矩阵

每个渠道按分组拆成独立条目（复用同一上游 key），绑定多个模型。条目的 Priority 和 Weight 取该条目所有 profitable 模型的**平均值**。

| 条目 | 上游Key | 分组 | 模型 | Pri | Wt |
|------|--------|------|------|-----|----|
| **甲-ce** | 甲 | cost-effective | M1,M3,M4,M5,M6 | 3 | 98 |
| **甲-hp** | 甲 | high-performance | M1,M2,M3,M4,M5,M6 | 3 | 100 |
| **乙-ce** | 乙 | cost-effective | M1,M2,M4,M5 | 2 | 63 |
| **乙-hp** | 乙 | high-performance | M1,M2,M4,M5 | 2 | 84 |
| **丙-ce** | 丙 | cost-effective | M1,M2,M3,M4,M6 | 2 | 75 |
| **丙-hp** | 丙 | high-performance | M1,M2,M3,M4,M6 | 2 | 82 |
| **丁-ce** | 丁 | cost-effective | M2,M4,M6 | 1 | 35 |
| **丁-hp** | 丁 | high-performance | M2,M3,M4,M5,M6 | 1 | 57 |
| **戊-ce** | 戊 | cost-effective | M1,M2,M3,M5,M6 | 2 | 58 |
| **戊-hp** | 戊 | high-performance | M1,M2,M3,M5,M6 | 2 | 72 |
| **己-ce** | 己 | cost-effective | M2,M3,M5 | 1 | 23 |
| **己-hp** | 己 | high-performance | M1,M2,M3,M4,M5 | 1 | 52 |

> 若同一条目内模型利润差异较大（如甲-hp 中 M2 利润 0.95 而 M6 利润 3.8），可拆分为多个条目获得更精确的 Priority/Weight 控制。

---

## 四、说明

### 分组设计

| 分组 | 倍率 | 含义 |
|------|------|------|
| **cost-effective** | 0.8~0.95 | 折扣组，需便宜上游才能在折扣下仍盈利 |
| **high-performance** | 1.05~1.2 | 溢价组，可接入更多渠道（含略贵的） |

> auto 不是独立倍率组：auto Key 的实付倍率 = 路由到的实际渠道所在组的倍率。

### Priority 分层的意义

单用 Weight 的缺陷：如果最高利润渠道挂掉，全部流量压到低 weight 渠道，低利润渠道可能被打崩。**Priority 分层**让高利润层整体故障时才整体降级，避免雪崩。

### 约束

- 每个模型在每组至少保留 **≥2 个渠道**（防单点故障）
- 调整倍率或毛利率后需重跑利润判断
- 利润率验证：ce 组最便宜渠道仍盈利 → `min_cost[m] < user_price[m] × ratio[ce]`

---

## 五、公式速查

| 步骤 | 公式 |
|------|------|
| 基准价 | `base[m] = median(cost[c][m] ∀ c 有报价)` |
| 用户价 | `price[m] = round( base[m] / (1−margin), grain )` |
| 分组卖价 | `sell[m][g] = price[m] × ratio[g]` |
| 入组判断 | `profit[c][m][g] = sell[m][g] − cost[c][m] > 0` |
| Priority | 按 profit 降序三等分 → 3/2/1，值越大越优先 |
| Weight | `max(1, round(100 × profit / max_in_tier))` |

---

## 六、代码工具

```bash
# 基础用法
python3 scripts/channel_pricing_plan.py prices.csv --margin 0.2

# 自定义分组倍率（ce, hp）
python3 scripts/channel_pricing_plan.py prices.csv --margin 0.2 --ratio 0.9 1.1

# 输出 Markdown + JSON
python3 scripts/channel_pricing_plan.py prices.csv --margin 0.2 --out plan.md --json plan.json

# 收益率口径：gross（毛利率=利润/售价）或 markup（加成率=利润/成本）
python3 scripts/channel_pricing_plan.py prices.csv --margin 0.2 --mode markup

# 自定义分组名称 + 取整粒度
python3 scripts/channel_pricing_plan.py prices.csv --margin 0.2 --groups ce hp --round 0.5
```

输入：渠道报价矩阵 CSV（空白 = 该渠道不支持该模型）。  
输出：Markdown 报告 + JSON（每个 渠道×模型×分组 的 group/priority/weight）。
