足球博彩中怎么进行套利交易(三)
上一篇中我们已经建立了收益矩阵.这篇继续往下推:当每一种玩法在每一种比分下的结算结果都能被写成一个向量以后,怎样从这些向量算出下注比例,并判断一组盘口到底是不是可以套利.
问:收益矩阵怎么变成下注金额?
先把一场比赛的所有可能结果记为集合:
\[ 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 条腿的组合.这不是数学上的限制,而是交易上的取舍:腿数越多,越容易受到赔率跳动,限额,下单延迟的影响.两腿,三腿,四腿是比较现实的执行范围.
这就形成了完整的判断链条:
- 先把每个玩法写成比分状态下的收益向量.
- 找到能覆盖全部比分状态的 2 到 4 腿组合.
- 把结算代码按真实赔率转换成返还倍数.
- 解非负投注比例 \(x\).
- 检查最差赛果返还是否大于本金.
到这里,套利已经从“经验上看赔率”变成了一个明确的线性代数问题.下一篇继续写这套模型在实时策略脚本中怎样落地:数据如何进入,组合如何加速筛选,返佣如何进入 EV,以及最后如何输出到结果表.