竞彩历险记

2013-12-26 09:37 1738

以前对彩票的认识只限于福利3D,双色球和刮刮乐,以前我也一直好奇为什么福利彩票和竞技彩票会分开。今年11月23号,室友带来了他首次购买竞彩并中奖的震撼消息,我才了解竞彩并由此开始了自己的“竞彩事业”。

认识竞彩

先来介绍一下这个不务正业的竞彩。在购买竞彩之前,我一共只购买过个位数次的福利3D,和数十次的刮刮乐。福利3D的中奖概率是1/1000,奖金是1000¥,我如果一次性花1000¥买500注不同的组合,我有50%的可能收回成本,50%的可能损失1000¥,0%的可能赚钱。当然有人说:你傻呀,谁一下买500注呀!是的,人只会一次买少量几注,但控制了成本的同时,也意味着极难收回成本,2¥的水漂也是水漂呀。这种买彩票的赚钱模式就是撞大运。我是不太相信撞大运的,所以没买过双色球,买概率高点的福利3D也没撞过小运。至于买刮刮乐,纯属就是给自己找点娱乐。再看看竞彩,以我熟悉的篮球竞猜为例,每一注需要选至少两场比赛,竞猜内容就是猜测两场比赛的胜负。假如我是一个nba小白,我随机地猜某两只球队让分获胜,这个组合的概率就是25%,如果真的猜中,那么2¥通常会变成6¥。如果我花100天每天买一注,那么100天最可能的结果就是我一共花了200¥,共中了150¥,百日收益率为-25%,至少大部分钱没有打水漂。如果我能将猜测组合正确的概率提高到50%,那么100天后我将能共中300¥,百日收益率为50%。如果要保本,我只需要达到33.3%的中奖率。认识了竞彩,喜欢体育的我自然是想跃跃一试。

看看下面的一张最近的中奖记录的截图吧。不要惊讶,这只是中奖记录而已,还有没中奖的记录了。通常我一天会买2~3注不同的。由于没有自动统计的功能,我只能大概估算买竞彩这一月的战绩情况:猜对了一半以上的比赛,在保本的基础上,只有很少的盈余。为什么能保本?以及为什么没能赚更多?这是我想在这篇文章中分享给读者的。

为什么能保本?

为什么能保本,当然是因为我预测胜负还算准确了。介绍一下nba吧,nba是美国职业篮球联赛的缩写,共有30只球队,东部15只,西部15只,每个区的前8只球队进入季后赛,常年是西强东弱,今年更是如此。有人这么形容:有些西部的球队场场都拼,打着打着就成西部倒数了;有些东部的球队想摆烂,结果打着打着不小心就进季后赛了。接下来的介绍更多是要看实际数据了。
我从taobao.7m.cn上抓取了nba2013开赛至今的赛程数据,分享在了百度网盘,会定期更新至最新数据。数据分析的代码附在了文章最下方,感兴趣的朋友可以跑一跑。初始数据就如下图所示:

胜负主要看实力

既然是猜比赛胜负,很自然想到要先看看双方实力。官方一般分别给出东部和西部的排名,且每个部还要再分赛区,分区冠军先排,具体可以参考官网说明。但是买彩票,就得看真实实力棒了,我以下所有分析的数据都没有按照东西部划分。以下分析全部使用2013-11-23至2013-12-23的数据。

先看看“胜率总排行”。胜利总排行是球队综合实力的高低体现。这是买竞彩所要参考的第一要素,重要性自然不必多说。

主场龙与客场虫

篮球足球都有一个很普遍的特点,就是主场优势,球队往往在主场发挥的比客场好。体育媒体经常说这是以逸待劳的因素。我觉得这主要是有支持的球迷看的原因,并且也分强弱球队,对于弱队更明显。因为弱队去客场输球了,球迷还支持你,要是当着球迷的面不争气,就寒心了,失去球迷支持的打击太大了。而对于强队,战绩很重要,主客场都要争,都要赢,主场优势反而不是太突出。

对于主客场战绩差异显著的球队应当尤其注意,像下图的主客场胜率差排第一的公牛,主场胜率超过70%,客场胜率却排倒数第二。对这样的球队,预测胜负时,主客场是关键因素。比如,想在客场战胜骑士和老鹰,不比在主场击败火箭和小牛容易。

以上就是最基本的统计数据了,知道了比赛的两只球队的实力排名,和各自的主客场表现,基本就可以锁定稍高于25%的中奖概率了。为什么只敢说稍高于25%呢?举个例子,我猜了6场比赛,分为3注买,即便猜对了5场(真的很难很难),那我也只中了两注,中奖率为66.7%。如果猜对了4场,猜错的两场不幸分散在不同的两注里,那我的中奖率就只有保本的33.3%了。再考虑一下:每天有不少比赛都是实力相差无几的球队在比,而且博彩公司会开出强队让弱队n分后再比胜负的规则。所以还需继续努力,有两个方向需要奋斗:一,提高预测的准确率;二,尽可能地将预测错误的场次放到一块,这样能在相同预测准确率的情况下提升中奖率。

