足球博彩中怎么进行套利交易(三)

上一篇中我们已经建立了收益矩阵.这篇继续往下推:当每一种玩法在每一种比分下的结算结果都能被写成一个向量以后,怎样从这些向量算出下注比例,并判断一组盘口到底是不是可以套利.

问:收益矩阵怎么变成下注金额?

先把一场比赛的所有可能结果记为集合:

\[ S={s_1,s_2,\ldots,s_m} \]

在上一篇的简化例子里,我们只看了 0:0 到 2:2 的 9 个比分.在真实策略里,我使用的是:

\[ {0,1,2,3,4,5,99}\times{0,1,2,3,4,5,99} \]

也就是 49 个比分状态.这里的 99 不是实际比分,而是一个高比分桶,可以理解为 6 球及以上的压缩表达.这样做的目的不是预测比分,而是把博彩规则在一个有限的比分空间内完整表达出来.

再把当前准备下注的盘口记为:

\[ L={L_1,L_2,\ldots,L_n} \]

每一条下注腿 \(L_i\) 有一个十进制赔率 \(O_i\).对于每一个比分状态 \(s_j\),这条下注腿都有一个结算代码:

结算代码 含义 返还倍数
0 全输 0
50 半输 0.5
100 走水 1
150 半赢 \((O_i+1)/2\)
200 全赢 \(O_i\)

注意这里的返还倍数包含本金.例如赔率 2.10 的盘口全赢,返还倍数是 2.10;如果半赢,一半本金按 2.10 结算,另一半本金退回,返还倍数是:

\[ \frac{2.10+1}{2}=1.55 \]

所以每一个比分状态 \(s_j\),都会得到一行真实返还倍数:

\[ p_j=(p_{j1},p_{j2},\ldots,p_{jn}) \]

把所有比分状态放在一起,就是一个返还矩阵:

\[ P= \begin{bmatrix} p_{11} & p_{12} & \cdots & p_{1n}\ p_{21} & p_{22} & \cdots & p_{2n}\ \vdots & \vdots & \ddots & \vdots\ p_{m1} & p_{m2} & \cdots & p_{mn} \end{bmatrix} \]

接下来要解的,不是每一腿下注多少钱的绝对值,而是每一腿占总投入的比例:

\[ x=(x_1,x_2,\ldots,x_n) \]

并且:

\[ x_i\ge 0,\quad \sum_{i=1}^{n}x_i=1 \]

如果总本金是 1000 元,最后某一腿的真实下注金额就是:

\[ \text{amount}_i=1000\times x_i \]

对于任意比分状态 \(s_j\),这一组下注组合的总返还倍数为:

\[ R_j=p_j\cdot x=\sum_{i=1}^{n}p_{ji}x_i \]

套利的核心条件就是:

\[ \min_j R_j>1 \]

也就是说,无论比分落在哪一个状态里,最终返还都大于总投入.

问:为什么要解线性方程?

最理想的套利组合,不是让每一腿下注金额相等,而是让不同赛果下的返还尽量相等.如果某些赛果返还很高,另一些赛果返还很低,那么低返还的赛果才是真实风险.

因此策略求解的是一组近似等返还的下注比例.把第一种有效返还状态作为基准,要求其他返还状态和它相等:

\[ (p_j-p_1)\cdot x=0,\quad j=2,\ldots,m \]

再加上资金比例之和为 1:

\[ \sum_i x_i=1 \]

合起来就是:

\[ \begin{cases} (p_2-p_1)\cdot x=0\ (p_3-p_1)\cdot x=0\ \cdots\ \sum_i x_i=1 \end{cases} \]

解出 \(x\) 以后,再计算:

\[ R=p_1\cdot x \]

如果 \(R>1\),说明在所有有效返还状态下,这组下注都能覆盖本金并留下利润.

在实现上,完全重复的返还行会先被去重.例如很多比分对于大小球 2.5 来说只有两类:大于 2.5 球,或小于等于 2.5 球.虽然真实比分状态有 49 个,但返还形态可能只有 2 行.这会大幅减少求解规模.

示例:大小球盘口的两腿套利

