> **报价矩阵 + 收益率 → 用户价 + 分组倍率 + 渠道配置矩阵**
>
> 报价矩阵告诉平台「成本是多少」，收益率告诉平台「想赚多少」。两者结合定用户价，其余（CE 倍率、HP 倍率、分组归属、Priority、Weight）全部自动推导。

```
┌───────────────┐                              ┌────────────────────┐
│  输入          │                              │  输出               │
│               │    ┌──────────────────────┐  │                    │
│  ① 报价矩阵   │    │  算法                 │  │  · 用户价表        │
│    (CSV)      │    │                      │  │  · 分组倍率        │
│               │ ──→│  1 用户价            │ ──→│  · 渠道配置矩阵    │
│  ② 收益率     │    │  2 CE 倍率（矩阵推导）│  │    (分组/Pri/Wt)   │
│    (markup)   │    │  3 HP 倍率（溢价默认）│  │                    │
│               │    │  4 分组归属（利润>0） │  │                    │
│               │    │  5 Priority（三等分） │  │                    │
│               │    │  6 Weight（利润占比） │  │                    │
└───────────────┘    └──────────────────────┘  └────────────────────┘
```

---

## 一、输入

本方案有两个输入：**报价矩阵**（事实输入）和**收益率**（战略输入）。

### 1.1 报价矩阵（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,
```

### 1.2 收益率（加成率）

平台的目标利润率，决定用户价高度。

```
用户价 = 中位成本 × (1 + 收益率)
```

| 收益率 | 风格 | 效果 |
|--------|------|------|
| 0.20 | 保守 | 用户价低，竞争力强，利润薄 |
| **0.25** | **行业标准** | **API 转售标准（本文默认）** |
| 0.35 | 激进 | 用户价高，利润厚，可能流失价格敏感用户 |

> 收益率无法从上游成本推导——它是平台的商业决策。

### 1.3 结构性默认（一般无需修改）

| 参数 | 默认值 | 说明 |
|------|--------|------|
| HP 溢价 `hp_premium` | 0.10 | HP 倍率 = 1 + 溢价 |
| CE 冗余 `min_redundancy` | 3 | CE 组每模型至少 N 个盈利渠道 |
| CE 缓冲 `ce_buffer` | 0.03 | CE 下限之上加 3% 安全余量 |
| 取整粒度 | 0.5 | 用户价取整到最近的 0.5 |

---

## 二、算法

> 以下以收益率 = 0.25、HP 溢价 = 0.10、N = 3 为例，逐步演示。

### Step 1 · 用户价

`用户价 = 中位成本 × (1 + 收益率)`，取整到 0.5。

| 模型 | 中位成本 | 计算值 | **用户价** |
|------|---------|--------|-----------|
| M1 | 10.0 | 12.50 | **12.5** |
| M2 | 11.5 | 14.38 | **14.5** |
| M3 | 13.0 | 16.25 | **16.5** |
| M4 | 13.0 | 16.25 | **16.5** |
| M5 | 12.0 | 15.00 | **15.0** |
| M6 | 14.5 | 18.13 | **18.0** |

### Step 2 · CE 倍率（由矩阵推导）

保证折扣后每模型至少 N 个渠道仍盈利：

```
ce_ratio ≥ max(第N便宜成本[m] ÷ 用户价[m])  for all models m
```

| 模型 | 用户价 | 成本排序 | 第 3 便宜 | 下限 |
|------|--------|---------|----------|------|
| M1 | 12.5 | 8, 9, 10, 11, 12 | 10.0 | 0.80 |
| M2 | 14.5 | 9, 10, 11, 12, 13, 15 | 11.0 | 0.76 |
| M3 | 16.5 | 10, 12, 13, 14, 15 | 13.0 | 0.79 |
| M4 | 16.5 | 11, 12, 13, 14, 16 | 13.0 | 0.79 |
| M5 | 15.0 | 9, 11, 12, 13, 16 | 12.0 | 0.80 |
| M6 | 18.0 | 12, 14, 15, 16 | 15.0 | **0.83** |

> CE 下限 = max(各模型下限) = **0.83**，+3% 缓冲 → **CE = 0.86**

### Step 3 · HP 倍率（溢价默认）

```
HP = 1 + 10% 溢价 = 1.1
```

10% 是高性能档的行业惯例溢价——太小分组无意义，太大用户流失。

### Step 4 · 分组卖价

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

| 模型 | 用户价 | **CE (×0.86)** | **HP (×1.1)** |
|------|--------|----------------|---------------|
| M1 | 12.5 | 10.75 | 13.75 |
| M2 | 14.5 | 12.47 | 15.95 |
| M3 | 16.5 | 14.19 | 18.15 |
| M4 | 16.5 | 14.19 | 18.15 |
| M5 | 15.0 | 12.90 | 16.50 |
| M6 | 18.0 | 15.48 | 19.80 |

### Step 5 · 利润判断 → 分组归属

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

**M1 示例**（CE = 10.75，HP = 13.75）：

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

**全部模型汇总**：

| 渠道 | CE 归属 | HP 归属 |
|------|---------|---------|
| 甲 | M1 M3 M4 | M1 M2 M3 M4 M5 M6 |
| 乙 | M1 M2 M4 M5 | M1 M2 M4 M5 |
| 丙 | 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 |
| 己 | M3 M5 | M1 M2 M3 M4 M5 |

> 甲对 M2 在 CE 组亏损（12.47 − 15.0 = −2.53）→ 只进 HP。各模型中亏损的渠道×模型组合均被自动剔除。

### Step 6 · Priority 与 Weight

**规则**：

| 参数 | 规则 |
|------|------|
| **Priority** | 同组同模型按利润降序三等分 → **3**（高利润）/ **2**（中利润）/ **1**（兜底） |
| **Weight** | `max(1, round(100 × 利润 ÷ 该层最大利润))` |

**M1 结果**：

| 组 | Pri | 渠道 | 利润 | Wt |
|----|-----|------|------|----|
| CE | 3 | 甲 | 2.75 | 100 |
| CE | 2 | 乙 | 1.75 | 100 |
| CE | 1 | 戊 | 0.75 | 100 |
| 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 模型的**平均值**。

### 3.1 用户价 + 分组倍率

| 模型 | 用户价 | CE ×0.86 | HP ×1.1 |
|------|--------|----------|---------|
| M1 | 12.5 | 10.75 | 13.75 |
| M2 | 14.5 | 12.47 | 15.95 |
| M3 | 16.5 | 14.19 | 18.15 |
| M4 | 16.5 | 14.19 | 18.15 |
| M5 | 15.0 | 12.90 | 16.50 |
| M6 | 18.0 | 15.48 | 19.80 |

### 3.2 渠道配置矩阵

| 条目 | 上游 | 分组 | 模型 | Pri | Wt |
|------|------|------|------|-----|----|
| **甲-CE** | 甲 | cost-effective | M1,M3,M4 | 2 | 72 |
| **甲-HP** | 甲 | high-performance | M1,M2,M3,M4,M5,M6 | 2 | 78 |
| **乙-CE** | 乙 | cost-effective | M1,M2,M4,M5 | 2 | 100 |
| **乙-HP** | 乙 | high-performance | M1,M2,M4,M5 | 2 | 96 |
| **丙-CE** | 丙 | cost-effective | M2,M3,M4,M6 | 1 | 83 |
| **丙-HP** | 丙 | high-performance | M1,M2,M3,M4,M6 | 1 | 91 |
| **丁-CE** | 丁 | cost-effective | M2,M4,M6 | 2 | 100 |
| **丁-HP** | 丁 | high-performance | M2,M3,M4,M5,M6 | 2 | 74 |
| **戊-CE** | 戊 | cost-effective | M1,M2,M3,M5,M6 | 2 | 83 |
| **戊-HP** | 戊 | high-performance | M1,M2,M3,M5,M6 | 2 | 96 |
| **己-CE** | 己 | cost-effective | M3,M5 | 2 | 100 |
| **己-HP** | 己 | high-performance | M1,M2,M3,M4,M5 | 2 | 78 |

> 若同一条目内模型利润差异较大，可拆分为多个条目获得更精确的 Priority / Weight 控制。

---

## 四、系统路由机制

上一节输出的 Priority 和 Weight 直接对应系统的渠道路由参数。

### 4.1 整体路由流程

```
用户请求
  │
  ├─ Key.group = "cost-effective"   →  只在 CE 组内选渠道
  ├─ Key.group = "high-performance" →  只在 HP 组内选渠道
  └─ Key.group = "auto"             →  按 AutoGroups 顺序依次尝试
                                        CE 组 →（穷尽）→ HP 组
