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

| 阶段 | 内容 |
|------|------|
| **输入** | ① 报价矩阵（CSV）　② 收益率（markup） |
| **算法** | Step 1 用户价 → Step 2 CE 倍率 → Step 3 HP 倍率 → Step 4 分组卖价 → Step 5 分组归属 → Step 6 Priority / Weight |
| **输出** | 用户价表 · 分组倍率 · 渠道配置矩阵（分组 / Pri / Wt） |

---

## 一、输入

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

### 1.1 报价矩阵

一行一个上游渠道，一列一个模型。`—` 表示该渠道不支持该模型。

| 渠道 | 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 | — |

> 脚本接受同等数据的 CSV 格式（空白单元格 = 不支持）。

### 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 | 用户价 | `price[m] = round( median(cost[m]) × (1 + 收益率) )` |
| 2 | CE 倍率 | `ce = min(0.95, max(第N便宜成本[m] / price[m]) + 缓冲)` |
| 3 | HP 倍率 | `hp = 1 + 溢价` |
| 4 | 分组卖价 | `sell[m][g] = price[m] × ratio[g]` |
| 5 | 分组归属 | `profit = sell − cost > 0` → 入组 |
| 6 | Priority / Weight | 利润三等分 → 3/2/1；同层占比 → 1~100 |

### 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])`

| 模型 | 用户价 | 成本排序 | 第 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 分组 | 路由行为 |
|---------|---------|
| cost-effective | 只在 CE 组内选渠道 |
| high-performance | 只在 HP 组内选渠道 |
| 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 | 选中时机 | retry |
|----------|---------|-------|
| **3** | 请求最先尝试 | 0 |
| **2** | 上层全部失败后 | 1 |
| **1** | 继续降级，兜底 | 2 |

- 高利润渠道挂 Priority = 3，优先被选中，最大化平台收益
- Priority = 1 是**兜底层**，保证即使高利润渠道全挂，仍有渠道可用

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

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

| Priority 层 | 渠道 | Weight | 流量占比 |
|------------|------|--------|---------|
| 3 | 甲 | 100 | 55% |
| 3 | 乙 | 83 | 45% |
| 1 | 戊 | 100 | 45% |
| 1 | 丙 | 73 | 33% |
| 1 | 己 | 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） |
