Last Look 那篇聚焦于拍卖中的一桩具体不公平——处在竞价链路最后一棒的交易所,先偷看其他渠道已报出的竞胜价,再让自家需求「恰好高一点」地反超;也顺带交代了行业为何从二价集体转向一价。但那篇默认读者已经清楚「一次拍卖究竟是怎么运转的」。本文正是要补上这一前提:一次程序化拍卖,从收齐出价到定出成交价,中间到底发生了什么。
在此基础上,本文再落到一价时代最关键、也最考验工程能力的一环——Bid Shading(出价缩水)。一价拍卖有一个反直觉的陷阱:按你心中的真实价值出价,一旦胜出,几乎必然超付。 买方因此必须学会「主动压低一点、却又不至于输掉」。下文将依次讲清:这个陷阱从何而来、如何用数据估出「恰好赢下」的价位,以及为何「由谁来做 shading」本身就是一场利益博弈。
范围划界:本文讲拍卖机制本身(漏斗 / 底价 / 结算 / shading)。谁在主持拍卖、DSP/SSP 的角色见生态全景;二价→一价的历史与 last look 见专文;结算价通过什么字段回传(
at/${AUCTION_PRICE})见 OpenRTB 协议精讲。这里只在需要处引用。
TL;DR
- 一次拍卖是一条漏斗,不是一次比大小:候选出价要依次过资格过滤(品牌安全、尺寸、创意审核、
bcat/badv)、底价筛选、再进入排序结算。价高不等于能赢——先得活着走到最后一层。 - 底价有三种:hard floor(硬底价) 出价低于它直接出局;soft floor(软底价) 是历史上二价的产物,低于它仍可能赢、但结算规则变化;一价普及后,重点转向动态底价(dynamic floor)——交易所按流量特征实时算一个能最大化自己收益的底价。
- 一价 vs 二价的结算差异是一切的起点:二价下成交价由别人决定(第二名 + 增量),所以照实出价是最优策略;一价下成交价 = 你自己的出价,照实出价 = 把本可留下的差价(surplus)全额让渡给卖方。
- Winner’s curse(赢家诅咒):一价里,你赢,恰恰说明你出得比所有人都高——很可能远高于「本来赢下所需」。赢得越干脆,往往亏得越多。
- Bid Shading 就是解药:不出真实价值 (v),而是出一个 shaded bid (b < v),让它刚好高过预期清算价。目标不是赢率最大,而是 期望剩余(surplus)× 赢率 最大——在 price–win rate 曲线上找那个甜点。
- 它本质是个预测问题:用历史清算价 / bid landscape 按(域名、格式、尺寸、地区、时段、deal)分桶建模,预测「这次要赢,大概需要多少钱」,再在其上留一点安全边际。
- 谁做 shading 是利益问题:买方侧 shading(DSP / 中立第三方)目标是替广告主省钱;卖方侧 shading(SSP 提供)帮买方压价、却由抬价方来做——这就是又一次「裁判兼运动员」,和 last look 同源的透明度隐忧。
- 工程落点:shading 模型吃的是成交价回执(
${AUCTION_PRICE})与输赢信号(lurl/${AUCTION_LOSS});难点是反馈延迟、数据稀疏、以及市场会随你的 shading 而变(别人也在 shade,清算价分布是动态的)。
Table of contents
Open Table of contents
1. 一次拍卖是一条漏斗
新人最容易把拍卖想成「收齐所有出价,价高者得」。真实的交易所拍卖是一条多级漏斗——价格只是最后一关,前面还有一串「你有没有资格参与」的筛子。
把「拍卖」拆成漏斗后,很多线上疑惑就有了答案:「我明明出价最高却没拿到量」,往往不是排序输了,而是在资格过滤(创意没过审、尺寸不符、撞了
badv)或底价那一层就被刷掉了。价格竞争只是最后一关。
四层逐个看:
- ① 资格过滤:这次出价的创意,尺寸 / 格式对不对得上
imp?创意过没过交易所审核?落地域名adomain有没有撞媒体的badv(屏蔽广告主)、品类cat有没有落进bcat(屏蔽品类)?出价方席位在不在wseat/bseat名单里?任何一条不满足,这个出价根本进不了价格竞争。 - ② 底价筛选:活下来的出价,还得 ≥ 底价(见 §2)。公开竞价比
imp.bidfloor,deal 比deal.bidfloor。 - ③ 排序:把合格出价按净价 / eCPM(有时要扣掉交易所抽成后的净值)排序;保量单和 deal 在这里还享有结构性优先权(哪怕出价不是绝对最高)。
- ④ 结算:选出胜者,并按
at定成交价(见 §3)。
记住这条漏斗,本文后面所有关于「出多少」的讨论,才有正确的语境:你优化的是第 ④ 层的价格,但能不能走到第 ④ 层,是前三层决定的。
2. 底价:hard floor / soft floor / 动态底价
底价(floor price)是卖方给库存设的成交底线,也是买方出价时第一个撞上的硬约束。它有三种形态,混淆它们是新人常犯的错:
| 类型 | 含义 | 出价低于它会怎样 |
|---|---|---|
| hard floor | 硬底价 | 直接出局,连排序都进不去 |
| soft floor | 软底价(二价时代产物) | 仍可能赢,但结算规则在软硬之间切换 |
| dynamic floor | 动态底价:按流量特征实时算出的最优底价 | 取决于当次算出的值,等价于动态 hard |
soft floor 是个历史包袱:在二价拍卖里,如果最高价没超过 soft floor,成交价按 soft floor 之类的规则来定,制造了一段模糊地带——它也是 last look 那类套利的温床之一。一价普及后,soft floor 基本失去意义(成交价就是你的出价,没有「第二名」可依),行业重心转向 dynamic floor。
动态底价才是今天真正的博弈焦点:交易所不再对所有流量设一个固定底价,而是按域名、格式、时段、这个买家的历史出价实时算一个底价,目标是最大化自己的收益期望。这直接把买方推向了下一节的困境——因为买方永远不完全知道这次的底价是多少,只能靠历史去猜。
一个必须建立的直觉:在一价 + 动态底价的世界里,买卖双方都在用历史数据互相预测。卖方预测「这个买家愿意出多少」来抬底价;买方预测「这次要赢需要多少」来压出价。Bid Shading 就是买方这一侧的预测武器。
3. 一价 vs 二价:成交价由谁决定,决定了一切
这一节是理解 shading 的钥匙。两种拍卖的差别,一句话:成交价由谁决定。
- 二价(Second Price):赢家付的是第二名的价 + 一个最小增量。换言之,成交价由他人的出价决定,与你出多高无关(只要你是最高)。
- 推论:照实出价是占优策略(truthful bidding)。你出真实价值 (v),即便赢了也只按第二名的价成交,不会吃亏;出得更低反而可能把本该赢的曝光丢掉。这正是 Vickrey(二价密封)拍卖被反复证明的经典性质——说真话对每个参与者都最优。
- 一价(First Price):赢家付的是自己出的价,即成交价 = 你的出价。
- 推论:照实出价是灾难。你出 (v) 且赢了,就把「(v) 减去本来赢下所需的价」这段差价(surplus)全额让渡给了卖方。
看个数:一次曝光,你的真实价值 (v = $5.0),而实际上出价第二高的人只出到 $3.0。
- 二价下:你出 $5.0,赢,付 $3.01。省下 $1.99 是你的。
- 一价下:你出 $5.0,赢,付 $5.0。那 $1.99 全没了。
- 一价下(聪明做法):你出 $3.1,仍然赢,付 $3.1。省下 $1.9。
第三种做法就是 Bid Shading——把出价从 (v) 压到「刚好赢」的位置。问题只剩一个:你怎么知道 $3.1 就够了? 你并不知道第二名出多少。这就把定价变成了一个预测问题。
4. Bid Shading:把「恰好赢下的价」估出来
4.1 Winner’s curse:赢,本身就是坏消息
要理解为何 shading 不可回避,得先认识一价拍卖里那个绕不开的现象——winner’s curse(赢家诅咒):
在众人对同一次曝光各自密封出价的一价拍卖里,你之所以能赢,恰恰是因为你出得比所有人都高。 而「比所有人都高」往往意味着你的估值偏乐观、或出价过猛——胜出的那一刻,你大概率已经超付。
换句话说,赢得越轻松(出价甩开第二名越多),被浪费的差价就越大。一个从不 shading、始终照实出价的买家会赢下很多曝光,但每一单都在悄悄失血。
4.2 shading 的目标不是赢率,而是 surplus × 赢率
一个常见的直觉是「出低点就能省钱」,但出得太低会赢不到量。因此 shading 真正要优化的既不是赢率、也不是单均节省,而是二者的乘积——期望净收益。
设真实价值 (v),出价 (b),赢的概率 (W(b))(出得越高越可能赢,是一条随 (b) 上升的曲线)。一价下,一旦赢,成交价就是 (b),这一单的期望剩余是:
[ \text{ExpectedSurplus}(b) = (v - b)\cdot W(b) ]
- (b) 往上抬:(W(b))(赢率)升,但 ((v-b))(每单省下的)降。
- (b) 往下压:省得多,但赢率塌。
这条曲线中间有个峰——那就是最优 shaded bid (b^*)。shading 引擎干的就是:估出 (W(b)) 这条赢率曲线,再找 ((v-b)\cdot W(b)) 的极大值点。
左图:赢率 (W(b)) 随出价上升,但出到真实价值 (v) 时省下的差价归零。右图:期望剩余 ((v-b)\cdot W(b)) 是一条钟形曲线,峰值 (b^*) 才是该出的价——它通常远低于 (v)。注意 (b^*) 不是常数:当所有人都在 shade,清算价分布会整体下移,昨天的最优今天就偏了。
4.3 它本质是个预测问题:估清算价分布
要画出 (W(b)) 这条曲线,就得知道「在这类流量上,历史清算价(或第二高价)大致长什么分布」。工程上:
- 收集 bid landscape:把每次竞价的成交价回执(一价下就是
${AUCTION_PRICE})和输赢信号(lurl+${AUCTION_LOSS},尤其是「输给更高价 102」)攒下来。 - 分桶 / 特征化:清算价强烈依赖上下文——域名 / App、广告格式与尺寸、地区、时段、设备、是否走 deal。按这些维度分桶,或用模型把它们当特征。
- 建模预测:对每个 bid request,预测「要赢需要多少」的分布(或直接预测最优 (b^*) / shading factor)。简单的用分位数 / 直方图,复杂的用梯度提升、分位回归等。
- 留安全边际:在预测清算价上加一个小 margin——既对冲预测误差,也应对市场波动。
4.4 三个绕不开的工程坑
- 反馈延迟与稀疏:
burl/成交回执、转化信号都有延迟;长尾流量样本稀疏,分桶到最后可能每桶没几条数据,模型只能回退到更粗的桶。 - 市场是动态的、且会因你而变:这是 shading 和普通预测最不一样的地方——当所有买家都在 shade,清算价整体下移,你昨天学到的分布今天就偏了。它更像一个多方博弈的动态均衡,而不是一个静态分布,模型必须持续在线更新。
- 和 pacing / 出价模型耦合:shading 决定「这一单出多少」,但预算节奏(pacing)决定「现在该不该激进」。两者必须协同——预算烧不完时可以少 shade(多赢量),临近超支时多 shade(保效率)。
5. 谁来做 shading:又一次「裁判兼运动员」
技术上,shading 可以发生在两个位置,而位置本身就带着利益立场:
| 位置 | 谁做 | 为谁省钱 | 隐忧 |
|---|---|---|---|
| 买方侧 shading | DSP 自建 / 中立第三方 | 替广告主省钱 | 需要 DSP 有足够的 bid landscape 数据 |
| 卖方侧 shading | SSP 作为「服务」提供给买方 | 名义上帮买方压价 | 抬价方来替你压价——利益天然冲突 |
卖方侧 shading 是一价转型初期冒出来的产物:SSP 说「我帮你 shade,省得你自己建模型」。但这就像 last look 的翻版——靠成交额抽成、希望成交价越高越好的一方,反过来替你决定该出多低,动机天然相反。因此买方越来越倾向把 shading 收回到自己或中立第三方手里:让「出多少」这个决策,落在与自己利益一致的一侧,而不是交给抽价方去替你算。
6. 常见误解 ↔ 正解
| 常见误解 | 正解 |
|---|---|
| 拍卖就是价高者得 | 价格是最后一关;先得过资格过滤与底价,很多「最高价」死在前面 |
| hard floor 和 soft floor 差不多 | hard floor 低于即出局;soft floor 是二价遗产,一价下基本失效 |
| 一价和二价对出价策略没差别 | 天壤之别:二价照实出价最优,一价照实出价 = 白送 surplus |
| 赢得越多说明策略越好 | 一价下赢得太干脆往往是超付(winner’s curse)——赢的姿势比赢的次数重要 |
| Bid Shading 就是一律压低出价 | 是找 ((v-b)\cdot W(b)) 的峰值,压过头会输掉量,是最优化不是砍价 |
| shading 是一次性算好的固定折扣 | 清算价分布随市场(大家都在 shade)动态变化,必须持续在线学习 |
| 让 SSP 帮我 shading 最省心 | 抬价方替你压价利益冲突,等于 last look 换个马甲——优先买方/中立侧 |
7. 一张速查表
| 概念 | 一句话 | 关联 |
|---|---|---|
| 拍卖漏斗 | 资格过滤 → 底价 → 排序 → 结算,价格是最后一关 | §1 |
| hard floor | 硬底价,低于即出局 | §2 |
| soft floor | 二价遗产,一价下基本失效 | §2 |
| dynamic floor | 交易所按流量特征实时算的最优底价 | §2 |
| 二价结算 | 成交价 = 第二名 + 增量 → 照实出价最优 | §3 |
| 一价结算 | 成交价 = 自己的出价 → 必须 shade | §3 / OpenRTB at |
| winner’s curse | 赢,本身说明你可能超付了 | §4.1 |
| shaded bid (b^*) | ((v-b)\cdot W(b)) 的峰值,通常远低于 (v) | §4.2 |
| bid landscape | 历史清算价分布,shading 模型的原料 | §4.3 / ${AUCTION_PRICE} |
| 买方 vs 卖方 shading | 谁做,就替谁的利益服务 | §5 |
一句话收尾:二价的世界里你只要诚实,一价的世界里你必须精明。 Bid Shading 就是把「精明」变成一个可以用历史数据训练、持续迭代的预测问题——而它最大的敌人,是一个所有人都在变聪明、因而不断移动的市场。
延伸阅读
- Last Look 深挖:二价→一价转型的历史与那桩最著名的不公平,本文的「前传」。
- OpenRTB 协议精讲:
at拍卖类型、${AUCTION_PRICE}成交价回执、lurl/${AUCTION_LOSS}输价信号——shading 模型的数据入口。 - 程序化交易模式:RTB / PMP / PD / PG:deal 与保量在排序层的结构性优先权。
- 预算与 Pacing:shading(出多少)与 pacing(现在该不该激进)如何协同。
- 程序化广告生态全景:谁在主持拍卖、ad tech tax 与 SPO 的大背景。
规范与资料:
- IAB Tech Lab. OpenRTB 2.6 Specification:
at、底价、notice 与成交价宏的权威定义。 - W. Vickrey. Counterspeculation, Auctions, and Competitive Sealed Tenders(1961):二价拍卖「照实出价最优」性质的理论源头。
附录:术语表
- 拍卖漏斗:资格过滤 → 底价 → 排序 → 结算的多级筛选,价格竞争只在最后一层。
- hard floor / soft floor / dynamic floor:硬底价(低于即出局)/ 软底价(二价遗产)/ 动态底价(实时算出的最优底线)。
- 一价 / 二价(First / Second Price):成交价 = 自己出价 / 第二名 + 增量。
- truthful bidding(照实出价):出真实价值;二价下最优,一价下会白送 surplus。
- surplus(剩余):真实价值与实际成交价之差,买方想最大化的净收益。
- winner’s curse(赢家诅咒):一价里赢本身就暗示可能超付。
- Bid Shading(出价缩水):把出价从真实价值压到「恰好赢下」的位置,最大化期望剩余。
- shaded bid (b^*):使 ((v-b)\cdot W(b)) 最大的出价。
- bid landscape / clearing price distribution:历史清算价分布,shading 建模的原料。
- 买方侧 / 卖方侧 shading:由 DSP / 中立第三方做,还是由 SSP 做——立场相反。