```

### 4.2 auto 模式

Key 为 auto 时，路由分两层：

1. **组间顺序**：先遍历 AutoGroups 第一个组（CE）；全部失败后切换下一组（HP）
2. **组内路由**：在同一组内按 Priority + Weight 两层规则选渠道

> auto Key 的**实付价格不是固定值**：路由到 CE 渠道按 0.86 计费，路由到 HP 渠道按 1.1 计费。系统按利润导向将最合适的渠道优先路由给 auto 用户。

### 4.3 Priority —— 第一层：利润分层

同 `group × model` 下，渠道按 **Priority 降序**排列：

```
Priority = 3  ←─  请求先尝试这一层（retry = 0）
Priority = 2  ←─  上层全部失败后才到这一层（retry = 1）
Priority = 1  ←─  继续降级（retry = 2），兜底
```

- 高利润渠道挂 Priority = 3，优先被选中，最大化平台收益
- 请求重试逐级降级：Pri=3 全失败 → Pri=2 → Pri=1
- Pri=1 是**兜底层**，保证即使高利润渠道全挂，仍有渠道可用

### 4.4 Weight —— 第二层：同层利润分流

同一 Priority 层内多个渠道时，按 **Weight 加权随机**分流：

```
Priority = 3 层:  甲(wt=100) ─── 55% 流量
                  乙(wt=83)  ─── 45% 流量

