# 预算策略完整文档

> 最后更新: 2026-04-08
> 状态: 二维矩阵已实现并验证，扩量分配策略待实现

---

## 一、系统概述

### 1.1 核心机制

通过调整 oCPM 出价（`bid_amount`）控制广告消耗速度，**不设日预算限制**（`day_amount=0`）。出价越高，系统分配的曝光越多，消耗越快；出价越低，消耗越慢。

### 1.2 运营输入

运营每天提供一句话指令，系统自动完成全部计算：

| 输入示例 | 解析结果 |
|---------|---------|
| "今天小程序预算10w" | `total_budget_yuan=100000, account_id=0`（全账户） |
| "账户12345今日预算5w" | `total_budget_yuan=50000, account_id=12345` |

仅需一个参数：**今日总预算（元）**。其余全部由系统自动计算。

### 1.3 处理流程

```
运营输入 "今天小程序预算10w"
    ↓
Budget Agent（LLM）理解意图，提取参数
    ↓
┌─────────────────────────────────────────────┐
│  纯计算层（无 LLM，无 API 调用）              │
│                                             │
│  1. 查询昨日效率数据（ODPS）                  │
│  2. 查询当前广告出价/状态（ODPS）             │
│  3. 计算分位数阈值                           │
│  4. 每个广告 → 二维分类 → 决定动作            │
│  5. 扩量场景 → 增量预算分配建议               │
└─────────────────────────────────────────────┘
    ↓
Agent 格式化展示方案 → 运营确认 → 执行出价调整
```

---

## 二、依赖数据

### 2.1 数据源

| 数据表 | 用途 | 关键字段 |
|-------|------|---------|
| `loghubods.touliu_data` | 裂变效率数据（业务侧） | `rootsourceid`, `首层小程序打开数`, `裂变0层回流数`, `总回流人数` |
| `loghubods.ad_put_tencent_creative_day` | 创意-广告关联 | `creative_name`, `ad_id`, `creative_id` |
| `loghubods.ad_put_tencent_creative_components` | 创意组件（含落地页路径） | `creative_id`, `page_spec`, `page_type` |
| `loghubods.ad_put_tencent_creative_data_day` | 创意消耗数据（腾讯侧） | `creative_id`, `cost`, `valid_click_count`, `dt` |
| `loghubods.ad_put_tencent_ad` | 广告配置/状态 | `ad_id`, `account_id`, `bid_amount`, `ad_status` |

### 2.2 数据关联逻辑

```
touliu_data（业务裂变数据）
    ↓ rootsourceid 关联
creative_components（创意组件，提取落地页中的 rootSourceId）
    ↓ creative_name 关联
creative_day（创意维度，关联到 ad_id）
    ↓ ad_id 关联
ad（广告配置，获取出价/状态）
    ↓ creative_id 关联
creative_data_day（创意消耗数据，获取 cost）
```

最终聚合为**广告维度**（ad_id）的效率数据：每个广告的消耗、点击、打开数、裂变回流数。

### 2.3 关键计算指标

| 指标 | 公式 | 含义 |
|------|------|------|
| 效率分（efficiency） | `裂变0层回流数 / cost` | 每元消耗带来的裂变回流，越高越好 |
| scale_ratio | `今日预算 / 昨日消耗` | >1 扩量，<1 缩量，≈1 持平 |
| 有效广告门槛 | `首层小程序打开数 >= 100` | 样本量不足的广告不参与决策 |

---

## 三、决策矩阵（已实现）

### 3.1 分位数阈值

基于昨日**有效广告池**（open_count >= 100）动态计算：

| 阈值 | 计算方式 | 含义 |
|------|---------|------|
| ROI P70 | 效率分的第 70 百分位 | 高于此值 = 高ROI |
| ROI P30 | 效率分的第 30 百分位 | 低于此值 = 低ROI |
| 消耗 P50 | 单广告昨日消耗的中位数 | 高于此值 = 高跑量 |

实际数据参考（2026-04-07）：ROI P70=3.63, P30=2.24, 消耗 P50=294元

### 3.2 策略判断

| scale_ratio 区间 | 策略名称 | 场景 |
|-----------------|---------|------|
| < 0.7 | `aggressive_scale_down` | 大幅缩量 |
| 0.7 ~ 0.95 | `moderate_scale_down` | 温和缩量 |
| 0.95 ~ 1.05 | `maintain` | 持平 |
| 1.05 ~ 1.3 | `moderate_scale_up` | 温和扩量 |
| > 1.3 | `aggressive_scale_up` | 大幅扩量 |

### 3.3 五种动作

| 动作 | 含义 | 出价变化 | 执行方式 |
|------|------|---------|---------|
| `keep` | 保持不动 | 不调整 | 跳过 |
| `increase` | 提价放量 | +5% ~ +15% | 自动执行 |
| `decrease` | 降价控量 | -5% ~ -15% | 自动执行 |
| `close` | 建议关停 | 不调整 | 运营手动确认 |
| `observe` | 观察不动 | 不调整 | 跳过 |

### 3.4 缩量矩阵

**大幅缩量**（scale_ratio < 0.7）：

| | 高跑量（≥ P50） | 低跑量（< P50） |
|---|---|---|
| 高ROI（≥ P70） | `keep` | `keep` |
| 中ROI（P30~P70） | `decrease` -10% | `observe` |
| 低ROI（< P30） | `decrease` -15% | `close` |

**温和缩量**（0.7 ≤ scale_ratio < 0.95）：

| | 高跑量（≥ P50） | 低跑量（< P50） |
|---|---|---|
| 高ROI（≥ P70） | `keep` | `keep` |
| 中ROI（P30~P70） | `decrease` -5% | `observe` |
| 低ROI（< P30） | `decrease` -10% | `close` |

### 3.5 扩量矩阵

**大幅扩量**（scale_ratio > 1.3）：

| | 高跑量（≥ P50） | 低跑量（< P50） |
|---|---|---|
| 高ROI（≥ P70） | `keep` | `increase` +15% |
| 中ROI（P30~P70） | `keep` | `increase` +5% |
| 低ROI（< P30） | `decrease` -10% | `close` |

**温和扩量**（1.05 < scale_ratio ≤ 1.3）：

| | 高跑量（≥ P50） | 低跑量（< P50） |
|---|---|---|
| 高ROI（≥ P70） | `keep` | `increase` +10% |
| 中ROI（P30~P70） | `keep` | `increase` +5% |
| 低ROI（< P30） | `decrease` -10% | `close` |

### 3.6 持平矩阵（0.95 ~ 1.05）

| | 高跑量（≥ P50） | 低跑量（< P50） |
|---|---|---|
| 高ROI（≥ P70） | `keep` | `keep` |
| 中ROI（P30~P70） | `keep` | `keep` |
| 低ROI（< P30） | `keep` | `close` |

### 3.7 验证结果（2026-04-07 数据）

| 场景 | 预算 | scale_ratio | keep | increase | decrease | close | observe |
|------|------|------------|------|----------|----------|-------|---------|
| 大幅缩量 | 10万 | 0.57 | 72 | 0 | 76 | 50 | 40 |
| 持平 | 17.5万 | 1.00 | 188 | 0 | 0 | 50 | 0 |
| 大幅扩量 | 25万 | 1.42 | 97 | 69 | 22 | 50 | 0 |

---

## 四、扩量预算分配策略（待实现）

扩量场景下，增量预算（= 总预算 - 昨日消耗）通过三个渠道承接：

### 4.1 三个扩量渠道

| 渠道 | 说明 | 风险 |
|------|------|------|
| 提价放量 | 已有广告提出价，吃更多曝光 | 出价过高会导致成本失控 |
| 新建广告 | 在表现好的账户下新建广告 | 低风险，复用已验证账户 |
| 新建账户 | 开新账户分散投放 | 新账户需要冷启动 |

### 4.2 先验分配比例

| 场景 | 提价放量 | 新建广告 | 新建账户 |
|------|---------|---------|---------|
| 温和扩量（1.05~1.3） | 40% | 50% | 10% |
| 大幅扩量（> 1.3） | 30% | 45% | 25% |

> 这些比例是经验先验值，后续通过后验数据（调价后实际消耗达成率、新广告冷启动成功率、新账户存活率）迭代优化。

### 4.3 新建广告推荐账户

