下大赌注

机器算法验证 优化
2022-02-13 06:16:30

我一直在尝试编写一种算法来建议 1X2(加权)游戏中的投注。

基本上,每场比赛都有一组比赛(主队对客队):

  • 1: 主场获胜
  • X: 画
  • 2: 客场获胜

BWin 1X2 投注游戏

对于每个匹配项和符号(1X2),我将分配一个百分比来表示该符号成为正确匹配结果的机会/可能性。这是一个表示结构的数组:

$game = array
(
    'match #1' => array // stdev = 0.0471
    (
        '1' => 0.3,     // 30%     home wins
        'X' => 0.4,     // 40%     draw
        '2' => 0.3,     // 30%     away wins
    ),

    'match #2' => array // stdev = 0.4714
    (
        '1' => 0.0,     //   0%    home wins
        'X' => 0.0,     //   0%    draw
        '2' => 1.0,     // 100%    away wins
    ),

    'match #3' => array // stdev = 0.4027
    (
        '1' => 0.1,     //  10%    home wins
        'X' => 0.0,     //   0%    draw
        '2' => 0.9,     //  90%    away wins
    ),
);

我还计算了每个赌注的标准偏差(在上面的片段中注释);较高的标准差代表较高的确定性,而具有最低标准差的匹配则转化为较高的不确定性,理想情况下,如果可能的话,应该用双倍或三倍赌注来覆盖。

以下伪算法应描述整个工作流程:

for each match, sorted by std. dev         // "uncertain" matches first
    if still can make triple bets
        mark top 3 symbols of match        // mark 3 (all) symbols
    else if still can make double bets
        mark top 2 symbols of match        // mark 2 (highest) symbols
    else if can only make single bets      // always does
        mark top symbol of match           // mark 1 (highest) symbol

到目前为止一切顺利,但我需要告诉算法我想花多少钱。假设1以任何货币计算的单次投注成本,计算多次投注成本的公式是:

2^double_bets * 3^triple_bets * cost_per_bet (= 1)

显然,该算法应该尝试将尽可能多的可用资金分配到投注建议中(否则就没有多大意义),现在这变得更加棘手......

假设我想支付最多4,列出 PHP 中所有可能的倍数(@IDEOne):

$cost = 1; // cost per single bet
$result = array();
$max_cost = 4; // maximum amount to bet

foreach (range(0, 3) as $double)
{
	foreach (range(0, 3) as $triple)
	{
		if (($double + $triple) <= 3) // game only has 3 matches
		{
			$bets = pow(2, $double) * pow(3, $triple); // # of bets

            $result[$bets] = array
            (
                'cost'      => $bets * $cost, // total cost of this bet
                'double'    => $double,
				'triple'    => $triple,
            );

            if ($result[$bets]['cost'] > $max_cost)
			{
				unset($result[$bets]);
            }
        }
    }
}

ksort($result);

产生以下输出:

Array
(
    [1] => Array
        (
            [cost] => 1
            [double] => 0
            [triple] => 0
        )

    [2] => Array
        (
            [cost] => 2
            [double] => 1
            [triple] => 0
        )

    [3] => Array
        (
            [cost] => 3
            [double] => 0
            [triple] => 1
        )

    [4] => Array
        (
            [cost] => 4
            [double] => 2
            [triple] => 0
        )
)

问题

如果我选择玩可用的最大金额(4),我将不得不下注两次双打,如果我使用上面描述的伪算法,我最终会得到以下投注建议:

  • match #1=>X1
  • match #2=>2
  • match #3=>12

3与成本高且包含更多不确定性的三重赌注相比,这似乎不是最理想的:

  • match #1=>X12
  • match #2=>2
  • match #3=>2

如果您认为match #3赔率可能是:上述示例将获得更多相关性:

$game['match #3'] = array // stdev = 0.4714
(
    '1' => 0.0,           //   0%    home wins
    'X' => 0.0,           //   0%    draw
    '2' => 1.0,           // 100%    away wins
);

在这种情况下,我会无缘无故地浪费双倍。

基本上,我只能选择最大的(可能是愚蠢的)赌注,而不是最聪明、最大的赌注

几天来,我一直在用头撞墙,希望能得到某种顿悟,但到目前为止,我只能想出两个半[坏]的解决方案:


1)画一条“线”

基本上我会说,标准偏差低于特定值的比赛将是三倍,标准偏差高得多的比赛将是双重投注,其余的单一投注。

当然,这样做的问题是找出适当的具体界限——即使我确实找到了“最聪明”赌注的完美价值,我仍然不知道我是否有足够的钱来玩建议的赌注,或者是否我可以做一个更大(也很聪明)的赌注……


2)蛮力

我在写这个问题时想出了这个想法,我知道在我描述的上下文中它不会完全有意义,但我认为我可以使用稍微不同的指标让它工作。基本上,我可以让程序为我可以玩的每一个可能的金额(在我的例子中从1到)建议下注(三倍和双倍赌注的数量4),应用我上面描述的伪算法并计算全球排名值(一些像% of symbols * match stdev- 我知道,这没有意义)。

