从全额拍卖模型看为什么不要去争榜一大哥

作者: , 共 5128 字 , 共阅读 0
系列:生活中的数学

查看该系列所有文章

1、什么是榜一大哥

最近经常看微信视频,有时候会被推送一些直播,然后看到下面这个下播请榜一吃饭的主播:

下播请榜一吃饭

这个游戏很简单,就是大家都可以给主播刷钱,累计刷钱最多的叫做榜一,可以获得竞拍品「和主播一起吃饭」。

2、榜一游戏的简要分析

这个主播非常牛逼,一句话可以割无数韭菜。为什么呢,因为这个是经典的「全额拍卖模型」,无论你是榜几,钱都花出去了,但只有榜一才有收获。这种情况下,非理性者通常会拍出远高于实际价值的报价。即使是理性者,只要游戏已启动就身不由己,付出远高于实际价值,最后还可能一无所获。拍卖者所获远高于实际价值。

我们把问题最简单化,假设榜一大哥的价值是 100 元,或者更简单点,我们就拍卖一个 100 元的红包。所有人都可以随便报价,报价最高的人可以支付报价获得这个 100 块钱的红包,但所有竞价过的人也需要支付自己的最高报价。

然后我们发现这个游戏一旦玩起来就无法停下来。假设甲报价 1 块钱,乙报价 2 块钱,双方一直竞价,即使超过 100 块钱也不会停下来。比如到了甲报价 99 ,乙报价 100 元。这时候甲如果放弃直接损失 99 ,对他来说,可能会去赌一把报 150 元,这时候支付 150 元获得 100 元的红包只用损失 50 元。但如果甲报价 150 元,此时乙面临同样的情况,他可能还会继续将价格攀升。到最后就是两个人完全无视红包的实际价值开始比拼财力。

3、有上限的榜一游戏的数学模型

上面的简要分析是定性的。它也带来一个悖论:如果每个人都不去参与或不敢去竞价,那我是不是可以报价 1 块钱就获得这个 100 块钱的红包呢?

连续竞价的全额拍卖模型因为没有中止条件很难建模,因为大家不断加价也是一种均衡态(这种情况不知道算什么)。现实中,因为系统或财力限制,拍卖在一定金额后肯定会停止。我们假设对这个价值 100 元的拍卖有一个上限,即最高报价 1000 元,这样报价必然终止(假设报价只能是整数,每次至少加 1 块钱)。我们看一下游戏一旦启动,最终的均衡态是什么,该不该去参加游戏,以及怎么去报价。

这个很容易用递归逻辑来描述,具体细节不详述,直接上递归计算代码吧:

#!/usr/bin/env python
# encoding: utf-8

import sys
import numpy as np

def calc(x, y, n, m, t, ops):
    if x == m:
        t[x][y] = n - m
        ops[x][y] = 0
    elif y == m:
        t[x][y] = -x
        ops[x][y] = 0
    elif x <= y:
        # x == y 只有都是0的时候才有意义
        r = -x
        ops[x][y] = 0
        for z in range(y + 1, m + 1):
            if t[z][y] > r:
                r = t[z][y]
                ops[x][y] = z
        t[x][y] = r
    else: # x > y
        op = ops[y][x]
        if op == 0: # 对方最优状态是放弃
            t[x][y] = n - x
        else:
            t[x][y] = t[x][op]

def calc_all(n, m):
    # t 保存当前局面是(x, y)时,甲的预期收益
    t = np.zeros((m + 1, m + 1), dtype=int)
    # ops 保存当前局面是(x, y)时(x < y),甲的最优操作,
    # 为0表示放弃,否则表示下一个竞标价格。
    ops = np.zeros((m + 1, m + 1), dtype=int)

    # 从右下角到左上角递归计算t/ops两个矩阵
    for diag in range(2 * m, -1, -1):
        for x in range(0, m + 1):
            if (diag - x >= 0 and diag - x <= m and diag - x != x) or (x == 0 and diag == 0):
                calc(x, diag - x, n, m, t, ops)

    return t, ops

if __name__ == "__main__":
    n = int(sys.argv[1]) if len(sys.argv) > 1 else 4
    m = int(sys.argv[2]) if len(sys.argv) > 2 else 14
    t, ops = calc_all(n, m)

    print(t)
    print(ops)

为了更方便地看结果,我们设置榜一价值是 4 ,封顶金额为 14 ,此时局面最优结果如下表,其中$(x, y), 0\leq x, y \leq 14$位置的值表示当局面报价为$(x, y)$时,甲的最优操作(值为 0 表示放弃):

[[ 2  2  0  0  0  0  0  0  0  0  0  0  0  0  0]
 [ 0  0  0  0  0  0  0  0  0  0  0  0  0  0  0]
 [ 0  0  0  5  5  0  0  0  0  0  0  0  0  0  0]
 [ 0  0  0  0  5  0  0  0  0  0  0  0  0  0  0]
 [ 0  0  0  0  0  0  0  0  0  0  0  0  0  0  0]
 [ 0  0  0  0  0  0  8  8  0  0  0  0  0  0  0]
 [ 0  0  0  0  0  0  0  8  0  0  0  0  0  0  0]
 [ 0  0  0  0  0  0  0  0  0  0  0  0  0  0  0] 
 [ 0  0  0  0  0  0  0  0  0 11 11  0  0  0  0]
 [ 0  0  0  0  0  0  0  0  0  0 11  0  0  0  0]
 [ 0  0  0  0  0  0  0  0  0  0  0  0  0  0  0]
 [ 0  0  0  0  0  0  0  0  0  0  0  0 14 14  0]
 [ 0  0  0  0  0  0  0  0  0  0  0  0  0 14  0]
 [ 0  0  0  0  0  0  0  0  0  0  0  0  0  0  0]
 [ 0  0  0  0  0  0  0  0  0  0  0  0  0  0  0]]