推荐条件：
- 该账户下高ROI广告占比 ≥ 40%
- 该账户昨日消耗 ≥ 账户消耗中位数（稳定账户）

每个推荐账户输出：
- 建议承接预算金额（按效率加权分配）
- 参考出价 = 该账户下高ROI广告的出价中位数

### 4.4 新建账户建议

- 参考单账户日消耗 = 现有账户消耗中位数
- 建议新建数量 = 新建账户预算 / 参考单账户日消耗（向上取整，至少 1）
- 参考出价 = 全局高ROI广告出价中位数

---

## 五、出价边界与约束

| 约束 | 值 | 说明 |
|------|---|------|
| 最低出价 | 10 分（0.10 元） | 低于此值跳过 |
| 最高出价 | 10000 分（100 元） | 上限保护 |
| 出价单位 | 分 | 1 元 = 100 分 |
| 调整频率 | 每天一次 | 避免频繁调整导致系统震荡 |
| 调整后观察期 | ≥ 2 小时 | 等系统消化出价变化 |

---

## 六、账户级评估

独立于出价调整，提供账户维度的健康度视图：

| 稳定性标签 | 条件 | 含义 |
|-----------|------|------|
| 稳定 | 昨日消耗 ≥ 中位数 | 跑量正常 |
| 一般 | 昨日消耗 ≥ P30 | 有消耗但偏低 |
| 低量 | 昨日消耗 < P30 | 几乎没跑量 |

扩量建议：稳定 + 效率分高于中位数的账户 → 适合新建广告扩量。

---

## 七、代码文件索引

| 文件 | 职责 |
|------|------|
| `tools/budget_calc.py` | 核心计算引擎（阈值、分类、决策、格式化） |
| `skills/budget_strategy.md` | Agent 领域知识（策略规则速查） |
| `prompts/budget.prompt` | Budget Agent 提示词（流程、输出格式） |
| `test_budget.py` | 纯计算层测试脚本（不调 API） |

### 关键函数

| 函数 | 输入 | 输出 |
|------|------|------|
| `_compute_thresholds(df_valid)` | 有效广告 DataFrame | `{roi_p70, roi_p30, cost_p50}` |
| `_classify_ad(efficiency, cost, thresholds)` | 单广告效率分+消耗+阈值 | `(roi_level, volume_level)` |
| `_decide_action(roi_level, volume_level, strategy)` | 分类+策略 | `(action, adj_ratio)` |
| `_determine_strategy(scale_ratio)` | 预算/昨日消耗比 | 策略名称字符串 |
| `budget_calculate_from_data(...)` | 账户ID+预算+日期 | 完整调整方案 |
| `account_evaluate(...)` | 日期 | 账户健康度评估 |
| `bid_adjustment_execute(...)` | 调整方案列表 | 执行结果 |

---

## 八、后续迭代方向

| 方向 | 说明 | 依赖 |
|------|------|------|
| 后验强化 | 用调价后实际数据迭代矩阵幅度参数（含弹性出价公式：`新出价 = 旧出价 × (1 + α × ln(实际ROI/目标ROI)) × 预算压力系数`） | 调价前后消耗/ROI对比数据、目标ROI基准线 |
| 赔付规则保护 | close 前检查广告累计转化数是否接近 6 个（腾讯赔付门槛），接近则改为 keep/increase 以触发赔付 | 广告维度累计转化数据 |
| 扩量提价幅度收敛 | 当前 +10%~+15% 偏激进，参考行业实践应控制在 +3%~+5%，配合后验数据迭代 | 后验强化完成后调整 |
| 扩量预算分配 | 提价/新建广告/新建账户三渠道分配 | 本文档第四章设计 |
| 日内 PID 流速控制 | 分钟级监控消耗偏差，动态微调出价，防止预算过早耗尽或花不完 | 实时消耗数据 |
| 时段差异化出价 | 按时段调整出价系数 | 分时段投放数据 |
| 公众号渠道 | GT/GW roi + 即转 roi | 公众号数据接入 |
| 样本不足广告关停 | 独立规则判断是否关停 | 关停策略定义 |
| 账户关停判断 | 7天有开启广告但无消耗 → 关停 | 账户历史数据 |
