足球世界杯买球赢面计算
- 前言
- 理论基础
- 实际计算用例:
- 代码实现
- 真实数据
前言
此文是个人关于世界杯的一些浅显的看法,实际统计结果和计算方法有出入,可能原因:1)数据量不够。2)比赛双方差距够大导致的。但在双方实力相近的情况下,选择平是一个不错的决定!
理论基础
假设有两只球队甲和乙,在双方实力局等的情况下,赢球概率都为0.5%,则有:
甲 | 乙 | 概率 |
---|---|---|
胜 | 负 | 1/4 |
胜 | 胜 | 1/4 |
负 | 胜 | 1/4 |
负 | 负 | 1/4 |
由此可知:甲胜的概率是1/4,平的概率是1/2,乙胜的概率是1/4。
在正常保本情况下的买入操作为:
甲胜 100,平 200, 乙胜 100 合计400。
赔率对应为:
操作 | 买入金额 | 合理赔数 |
---|---|---|
甲胜 | 100 | 400 |
平 | 200 | 400 |
乙胜 | 100 | 400 |
合计购入400合计,则不亏钱。
反推概率计算公式为:
甲胜: 100/(100+200+100) = 0.25;
平: 200/(100+200+100) = 0.5;
乙胜 : 100/(100+200+100) = 0.25;
因此,可采用体彩公司提供的赔率信息,大致计算出体彩给的各场比赛的预期可赢率。具体方法:
- 计算总胜赔数:
总胜赔数 = (甲胜赔率 + 乙胜赔率 + 2*平赔率)*100;
- 分别计算甲乙的官方输赢比:
甲前赔率 = sqrt(甲胜赔数/总胜赔数);
乙前赔率 = sqrt(乙胜赔数/总胜赔数);
甲的官方赔率 = 甲前赔数/( 甲前赔数+ 乙前赔数);
乙的官方赔率 = 乙前赔数/( 甲前赔数+ 乙前赔数);
- 在假设按上面规则买了400的前提下,结合甲乙的官方赔率,推测输赢概率与官方赔率刚好相反,反算可赢率(其中保本为1):
甲胜可赢数量= 100*甲胜赔率* 乙的官方赔率^2;
乙胜可赢数量= 100*乙胜赔率* 甲的官方赔率^2;
平可赢数量 = 200*平赔率* 甲的官方赔率* 乙的官方赔率;
可赢率 = (甲胜可赢数量+乙胜可赢数量+平可赢数量)/400;
实际计算用例:
有了上面的基础,接下来引入实际用例计算各种情况下的可赢率:
卡特尔VS荷兰:
总胜赔数 = (13+1.11+2*6.2)*100 = 2651;
卡前赔率 = sqrt(卡胜赔数*100/总胜赔数)=0.7002;
荷前赔率 = sqrt(荷胜赔数*100/总胜赔数)=0.2046;
卡胜官方赔率 = 卡前赔率/( 卡前赔率+ 荷前赔率)=0.77;
荷胜官方赔率 = 荷前赔率/( 卡前赔率+ 荷前赔率)=0.23;
可赢率 = (1300*0.23*0.23+111*0.77*0.77+200*6.2*0.23*0.77)/400
=(68.77+65.81+219.60)/400 = 0.885
可赢率为88.5%(低于1)。按100、200、100买入400,可亏损:46
操作 | 买入金额 | 合理赔数 | 实际赔数 |
---|---|---|---|
卡特尔胜 | 100 | 1890 | 1300 |
平 | 100 | 285 | 620 |
荷兰胜 | 100 | 168 | 111 |
由此可知,平更有利于买家。为什么计算结果和官方赔率区别较大,可能原因是彩票客户的个人喜好,体彩公司设置的输赢概率和本本方法计算的概率有偏差等等!
实例2:
通过计算可知:
比赛 | 可赢率 | 主场合理配数 | 平合理配数 | 客场合理配数 |
---|---|---|---|---|
加纳Vs乌拉圭 | 0.71 | 671 | 210 | 265 |
韩国Vs葡萄牙 | 0.73 | 609 | 207 | 282 |
赛尔维亚vs瑞士 | 0.70 | 395 | 200 | 404 |
喀麦隆vs巴西 | 0.82 | 1296 | 249 | 191 |
代码实现
#include<iostream>
#include <iomanip> // 包含头文件
#include<algorithm>
#include<cmath>
#include<vector>
using namespace std;
class worldCupGain
{
public:
worldCupGain()
{
clear();
}
void clear()
{
szCompare = "";
dbHomewinRate = 0.0;
dbNowinRate = 0.0;
dbAwayHomewinRate = 0.0;
}
// 输出比赛结果
void myprintf()
{
double dbSum = (dbHomewinRate + 2*dbNowinRate + dbAwayHomewinRate)*100; // 总赔数
double dbHomewinOriRate = sqrt((dbHomewinRate*100)/dbSum); // 主前赔数
double dbAwayHomewinOriRate = sqrt((dbAwayHomewinRate*100)/dbSum); // 客前赔数
double dbHomewinOfficialRate = dbHomewinOriRate/(dbHomewinOriRate+dbAwayHomewinOriRate); // 主胜官方赔率
double dbAwayHomewinOfficialRate = 1 - dbHomewinOfficialRate; // 客胜官方赔率
// cout<<"主/客场胜官方赔率: "<<dbHomewinOfficialRate<<" "<<dbAwayHomewinOfficialRate<<endl;
// 计算可赢率及各个预期合理赔数
double dbWinRate = (100*dbHomewinRate*dbAwayHomewinOfficialRate*dbAwayHomewinOfficialRate + \
100*dbAwayHomewinRate*dbHomewinOfficialRate*dbHomewinOfficialRate + \
200*dbNowinRate*dbHomewinOfficialRate*dbAwayHomewinOfficialRate)/400; // 可赢率
double dbHome = 100/dbAwayHomewinOfficialRate/dbAwayHomewinOfficialRate; // 主胜合理赔数
double dbNoWin = 50/dbAwayHomewinOfficialRate/dbHomewinOfficialRate; // 平合理赔数
double dbAwayHome = 100/dbHomewinOfficialRate/dbHomewinOfficialRate; // 客胜合理赔数
cout<<szCompare<<"\t"<<dbWinRate<<"\t"<<dbHome<<"\t"<<dbNoWin<<"\t"<<dbAwayHome<<endl;
}
string szCompare; // 比赛双方
double dbHomewinRate; // 主场赢赔率
double dbNowinRate; // 平赔率
double dbAwayHomewinRate; // 客场赢赔率
};
int main(){
int count = 0;
cout<<"请输入要查验的比赛数量:";
cout<<endl;
cin>>count;
vector<worldCupGain> vecWorldCupGain;
worldCupGain objWorldCupGain;
cout<<"请按右边格式输入数据:比赛双方 主场赢赔率 平赔率 客场赢赔率"<<endl;
while(count)
{
objWorldCupGain.clear();
cin>>objWorldCupGain.szCompare>>objWorldCupGain.dbHomewinRate>>objWorldCupGain.dbNowinRate>>objWorldCupGain.dbAwayHomewinRate;
vecWorldCupGain.emplace_back(objWorldCupGain);
count--;
}
cout<<endl<<endl;
cout<<"比赛双方"<<"\t"<<"可赢率"<<"\t"<<"主胜合理赔数"<<"\t"<<"平合理赔数"<<"\t"<<"客胜合理赔数"<<endl;
for(int index = 0; index < vecWorldCupGain.size(); index++)
{
vecWorldCupGain[index].myprintf();
}
system("pause");
return 0;
}
真实数据
真实数据表明:在双方差距较大的情况下,选择选择一方胜/败更有把握,在双方实力相近的情况下,选择平更有把握。50%左右的比赛,果断选择平!