NBA无弱旅

体育界经常好说一句话:什么什么联赛无弱旅。比如德甲无弱旅,英超无弱旅,甚至还有说中超无弱旅的。但就我个人长期的看球经验总结,最最能配得上“无弱旅”的就是NBA了。至于为什么,因素很多,一方面NBA的机制是今年倒数的球队来年可以选择更好的选秀球员,另一方面NBA虽然大部分比赛是五个人的团体比赛,但是不少时候还真是一个人的比赛(亮瞎眼的巨星时刻,一鸣惊人的菜鸟等)。其他因素还有篮球运动本身特点,NBA裁判倾向于将悬念留到最后等。我们不妨看看数据。这是联盟排名倒数6位的球队,在最近一个月里所赢下的比赛中对手胜率的分布图。可以看到不仅所有的都有击败不少胜率在0.3~0.7之间的中游球队,更是有四只球队击败过胜率超过0.7的强队。所以弱队赢强队并不是一件可以忽视的小概率事件。既然NBA无弱旅,是不是已经感觉到预测胜负比想像的要难呢?

一个人的球队

2013-12-6,时任东部倒数第二的篮网在主场83-113输给了倒数第三的尼克斯,紧接着尼克斯主场73-114负于当时东部第四凯尔特人。2013-12-11正好赶上凯尔特人对阵篮网的比赛,我预言这是一场篮网稳输的比赛,并带领室友们购买了多注。结果篮网居然主场104-96胜了凯尔特人。那天中午,我在新闻上看到篮网核心控卫威廉莫斯复出,并砍下全场最高分。在nba,核心后卫或者核心中锋往往是比赛胜负的关键。公牛队的罗斯,另一名nba顶级控卫,此赛季复出,结果在2013-11-23这天的比赛中又受伤了,赛季报销。我们就来看看这两名核心球员对各自球队的胜率影响。

win.rate.qianhou("布鲁克林篮网", "2013-12-10", 6)
[1] "布鲁克林篮网 在2013-12-10前后6场的胜率对比:0.333333:0.500000"
win.rate.qianhou("芝加哥公牛", "2013-11-23", 6)
[1] "芝加哥公牛 在2013-11-23前后6场的胜率对比:0.833333:0.166667"

如上所示,核心球员的影响非常明显。至于罗斯对于公牛影响为何如此显著,一方面是因为缺少罗斯的公牛实力大损,另一方面球队实力减弱后,如果冲击季后赛无望,球队可能会调整战略,并不是场场都拼。所以留心球队核心是否缺阵也是预测的重要因素。但是,作为娱乐事业,又怎么能为了买竞彩天天去看新闻呢?所以当听说谁缺阵了,警惕一下就好。

强队的底蕴

足球界通常好提豪门的底蕴,像巴塞罗那,皇家马德里,曼联,拜仁慕尼黑,以及近几年的曼城都是豪门俱乐部,当然也有人敢说中超的鲁能是豪门的。豪门俱乐部的特征通常有输也不会输的很难看,败也很少连着败。nba由于近年来强弱球队交替较快,不怎么提豪门,但其每年在其位的强队的特征也跟豪门是一样的。一个真正的强队是不允许自己连输3场的,连输2场的情况也会极少出现。这也说明强队的状态是很稳定的。所以,一看某强队连输2场,下一场就去买其对手赢是极不明智的。强队底蕴是我目前认为的最稳定的特征。要以此预测胜负,我们先要锁定真正的强队。看下图数据,一方面可以看看排名前几的球队是否达到了上面所提的指标,可以用上面的指标检验哪些是真正的强队。有更高的胜率也不一定具备强队底蕴,当前我心中的强队就是图中标蓝的5只。

强队连败时,会严重影响我对其下场赢球的信息,我需要拿上面的数据去验证是否有强队底蕴。同样的,若队连胜时,也会极大提升我对其下场赢球的期望,如果就此买此队下场赢很可能就会被骗了。举例说明,猛龙在12-21和12-23连克西部劲旅小牛和雷霆,要知道雷霆可是排在总胜率第一位,且刚刚在客场大比分干掉马刺。但是12-24猛龙输了马刺13分。如果靠这些就认为猛龙赢马刺巨稳,压个20¥了,就game over了。从心理上讲,连胜和连败也都容易让人放松对真实实力的把握。再说今年横扫亚洲赛场的广州恒大打世俱杯,又赢下了首场,一些球迷不就开始认为恒大能与拜仁一拼吗?其实要冷静地想:对比实力代表理性,看势头代表感性。下图中标蓝的球队就是我认为当前“弱队底蕴”比较显著的5只。

输赢分差要分主客场

上面的分析都是为能更好地预测比赛胜负的,而实际上,我通常选的2¥变6¥竞猜是一种猜让分胜负的,所以看各球队赢球时的场均赢分,输球时的场均输分也很有必要。前面的分析已经可以看出主客场对球队影响很大。从下图不难看出,对大部分球队而言,主场赢球通常比客场赢球能赢更多的分,主场输球通常比客场输球会输更多的分。值得我注意的明显特征就是下图中绿色和红色的部分,可以看出,快船,热火,鹈鹕主场输分都很低,看来这几只球队在家乡观众面前即便输球,也要战斗到最后一刻。而奇才,湖人到了客场,输起球来就没有底限。所以当博彩设注湖人客场输9.5分时,我就直接下注了,因为相信湖人不会少输。再看看步行者,火箭,森林狼主场的攻击力真是够强的,不像开拓者主场虽然好赢球,但不爱赢太多。至于具体到每场比赛的预测,就要对着表看了。当然还要用最新的数据跑出最新的表。

上面的数据分析,主要是统计层面的。但是知道需要统计什么也并非一件易事,我主要是在看比赛,买竞彩中感觉到一些规律,然后再去做数据统计或验证,一些不靠谱的猜测就没有放到上面说了,还有一些不够成熟的猜测也尚未进行验证。

为什么没能赚更多?

这是一个只有亲自尝试才能体会深刻的问题。我的室友这么总结过:“如何在买彩票时保持良好的心态? 总结这些日子买彩票的经历,也得出了一些结论。货币基金是5%,如果抱着5%的心态去买股票和基金,那轻松能获得10%。如果抱着10%的心态去买足彩,那轻松能获得至少20%。 可是问题是,10%在股票和基金中又算什么呢?20%在彩票中又算什么呢? 一旦进入到一个领域,自然而然地就会用这个领域中的标准来衡量得失,从而产生各种贪婪恐惧。”其实,“为什么没能赚更多?”的答案就是:贪婪。当我想赚更多的钱时,我就会预测更多的比赛,买更多的注,对觉得稳的注就会投更多的钱,同时我也冒着更大的风险了,谈不上能每次都能控制成本了,损失是在所难免的。买竞彩这其中,如何更好规避风险,控制成本,也涉及到其他还需要去学习和体会的经济知识了。相信“没能赚更多”是一个普遍的问题。

小结

买竞彩一月是历险的一个月。历险至今,我还活着,相信这只是历险的开始!不要以为这是一个激情豪迈的宣誓,其实“竞彩事业”虽然会继续,但是还是会以娱乐的方式进行,每天投几注,增加一点欢乐。最后告诫大家:小赌怡情,大赌伤身。

:如果你还看过我的《火车警示录》,那你一定知道那是为买从北京出发的火车票的人写的警示录,正值放假回家季,请帮我再分享一次,多谢了。

附:以上全部数据皆源于以下代码。

nba <- read.table("../resources/nba/nba1223.txt", sep="\t", header=T, as.is=c(T,F,T,T,T,F))
nba <- na.omit(nba)
nba$date <- as.Date(nba$date)
nba$win[nba$diff < 0] <- -1 #主场赢
nba$win[nba$diff > 0] <- 1  #客场赢

#原分差有误,重新计算分差:客场-主场
nba$diff <- sapply(strsplit(nba$score, ":"), FUN=function(x){return(as.integer(x[1])-as.integer(x[2]))})

#设置日期限制,一边计算的数据能更好地预测
start.date <- "2013-11-23"
nba <- nba[nba$date >= start.date,]
print(start.date)
#计算主场胜率排行和客场胜率排行榜
win.lose.zhu <- table(nba$zhudui, nba$win)
win.rate.zhu <- sort(win.lose.zhu[,"-1"]/rowSums(win.lose.zhu), decreasing=T)  #主场胜率排行榜
print("主场胜率排行")
print(win.rate.zhu)
win.lose.ke <- table(nba$kedui, nba$win)
win.rate.ke <- sort(win.lose.ke[,"1"]/rowSums(win.lose.ke), decreasing=T) #客场胜率排行榜
print("客场胜率排行")
print(win.rate.ke)
#rm(win.lose)

#计算胜率排行榜
win.rate.all <- (win.lose.ke[,"1"]+win.lose.zhu[,"-1"])/(rowSums(win.lose.ke)+rowSums(win.lose.zhu))
win.rate.all <- sort(win.rate.all, decreasing=T)
print("胜率总排行")
print(win.rate.all)

#对一些球队,主客场对胜负影响很大
win.rate.diff <- win.rate.zhu[sort(names(win.rate.zhu))] - win.rate.ke[sort(names(win.rate.ke))]
win.rate.diff <- sort(win.rate.diff, decreasing=T)  #主客场胜率差排行榜
print("主客场胜率差排行")
print(win.rate.diff)

#一只球队的战绩
schedule.oneteam <- function(team){
  schedule.zhu <- nba[nba$zhudui==team, c("date", "kedui", "diff", "win")]
  schedule.zhu$diff <- -schedule.zhu$diff
  schedule.zhu$win <- -schedule.zhu$win
  names(schedule.zhu)[2] <- "rival"
  schedule.ke<- nba[nba$kedui==team, c("date", "zhudui", "diff", "win")]
  names(schedule.ke)[2] <- "rival"
  schedule <- rbind(schedule.zhu, schedule.ke)
  schedule$zhuke <- c(rep("主场", nrow(schedule.zhu)), rep("客场", nrow(schedule.ke)))
  return(schedule[order(schedule$date),])
}
#schedule.oneteam("密尔沃基雄鹿")

#nba无弱旅,弱队能赢强队,看看弱队赢球队的强弱分布,使用饼图
#require("ggplot2")
win.distribution <- function(team){
  zhu.win.team <- nba$kedui[nba$zhudui==team & nba$win==-1]
  ke.win.team <- nba$zhudui[nba$kedui==team & nba$win==1]
  win.team <- c(zhu.win.team, ke.win.team)
  #zhu.ke <- c(rep("主场", length(zhu.win.team)), rep("客场", length(ke.win.team)))
  data <- win.rate.all[win.team]
  data <- cut(data, c(0, 0.3, 0.7, 1))
  #print(qplot(win.rate.all[win.team], colour = zhu.ke, position="dodge", geom="bar"))
  #pie <- ggplot(data, aes(x=factor(1), fill=factor(data))) + geom_bar() + coord_polar(theta="y")
  print(pie(table(data)/length(data), main=team))
}
#sapply(names(tail(win.rate.all, n=5)), win.distribution)

#计算某球队某日期前后的胜率对比
#n为场次
win.rate.qianhou <- function(team, date, n){
  schedule <- nba[nba$zhudui==team | nba$kedui==team,]
  schedule.qian <- tail(schedule[schedule$date<date,], n)
  win.rate.qian <- (sum(schedule.qian$zhudui==team & schedule.qian$diff<0)+sum(schedule.qian$kedui==team & schedule.qian$diff>0))/n
  schedule.hou <- head(schedule[schedule$date>=date,], n)
  win.rate.hou <- (sum(schedule.hou$zhudui==team & schedule.hou$diff<0)+sum(schedule.hou$kedui==team & schedule.hou$diff>0))/n 
  return(sprintf("%s 在%s前后%d场的胜率对比:%f:%f", team, date, n, win.rate.qian, win.rate.hou))
}
#win.rate.qianhou("布鲁克林篮网", "2013-12-10", 5)
#win.rate.qianhou("休斯顿火箭", "2013-12-10", 5)

#极稳:一个强队不会允许连输三场,尤其第三场在自己的主场。如马刺,热火,火箭
#这个函数算连败记录,非常巧妙,想了很长时间
#hot <- schedule.oneteam("迈阿密热火")
streak <- function(team, lose=T){
  schedule <- schedule.oneteam(team)
  lose.str <- paste(schedule$win, collapse="")
  lose.str <- gsub("-1", "0", lose.str)
  split <- if(lose) "1+" else "0+"
  type <- if(lose) "连败" else "连胜"
  lose.counts <- nchar(unlist(strsplit(lose.str, split)))
  lose.max <- max(lose.counts)
  max.num <- sum(lose.counts %in% lose.max)
  return(sprintf("%s %s记录为 %d 场,出现过 %d 次", team, type, lose.max, max.num))
}
#streak("迈阿密热火", lose=F)
sapply(names(head(win.rate.all, n=15)), streak)
sapply(names(tail(win.rate.all, n=15)), FUN=function(x,lose=F)streak(x, lose))

#计算主客场输赢分差均值
diff.zhu.win <- sapply(names(win.rate.zhu), function(x)return(-mean(nba$diff[nba$zhudui==x & nba$diff<0])))
diff.ke.win <- sapply(names(win.rate.ke), function(x)return(mean(nba$diff[nba$kedui==x & nba$diff>0])))
diff.zhu.lose <- sapply(names(win.rate.zhu), function(x)return(-mean(nba$diff[nba$zhudui==x & nba$diff>0])))
diff.ke.lose <- sapply(names(win.rate.ke), function(x)return(mean(nba$diff[nba$kedui==x & nba$diff<0])))
diff.all <- cbind(diff.zhu.win, diff.zhu.lose, diff.ke.win, diff.ke.lose)
diff.all[names(win.rate.all),]