假设同一场比赛出现如下两个盘口:

下注腿 博彩公司 赔率
Over 2.5 Bookmaker A 2.05
Under 2.5 Bookmaker B 1.98

对于任何比分,这两个盘口只有两种结算状态:

比分状态 Over 2.5 返还倍数 Under 2.5 返还倍数
总进球数大于 2.5 2.05 0
总进球数小于等于 2.5 0 1.98

设 Over 2.5 的下注比例为 \(x_1\),Under 2.5 的下注比例为 \(x_2\).我们希望两种赛果下返还相等:

\[ 2.05x_1=1.98x_2 \]

同时:

\[ x_1+x_2=1 \]

解得:

\[ x_1=\frac{1.98}{2.05+1.98}=0.4913 \]

\[ x_2=\frac{2.05}{2.05+1.98}=0.5087 \]

对应的统一返还倍数为:

\[ R=2.05\times0.4913=1.007 \]

如果总投入 1000 元,则下注金额为:

下注腿 投注比例 投注金额
Over 2.5 0.4913 491.30 元
Under 2.5 0.5087 508.70 元
合计 1.0000 1000.00 元

无论最终总进球数是否大于 2.5,返还约为 1007 元.净利润约为:

\[ 1000\times(1.007-1)=7\text{元} \]

这就是最简单的两腿线性组合.

问:亚盘的半赢半输怎么进入同一个模型?

亚盘的复杂性在于,它不是只有赢和输.例如让球 \(-0.25\),可能出现全赢,半输,全输;受让 \(+0.25\),可能出现全赢,半赢,全输.但在收益矩阵里,这些情况并不特殊,都只是返还倍数不同.

假设有两腿:

下注腿 赔率
Asia Handicap Home -0.25 1.95
Asia Handicap Away +0.25 2.05

按主队结果分成三类:

赛果类型 Home -0.25 Away +0.25
主队赢球 1.95 0
平局 0.5 \((2.05+1)/2=1.525\)
主队输球 0 2.05

于是它的返还矩阵是:

\[ P= \begin{bmatrix} 1.95 & 0\ 0.5 & 1.525\ 0 & 2.05 \end{bmatrix} \]

这时就不能再用简单的“赔率倒数之和小于 1”判断.因为平局状态不是一腿全赢另一腿全输,而是一个半输加一个半赢的线性组合.

更一般地说,足球套利不应该只看玩法名称,而要看每一个玩法在所有比分状态下形成的收益向量.只要这些收益向量按某个非负比例相加以后,在每一种比分下都能大于本金,就存在套利结构.

问:脚本为什么先找覆盖组合?

如果直接把一场比赛里所有盘口两两,三三,四四组合全部丢给线性求解器,计算量会很大.策略先做一层规则筛选:一组盘口必须覆盖全部比分状态,才值得进入资金比例求解.

在矩阵语言里,某条下注腿在某个比分状态下只要返还代码大于 0,就认为它覆盖了这个状态.一组下注腿的覆盖集合是它们覆盖状态的并集:

\[ C(L_1,\ldots,L_n)=C(L_1)\cup C(L_2)\cup\cdots\cup C(L_n) \]

只有当:

\[ C(L_1,\ldots,L_n)=S \]

这组盘口才进入下一步.

生产策略只枚举 2 到 4 条腿的组合.这不是数学上的限制,而是交易上的取舍:腿数越多,越容易受到赔率跳动,限额,下单延迟的影响.两腿,三腿,四腿是比较现实的执行范围.

这就形成了完整的判断链条:

  1. 先把每个玩法写成比分状态下的收益向量.
  2. 找到能覆盖全部比分状态的 2 到 4 腿组合.
  3. 把结算代码按真实赔率转换成返还倍数.
  4. 解非负投注比例 \(x\).
  5. 检查最差赛果返还是否大于本金.

到这里,套利已经从“经验上看赔率”变成了一个明确的线性代数问题.下一篇继续写这套模型在实时策略脚本中怎样落地:数据如何进入,组合如何加速筛选,返佣如何进入 EV,以及最后如何输出到结果表.