Priority = 1 层:  戊(wt=100) ─── 45% 流量
                  丙(wt=73)  ─── 33% 流量
                  己(wt=47)  ─── 21% 流量
```

- Weight = 0 表示等权（该层所有渠道等效 100）
- 利润越高的渠道 Weight 越大 → 同层内也倾向高利润渠道

### 4.5 为什么需要两层？

单用 Weight 的缺陷：最高利润渠道故障时，所有流量涌向次高渠道（即便 Weight 很低），可能把次高渠道也压垮。

**Priority 分层**解决雪崩：高利润层整体故障后，才整体降级到下一层，而非逐个渠道崩溃。

### 4.6 参数映射

| 本文概念 | 系统参数 | 存储位置 |
|---------|---------|---------|
| 用户价 | `ModelRatio` | options 表 |
| 分组倍率 | `GroupRatio` | options 表 |
| 渠道分组归属 | `Channel.group` + `.models` | channels 表 |
| 利润分层 | `Channel.priority` | channels 表 |
| 同层分流 | `Channel.weight` | channels 表 |
| auto 路由顺序 | `AutoGroups` | options 表 |

---

## 五、公式速查

| 步骤 | 公式 |
|------|------|
| 用户价 | `price[m] = round( median(cost[m]) × (1 + 收益率), grain )` |
| CE 倍率 | `ce = min(0.95, max(Nth_cheapest[m] / price[m]) + buffer)` |
| HP 倍率 | `hp = 1 + hp_premium` |
| 分组卖价 | `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))` |

---

## 六、约束与说明

| 约束 | 说明 |
|------|------|
| **冗余** | 每个模型在每组至少保留 ≥ 2 个渠道（防单点故障） |
| **CE 上限** | CE 倍率若被推到 ≥ 1.0，说明收益率过高或渠道成本集中，应降低收益率 |
| **重跑** | 调整收益率 / 溢价后需重跑利润判断，确认无组内亏损渠道 |

| 分组 | 倍率区间 | 含义 |
|------|---------|------|
| **cost-effective** | 0.8 ~ 0.95 | 折扣组，倍率由矩阵推导，需便宜上游才能在折扣下仍盈利 |
| **high-performance** | 1.05 ~ 1.2 | 溢价组，10% 溢价，可接入更多渠道（含略贵的） |
| **auto** | — | 不是独立倍率组，实付倍率 = 路由到的渠道所在组的倍率 |

---

## 七、代码工具

```bash
# 两个输入：报价矩阵 + 收益率
python3 scripts/channel_pricing_plan.py prices.csv --markup 0.25

# 不指定 --markup 时使用行业默认 0.25
python3 scripts/channel_pricing_plan.py prices.csv

# 输出 Markdown 报告 + 结构化 JSON
python3 scripts/channel_pricing_plan.py prices.csv --markup 0.25 --out plan.md --json plan.json

# 调整收益率对比方案（保守 vs 激进）
python3 scripts/channel_pricing_plan.py prices.csv --markup 0.20 --out plan_conservative.md
python3 scripts/channel_pricing_plan.py prices.csv --markup 0.35 --out plan_aggressive.md

# 结构性默认覆盖（一般不需要）
python3 scripts/channel_pricing_plan.py prices.csv --hp-premium 0.15 --min-redundancy 4
```

| | 说明 |
|---|---|
| **输入** | 渠道报价矩阵 CSV（空白 = 不支持）+ 收益率 `--markup`（默认 0.25） |
| **输出** | 用户价表 + 分组倍率 + 渠道配置矩阵（每条目的 group / models / priority / weight） |