排名最高的赌注(涵盖不确定性)将是建议的赌注。这种方法的问题(除了它还没有任何意义的事实之外)是我的程序要使用的游戏不限于 3 场比赛,并且这些比赛的双重和三重投注组合的数量将是显着更高。


我觉得有一个优雅的解决方案,但我无法掌握它......

非常感谢任何解决此问题的帮助,谢谢。


我的问题似乎有些混乱,我已经在这个问题和评论中解决了这个问题,但至少对某些人来说,误解似乎仍然盛行。

我需要知道我将为特定比赛(所有比赛)玩多少三倍、双倍和单倍投注。通过单独查看每场比赛,我已经知道我想玩什么符号。

3个回答

我想我想出了一个可行的蛮力解决方案,它是这样的:


  • 1)计算我可以进行的多种投注的每种可能组合

对于我在问题中提供的示例和金额,这将是:

  • 3 单、0 双、0 三 = 相当于 1 单注
  • 2 个单注、1 个双注、0 个三注 = 相当于 2 个单注
  • 2 个单注、0 个双注、1 个三注 = 相当于 3 个单注
  • 1 个单注、2 个双注、0 个三注 = 相当于 4 个单注

  • 2)计算每场比赛的符号赔率的标准差

             |    1    |    X    |    2    |  stdev  |
             |---------|---------|---------|---------|
    Match #1 |   0.3   |   0.4   |   0.3   |  0.047  |
             |---------|---------|---------|---------|
    Match #2 |   0.1   |   0.0   |   0.9   |  0.402  |
             |---------|---------|---------|---------|
    Match #3 |   0.0   |   0.0   |   1.0   |  0.471  |
    

  • 3)对于每个多重投注组合(步骤 1),使用以下公式计算排名:

    排名 = (#n(x) [+ #n(y) [+ #n(z)]]) / stdev(#n)

其中#n是特定匹配,#n(x|y|z)是符号的有序赔率。

  • 匹配从低标准偏差到高标准偏差进行处理。
  • 每场比赛中的单个符号从高赔率到低赔率进行处理。

测试 1 个单注、2 个双注、0 个三注:

  • (#1(X) + #1(1)) / stdev(#1) = (0.4 + 0.3) / 0.047 = 14.89
  • (#2(2) + #2(1)) / stdev(#2) = (0.9 + 0.1) / 0.402 = 2.48
  • #3(2) / stdev(#3) = 1.0 / 0.471 = 2.12

这个赌注给了我的全球排名14.89 + 2.48 + 2.12 = 19.49


测试 2 个单注、0 个双注、1 个三注:

  • (#1(X) + #1(1) + #1(2)) / stdev(#1) = (0.4 + 0.3 + 0.3) / 0.047 = 21.28
  • #2(2) / stdev(#2) = 0.9 / 0.402 = 2.24
  • #3(2) / stdev(#3) = 1.0 / 0.471 = 2.12

这给了我一个全球排名21.28 + 2.24 + 2.12 = 25.64:-)


剩下的所有赌注显然都是劣等的,因此没有必要对其进行测试。

这种方法似乎有效,但我通过反复试验并按照我的直觉想出了它,我缺乏数学理解来判断它是否正确,或者即使有更好的方法......

任何指针?

PS:抱歉格式错误,但 MD 解析器似乎与 StackOverflow 不同。

如何基于单纯形法制定解决方案。由于不满足使用 Simplex 方法的前提,我们需要稍微修改该方法。我称修改后的版本为“Walk the line”。

方法:

您可以测量每场比赛的不确定性。去做吧!计算每场比赛的不确定性,单赌或双赌(三赌没有不确定性)。添加双重或三重投注时,请始终选择最能减少不确定性的投注。

  1. 从最大数量的三重投注开始。计算总不确定性。
  2. 删除一个三倍赌注。添加一两个双注,保持在最大成本之下。计算总不确定性。
  3. 重复第 2 步,直到达到最大双注次数。

选择总不确定性最低的赌注。

我从观察这个体育投注中得到了什么,我得出了这个结论。

预期值
假设您有 3 个赌注1.29 5.5 and 10.3(表中的最后一个赌注)EV 用于下注,
EV = 1/(1/1.29+1/5.5+1/10.3) - 1 = -0.05132282687714185 如果持有一个赢得另一个的概率分布为
1/1.29 : 1/5.5 : 1/10.3,那么从长远来看,由于您的 EV 为负数,您将赔钱。
只有弄清楚每种结果的概率并找出违规行为,您才能获利。

可以说真实概率是
0.7 : 0.2 : 0.1

这意味着利率应该是 1.43 \ 5.0 \ 10.0

您可以确定,在这种情况下,最好的回报是投注平局,因为它为您
EV(0) = 5.5/5 - 1 = 0.1
提供了投注失败的位置
EV(2) = 10.2/10 - 1 = 0.02
,投注主场获胜甚至是 EV-
EV(1) = 1.29/1.43 - 1 = -0.10