对应的预期收益是:

[[  2   2   0   0   0   0   0   0   0   0   0   0   0   0   0]
 [ -1   0  -1  -1  -1  -1  -1  -1  -1  -1  -1  -1  -1  -1  -1]
 [  2   2   0  -1  -1  -2  -2  -2  -2  -2  -2  -2  -2  -2  -2]
 [  1   1  -3   0  -1  -3  -3  -3  -3  -3  -3  -3  -3  -3  -3]
 [  0   0  -4  -4   0  -4  -4  -4  -4  -4  -4  -4  -4  -4  -4]
 [ -1  -1  -1  -1  -1   0  -4  -4  -5  -5  -5  -5  -5  -5  -5]
 [ -2  -2  -2  -2  -2  -6   0  -4  -6  -6  -6  -6  -6  -6  -6]
 [ -3  -3  -3  -3  -3  -7  -7   0  -7  -7  -7  -7  -7  -7  -7]
 [ -4  -4  -4  -4  -4  -4  -4  -4   0  -7  -7  -8  -8  -8  -8]
 [ -5  -5  -5  -5  -5  -5  -5  -5  -9   0  -7  -9  -9  -9  -9]
 [ -6  -6  -6  -6  -6  -6  -6  -6 -10 -10   0 -10 -10 -10 -10]
 [ -7  -7  -7  -7  -7  -7  -7  -7  -7  -7  -7   0 -10 -10 -11]
 [ -8  -8  -8  -8  -8  -8  -8  -8  -8  -8  -8 -12   0 -10 -12]
 [ -9  -9  -9  -9  -9  -9  -9  -9  -9  -9  -9 -13 -13   0 -13]
 [-10 -10 -10 -10 -10 -10 -10 -10 -10 -10 -10 -10 -10 -10   0]]

如果多试几个例子便能看出规律(假设榜一价值是 4 ,最高封顶金额为 M ),当盘面报价低于 k 时,最优报价是 k ,其中 k 是一个 1 到 3 之间的数,且 M 和 k 除以 3 的余数相同。预期收益是 4-k。那什么时候需要跟标呢?只有在报价相差是 1 到 2 块钱时,可以跟标到 M 相对于 3 的同余数(但此时大部分情况下都是亏钱,只是说这样做能减少损失)。

比如封顶金额是 14 ,那么游戏最开始报价就是报 2 ;如果对方已经报了 1 ,自己也可以报 2。其它情况都放弃竞标。此时能有 2 的收益。

最后上面推理是有局限性的,它做了下面的假设:

  • 每个人只关心自己的预期收益,越高越好。
  • 在自己同样预期收益的情况下,优先放弃竞标,其次当有多个最优的竞标价格可选时,优先报出可选最低的价格。

如果碰到一个不按规矩出牌的,比如不光最大化自己的收益,同时还要打压对方的收益,此时局面可能和上面不一样。

4、真实主播游戏

有人看到上面的例子说我学会了,这不还有正的预期收益呢。但实际情况更复杂,因为每个人对于榜一的评估价值是不一样且不可知的,然后封顶值每个人的财力也是不一样且不可知的。比如你认为榜一值 100 元,但如果有另外一个人认为榜一值 200 元,他报价 200 ,那你这 100 元同样损失掉了。

从主播的角度,她引入一个托,就能破坏均衡引起争斗。非理性的参与者更多,这都能将游戏导往不可控的角度。

所以,不要去参与榜一大哥这个游戏。

5、一次性报价的全额拍卖模型

在一个一次性报价的全额拍卖模型中,甲乙两个拍卖着对榜一进行一次性的独立出价,价高着获得榜一的位置。但在游戏结束之前每个人都看不到别人刷了多少钱也不知道自己目前的排名,这时候应该怎么报价呢?

假设甲乙对竞买品的估值一样,简单起见都是 1 ,且假设价格是连续的(这样出现同样报价的情况的概率可以认为是 0 )。这时候最优报价策略为$p(x)$$p(x)$为报价为$x$的概率。那么报价为$x$的时候的预期收益为$T(x)=D(x)(1-x)-x(1-D(x)=D(x)-x$,其中$D(x)$$p(x)$的累计分布,即$D(x)=P(X<x)$

一个均衡态意味着$T'(x)=D'(x)-1=p(x)-1=0$,即$p(x)=1$。也就是说此时的最优概率就是在 0 到 1 完全随机报价。此时预期收益也是 0。不按照该策略报价,对方可以根据你的报价策略占你便宜。

Q. E. D.

系列: 生活中的数学 »
元旦前,总理公布了三大优惠个税政策,普通工薪阶级优惠最大的就是年终奖税收优惠再延两年。对于高收入者,优惠最大可达 10.3 万元。
类似文章:
春节到了,又是了抢红包的时节。不过我对于这背后的数学和算法更感兴趣。
最近写一个 vue 的写法:
路网效果图: