基于Pinnacle数据为tibble新增期望值(EV)列的技术问询
分组Tibble中基于Pinnacle数据计算期望值(EV)的解决方案
核心计算逻辑
针对每个比赛分组:
- 主队行EV = Pinnacle主队的
no_vig_bep× 当前行win值 - (1 - Pinnacle主队的no_vig_bep) × 100 - 客队行EV = (1 - Pinnacle客队的
no_vig_bep) × 当前行win值 - Pinnacle客队的no_vig_bep× 100
示例数据集
先构造一个符合grouped_df结构的示例:
library(tibble) library(dplyr) # 模拟分组后的数据集 grouped_df <- tibble( match_id = rep(1:2, each=4), bookmaker = c("Pinnacle", "Pinnacle", "Bet365", "Betfair", "Pinnacle", "Pinnacle", "William Hill", "Ladbrokes"), side = c("home", "away", "home", "away", "home", "away", "home", "away"), win = c(190, -110, 200, -105, 180, -108, 195, -112), no_vig_bep = c(0.526, 0.474, NA, NA, 0.518, 0.482, NA, NA) ) %>% group_by(match_id)
计算代码
利用dplyr的分组操作,在每个比赛组内提取Pinnacle的对应值并计算EV:
grouped_df_with_ev <- grouped_df %>% mutate( # 提取当前分组中Pinnacle主队的无抽水胜率 pinnacle_home_bep = first(no_vig_bep[bookmaker == "Pinnacle" & side == "home"]), # 提取当前分组中Pinnacle客队的无抽水胜率 pinnacle_away_bep = first(no_vig_bep[bookmaker == "Pinnacle" & side == "away"]), # 分情况计算EV ev = case_when( side == "home" ~ pinnacle_home_bep * win - (1 - pinnacle_home_bep) * 100, side == "away" ~ (1 - pinnacle_away_bep) * win - pinnacle_away_bep * 100, TRUE ~ NA_real_ ) ) %>% # 移除临时变量(可选) select(-pinnacle_home_bep, -pinnacle_away_bep)
计算验证
以match_id=1的Bet365主队行为例:
- Pinnacle主队
no_vig_bep=0.526,Bet365主队win=200 - EV = 0.526×200 - (1-0.526)×100 = 105.2 - 47.4 = 57.8
运行代码后,该行的ev列值会匹配此计算结果。
内容的提问来源于stack exchange,提问作者Aaron Morris
相关产品推荐
相关产品推荐

