AdTech Engineering · Operations Playbook
把"分层"和"底价"当作两个可独立求解、又必须联合调优的优化问题来对待:一个是给流量定档,一个是给每一档定最低成交价。这份手册给出从统计基线到强化学习的完整算法谱系、可直接改写的伪代码,以及 2026 年必须知道的合规红线。
这条公式是全篇的锚点。它说明了两件事:① 底价不是越高越好——提价同时压低中标概率,收入是乘积,存在唯一最优点;② 你真正的建模对象是出价分布 F(或等价的中标概率曲线),而不是"一个价格数字"。所有算法,本质都是在对 F 做估计。
底价是"给一档流量定一个价",所以分层的质量直接决定底价算法的上限。分层做粗了,再好的定价模型也只能在错误的粒度上做优化。
分层维度决定了你能切多细,也决定了样本量是否足够。实践中的信号顺序大致是:
| 类别 | 典型特征 | 分层作用 |
|---|---|---|
| 库存 | 广告位 ID、尺寸、广告形式、页面位置、可见性 | 决定基础价值,是分层的第一主键 |
| 媒体 / 应用 | 媒体 ID、App 分类、内容主题、品牌安全等级 | 决定买家池与品牌适配度 |
| 用户 / 设备 | 设备类型、OS、运营商、地域、价值分 | 决定需求方出价意愿(iOS/一线城市通常更高价) |
| 上下文 / 时序 | 时段、星期、大促节点、竞争密度 | 捕捉需求侧波动,是动态定价的关键输入 |
切分粒度要受"最小样本量"约束:一个流量簇每周样本不足,估计出的分布就不稳定,宁可回退到上一级粒度。
从易到难有四条路径,绝大多数团队应该按顺序演进:
分层的结果必须落到具体的售卖方式上,否则只是标签游戏。典型的映射阶梯:
底价在学术上叫保留价(Reserve Price),MRC 把"底价"与"保留价"视为同义词。1981 年 Myerson(以及独立的 Riley 与 Samuelson)证明:当买家估值独立同分布且满足正则性条件时,收入最优的拍卖就是"二价拍卖 + 一个精心选择的保留价",该保留价等于该分布下的垄断价,记作 r* = ψ⁻¹(0)(ψ 为虚拟估值函数)。
这条结论给出了方向的正确性,但在工程上有三个现实障碍:
另一个重要的边界条件是 Bulow–Klemperer 的结论:在单物品拍卖里,"多吸引一个买家"带来的收入提升,往往超过"把保留价调到最优"。所以底价优化不能替代需求侧拓展——引入一个高价 DSP,常常比把底价算法调优 5% 更值钱。
| 机制 | 作用 | 实现要点 |
|---|---|---|
| 硬底价 Hard Floor | 低于底价的出价被直接丢弃,不参与胜出 | OpenRTB 中由 bidfloor 承载;丢标原因码 100 |
| 软底价 Soft Floor | 不改变"谁能赢",只改变"赢家付多少" | OpenRTB 没有标准字段;合规敏感,需谨慎使用 |
| Deal 底价 | 私有交易有独立底价 | 不继承展示层币种;丢标原因码 101 |
| 二价拍卖 | 赢家支付"次高价 + 一美分";此时底价会直接决定成交价 | 若次高价低于底价,成交价被抬到底价 |
| 一价拍卖 | 赢家支付自己的出价;底价只做"资格筛选" | Google Ad Manager 自 2019 年转向统一一价拍卖 |
这个区别极其重要:同样的底价,在二价拍卖里是"定价工具",在一价拍卖里只是"过滤器"。调参前必须先确认自己平台用的是哪套机制。
一个说明机制差异的最小例子
两家 DSP 对某曝光估值分别为 $1 和 $3。二价拍卖下,若底价设 $0.50,$3 的买家胜出但只付 $1;把底价提到 $2.50,同一个赢家要付 $2.50——价格由底价而非对手决定。换成一价拍卖,面对 $1 和 $2 的出价,$2.50 的底价会让这笔交易直接流拍,除非买家主动抬价。
下面的阶梯按"实现难度 / 数据需求 / 收益上限"排列,建议逐级演进,而不是一步跳到强化学习。
max r·P(bid≥r)。数学上最完备,代价是必须处理数据截断问题。"收益上限"指理论上限,不代表实际增益;不同流量类型差异极大。行业实测口径下(非严格实验),规则式调价上限约个位数百分比,模型式在稳定期约 12%–18%,强化学习在长链路场景(游戏、社交)可能更高——但这些数字来自厂商自述,务必用自平台 A/B 验证。
# 输入:按流量簇聚合的历史成交价
# 输出:每个流量簇的静态底价建议
def baseline_floor(cluster_prices, quantile=0.50, k=0.90,
floor_min=0.10, floor_max=30.0):
if len(cluster_prices) < MIN_SAMPLES: # 样本不足则回退上级粒度
return None, "fallback"
q = percentile(cluster_prices, quantile) # 如 P50
r = clamp(q * k, floor_min, floor_max) # k 为保守系数(<1 留填充空间)
return r, "baseline"
这一版的全部价值是"提供对照"。上线后一定要能回答:动态底价相比固定底价,收入、填充率、eCPM 分别变了多少。
核心洞察是:不需要知道解析的最优解,只要在候选价网格上枚举,取期望收入最大的那个价即可。
# 离散枚举求最优底价(经验分布版)
# R(r) = r * P(bid >= r) —— 期望收入
def optimal_floor(bids, floor_min, floor_max, grid=64):
best_r, best_rev = floor_min, -1
for r in linspace(floor_min, floor_max, grid):
p_win = mean([b >= r for b in bids]) # 中标/填充概率
rev = r * p_win # 期望收入
if rev > best_rev:
best_r, best_rev = r, rev
return best_r # 该流量簇的建议底价
bids 里只有"曾经胜出"的出价,也就是全部 ≥ 当前底价。用这份数据估计出的分布,会被系统性高估。两个必要的补救:skipRate),专门采集低价区的出价样本;把底价预测变成一个回归(或分位数回归)问题。关键在特征与标签的设计。
# 特征工程(示意)
x = [
embed(ad_slot_id), app_category, ad_format, ad_size,
device_type, os, carrier, geo_city,
hour_of_day, day_of_week, is_holiday_promo,
user_value_score, # 用户价值分
hist_win_rate_1h, # 近 1 小时该簇中标率
hist_bid_p25, hist_bid_p50, hist_bid_p75, hist_bid_p90,
competition_qps, # 竞争密度(实时竞价请求量)
dsp_count, # 有效参与买家数
]
# 两种建模方式
# A. 直接回归最优底价(标签来自离线回放/反事实估计)
y_A = optimal_floor_offline(x)
# B. 分位数回归,输出出价分布的分位点,再在线枚举求最优
q50, q75, q90 = lgbm_quantile(x, alphas=[0.5, 0.75, 0.9])
def predict_floor(x, floor_min, floor_max, seg_mult):
qs = lgbm_quantile(x)
r = argmax_revenue(qs) # 在分位点构成的经验分布上求最优
r = r * seg_mult # 分层系数(来自流量分档)
return clamp(r, floor_min, floor_max) # 强制安全边界
训练标签怎么来?——这是最难的一步
你无法直接观测"如果当时设了另一个底价会怎样"。可行的标签构造路径:
监督学习优化的是"单次决策的即时期望",而 RL 面向的是长期累积收益——因为买家的行为会对底价作出反应(长期设高价,DSP 会学着降低出价或退出)。
# 上下文老虎机(LinUCB 简化版)
# 每个流量簇 = 一个上下文;动作 = 离散底价档位 {r1..rK}
# 奖励 = 成交收入 − λ × 未填充惩罚
for request in stream:
x = context_features(request)
for k in arms: # 每个底价档位
score[k] = x·theta[k] + alpha * sqrt(x·A[k]^-1·x) # 均值+探索
k = argmax(score)
r = arms[k]
revenue, filled = run_auction(request, floor=r)
reward = revenue - lambda * (1 - filled)
update(A[k], b[k], x, reward) # 在线更新
# 进阶:PPO / 离线 RL(IQL 等)
# state = 请求特征 + 近窗统计量(填充率、预算消耗、竞争密度)
# action = 底价档位
# reward = 窗口内净收入(含延迟回报,需做 return 建模)
[floor_min, floor_max] 内,且不得低于合约/成本底线。| 机制 | 作用 | 参考实现 |
|---|---|---|
随机跳过 / skipRate | 按比例关掉底价,采集低价区样本、度量底价真实效应 | Prebid.js Price Floors Module 提供 0–100 的 skipRate |
下限保护 / floorMin | 防止算法输出过低破坏定价 | Prebid 同名参数;Ad Manager 的 floor_min |
| Deal 豁免 | 私有交易默认不受展示层底价约束 | Prebid 中 deal bids 默认豁免 |
| 规则数量上限 | 定价规则过多会互相冲突、难以维护 | Ad Manager 定价规则上限约 200 条/网络(截至 2026-09) |
| 计价口径 | 底价通常按分成后的媒体实收衡量 | 80/20 分成下,$1 的 bid 对媒体只值 $0.80,高于此的底价会把它过滤掉 |
| 时延预算 | 定价推理必须在竞价时延预算内完成 | 整体链路通常 <100–120ms;模型要轻量化、可缓存 |
三件事不能分开做:流量分档、底价定价、以及"这次请求走哪条通道"的编排(Waterfall 瀑布流 vs Unified 统一竞价 vs Hybrid 混合)。
# 混合编排的决策逻辑
def route(request, segment):
# 1. 该流量档是否有保量合约待履约?
if has_guaranteed_contract(segment) and contract_remaining() > 0:
return "PDB"
# 2. 预估统一竞价与固定价各自的期望收入
exp_rtb = predict_revenue(request, floor=model_floor(request))
exp_deal = best_deal_price(request)
if exp_deal > exp_rtb:
return "PD"
# 3. 否则走竞价,未填充则回落兜底
r = model_floor(request)
result = run_unified_auction(request, floor=r)
return result if result.filled else fallback_adn(request)
| 指标 | 含义 | 异常信号 |
|---|---|---|
| 填充率 | 成交 ÷ 请求 | 持续下滑 = 底价过高或需求侧流失 |
| eCPM | 收入 ×1000 ÷ 展示 | 上升但填充率暴跌 = 短期虚高,需警惕总收入 |
| 总收入 / 净收入 | 最终目标函数 | 唯一可以单独用来下结论的指标 |
| 中标率 | 赢竞价 ÷ 参与竞价 | 分层与底价是否匹配需求侧 |
| 底价—填充率弹性 | 底价每变动 1%,填充率变化多少 | 弹性异常大 = 定价过于激进 |
| DSP 维度流失 | 各需求方参与度与预算贡献 | 某 DSP 因底价过高退出 = 生态受损 |
真实数据给出的"权衡"长什么样
Yahoo 在 2022 年三季度对算法底价的公开数据很能说明问题:其交易所成交展示下降 13.86%,但 eCPM 上升 16.57%;交易所收入增长 0.41%,加上未售出流量通过其他通道售出后,总增长 1.27%。
读法:底价优化的典型效果不是"收入大涨",而是用更少的展示量换更高的单价,净收入小幅改善。如果你的团队期待的是两位数增长,大概率会失望——真正的大增量来自需求侧和供给质量,而不是把底价调得更聪明。
底价不再只是商业参数。过去 18 个月,监管和司法机构已经把"底价如何设置、是否披露、能否按买家区分"变成了法律问题。做这块的运营和工程,需要知道边界在哪。
| 时间 | 事件 | 对运营的含义 |
|---|---|---|
| 2026-01-29 | MRC 发布《数字广告拍卖透明度标准》最终版 | 闭环拍卖方需在拍卖前后披露保留价;明确"底价不应按买家分别设置" |
| 2026-06-26 | IAB Tech Lab 发布最终版《程序化拍卖定义》 | 行业首次统一定义"什么算一次程序化拍卖"(15 个术语、12 步流程) |
| 2026-09-02 | 美国法院就谷歌广告技术案裁定:不拆分 AdX,但要求放宽竞价规则 | 法院要求废止统一定价规则、开放分买家底价,并向竞品广告服务器提供 AdX 实时竞价数据 |
| 2026-08-31 | FTC 与 22 州起诉亚马逊,涉约 200 亿美元"隐性广告附加费" | 指控核心是未披露的保留价;软底价(改变成交价而非资格)成为争议焦点 |
一个容易被忽略的历史教训
Yahoo 在 2008 年对 46 万个关键词做保留价实验,结果并不一致:结果页广告数平均减少约 1 条,高频搜索词上"每次搜索收入"上升 3.9%,但在最优保留价估计低于 20 美分的繁忙词上,收入反而下降 8.7%。
结论:底价优化不存在"普适最优"——低价值流量的最优底价可能就是"不设底价"。按流量簇分别决策,而不是全平台一刀切,是唯一正确的做法。
| 阶段 | 目标 | 交付物 |
|---|---|---|
| 第 0–1 月 | 建立 Baseline | 流量分层标签体系;分位数基线底价;对照 holdout 组;核心指标看板 |
| 第 2–3 月 | 分布估计 + 枚举最优 | 探索流量机制(skipRate);删失校正;期望收入枚举求解器 |
| 第 4–6 月 | 模型化 | 分位数回归模型;特征管道;在线推理服务;A/B 平台 |
| 第 6 月+ | 长期优化 | 上下文老虎机 / RL 智能体;延迟回报建模;影子模式与安全约束;合规披露能力 |
bidfloor/bidfloorcur/mincpmpersec/durfloors)、丢标原因码、Google Ad Manager 定价规则、Prebid Price Floors Module、Yahoo 历史实验数据、MRC 与 FTC 相关进展。