出价与预算优化 (Bidding & Budget Optimization)¶
一句话概述¶
出价优化是广告系统的"定价引擎",核心目标是在满足广告主成本约束的前提下,最大化平台收入或广告主转化量,从手动出价演进到 AI 全自动出价。
出价在广告系统中的位置¶
flowchart TD
A["广告主设定目标 (CPA=¥50)"] --> B[出价引擎]
subgraph B[出价引擎]
B1["pCTR × pCVR → 转化概率"]
B2["目标CPA → 出价约束"]
B3["预算剩余 → Pacing 调节"]
B4["竞争环境 → 动态调整"]
end
B --> C["eCPM = bid × pCTR × pCVR × 1000"]
C --> D[广告排序]
出价策略演进¶
手动出价 → 规则出价 → 模型出价 → 智能出价 → 全自动出价
手动CPC oCPC oCPM tCPA/tROAS 全托管
(广告主 (平台 (平台 (平台保 (平台全权
设定) 辅助) 主导) 成本达标) 决策)
手动出价¶
CPC 手动出价¶
CPM 手动出价¶
智能出价 (核心重点)¶
oCPM (Optimized CPM)¶
机制:
广告主设定: 目标转化成本 (如 CPA = ¥50)
平台行为: 按 CPM 计费,但自动优化出价
出价公式:
bid = 目标CPA × pCVR × pCTR × 1000 × 调节系数
示例:
目标CPA = ¥50
某次请求: pCTR = 2%, pCVR = 5%
bid = 50 × 0.05 × 0.02 × 1000 = ¥50 (CPM)
高转化概率用户: pCVR = 10% → bid = ¥100 (出高价)
低转化概率用户: pCVR = 1% → bid = ¥10 (出低价)
核心优势:
- 根据每次请求的转化概率差异化出价
- 高价值流量出高价,低价值流量出低价
- 整体 CPA 趋近目标值
oCPC (Optimized CPC)¶
两阶段模式 (百度搜索):
第一阶段 (数据积累):
- 按广告主设定的 CPC 出价
- 积累转化数据 (通常需要 20-50 个转化)
- 平台学习转化模型
第二阶段 (智能出价):
- 平台接管出价
- bid = 目标CPA × pCVR × 调节系数
- 按点击计费,但优化转化目标
tCPA (Target CPA)¶
机制:
广告主设定目标转化成本
平台保证实际 CPA 趋近目标值
与 oCPM 的区别:
oCPM: 尽量接近目标,但不严格保证
tCPA: 更强的成本约束,可能牺牲量级
成本控制:
实际CPA > 目标CPA × 120% → 降低出价
实际CPA < 目标CPA × 80% → 提高出价
tROAS (Target ROAS)¶
机制:
广告主设定目标广告支出回报率
平台优化每次出价以达到目标 ROAS
出价公式:
bid = pRevenue / tROAS × pCTR × 1000
示例:
tROAS = 300% (花¥1期望回¥3)
某用户预估消费金额 pRevenue = ¥200
pCTR = 3%
bid = 200 / 3 × 0.03 × 1000 = ¥2000 (CPM)
适用场景:
- 电商广告 (不同商品价值差异大)
- 游戏广告 (不同用户付费能力差异大)
最大转化量 (Maximize Conversions)¶
出价算法详解¶
基于控制论的出价 (PID 控制)¶
目标: 让实际 CPA 趋近目标 CPA
PID 控制器:
error(t) = 目标CPA - 实际CPA(t)
adjustment = Kp × error(t) // 比例项
+ Ki × Σ error(τ) // 积分项
+ Kd × (error(t) - error(t-1)) // 微分项
bid_ratio = base_ratio + adjustment
actual_bid = base_bid × bid_ratio
参数含义:
Kp: 对当前误差的响应速度
Ki: 消除长期累积误差
Kd: 预测趋势,减少震荡
调参挑战:
- Kp 太大 → 震荡
- Ki 太大 → 过度修正
- Kd 太大 → 对噪声敏感
基于优化理论的出价¶
问题建模:
max Σ xᵢ × CVᵢ (最大化总转化量)
s.t. Σ xᵢ × costᵢ ≤ B (预算约束)
Σ xᵢ × costᵢ / Σ xᵢ × CVᵢ ≤ tCPA (成本约束)
xᵢ ∈ {0, 1} (是否参与竞价)
拉格朗日对偶:
L = Σ xᵢ × CVᵢ - λ × (Σ xᵢ × costᵢ - B)
最优出价:
bid*ᵢ = CVᵢ / λ
λ 是拉格朗日乘子,反映预算的"影子价格"
λ 大 → 预算紧张 → 出价保守
λ 小 → 预算充裕 → 出价激进
基于强化学习的出价¶
建模:
State: (剩余预算, 剩余时间, 当前CPA, 竞争环境)
Action: 出价调节系数 (0.5x ~ 2.0x)
Reward: 获得的转化量 (满足成本约束)
算法:
- DQN: 离散动作空间
- DDPG/TD3: 连续动作空间
- PPO: 策略梯度方法
优势:
- 能学习长期最优策略
- 适应动态竞争环境
- 考虑预算的跨时段分配
挑战:
- 训练不稳定
- 探索风险 (真实环境探索代价高)
- 通常用离线 RL + 在线微调
预算分配¶
时间维度分配 (Pacing)¶
日预算: ¥10,000
投放时段: 8:00 - 23:00 (15小时)
匀速分配:
每小时目标消耗 = ¥10,000 / 15 = ¥667
加速分配 (前期多花):
8:00-12:00: 40% = ¥4,000
12:00-18:00: 35% = ¥3,500
18:00-23:00: 25% = ¥2,500
智能分配:
根据历史各时段的转化率分配
转化率高的时段多花,低的时段少花
计划维度分配¶
广告主总预算: ¥100,000/天
├── 计划A (核心人群): 初始 ¥40,000
├── 计划B (扩量人群): 初始 ¥30,000
├── 计划C (测试人群): 初始 ¥20,000
└── 预留池: ¥10,000
动态调整 (每小时):
计划A ROI = 3.0 → 追加预算
计划B ROI = 1.5 → 维持
计划C ROI = 0.5 → 削减预算,回收到预留池
跨渠道分配¶
总预算: ¥500,000/月
├── 抖音: 40% (信息流效果好)
├── 微信: 25% (社交场景)
├── 百度: 20% (搜索意图)
└── 快手: 15% (下沉市场)
优化: 基于各渠道 ROI 动态调整比例
成本控制机制¶
赔付机制¶
平台承诺:
如果实际 CPA > 目标 CPA × 120%
超出部分由平台赔付
示例:
目标 CPA = ¥50
实际 CPA = ¥65 (超出 30%)
赔付: (65 - 50×1.2) × 转化量 = 5 × 转化量
目的:
- 降低广告主使用智能出价的风险
- 增强广告主对平台的信任
出价上下限¶
出价上限 (Bid Cap):
防止单次出价过高
bid_max = 目标CPA × 3 (通常)
出价下限 (Bid Floor):
防止出价过低导致无法竞得
bid_min = 底价 (媒体设定)
学习期 (Exploration Phase)¶
新广告计划启动:
1. 学习期 (通常 3-7 天):
- 平台探索最优人群和出价
- CPA 可能波动较大
- 建议不频繁调整
2. 稳定期:
- 模型收敛
- CPA 趋于稳定
- 可以微调目标
冷启动建议:
- 初始出价略高于行业均值
- 定向不要太窄
- 日预算 ≥ 目标CPA × 20
竞争环境感知¶
竞争强度估计¶
市场价格发现¶
Bid Landscape (出价-胜率曲线):
胜率
100%│ ╭────────
│ ╱
50%│ ╱
│ ╱
0%│──╱
└──────────────────
出价 →
通过历史数据拟合出价与胜率的关系
找到边际收益最大的出价点
与大数据开发的关联¶
- 实时预算数据: 实时消耗金额的计算和同步 (Flink + Redis)
- 出价日志: 每次出价决策的日志记录和分析
- Pacing 数据: 预算消耗速率的实时监控
- 成本数据: CPA/ROAS 的实时和离线计算
- 竞争数据: 竞价环境数据的采集和分析
- RL 训练数据: 强化学习出价模型的训练数据管道
- 赔付计算: 成本超标的赔付金额计算
面试高频问题¶
- oCPM 的出价逻辑是什么?如何保证广告主的成本目标?
- PID 控制在预算 Pacing 中的应用?
- 智能出价的成本控制机制有哪些?
- 如何解决新广告计划的冷启动问题?
- 强化学习在出价中的应用?
- 预算分配的策略有哪些?
推荐阅读¶
- Budget Constrained Bidding by Model-free RL — Alibaba
- Real-Time Bidding with Multi-Agent RL
- 《计算广告》第 13 章 — 出价优化
- Google Ads 智能出价文档