如何创建并调用Python类计算体育投注场景下的凯利准则数值
解决办法
核心问题点
- 类的实例方法缺失必填的
self参数:Python中所有类的实例方法,第一个参数必须是self,用来指向当前创建的实例对象,所有实例属性都要绑定到self上才能在不同方法间共享。 - 实例数据未共享:你创建了3个独立的
KellyCriterion实例,分别存胜率、存赔率、计算结果,不同实例之间的属性是完全隔离的,计算方法自然拿不到前两步的输入值。 - 方法调用存在拼写错误:你定义的赔率转换方法叫
convert_to_decimal,调用时写成了convert_to_decimals多了尾缀s。 - 输入处理和公式存在逻辑问题:
- 用户输入的胜率是百分比数值(比如输入60代表60%胜率),需要除以100转成0.6的小数形式才能代入公式
- 你给出的公式分子分母都有
(odds - 1),会直接约掉得到1 - winP,和标准凯利公式不符,修正为标准形式kCrit = (winP * odds - 1) / (odds - 1),计算结果是你当前总资金应该投入的比例,结果为负说明该投注没有盈利价值。
修正后的完整代码
class KellyCriterion: def __init__(self): # 初始化实例属性,用来存储后续获取的胜率和赔率 self.winP = None self.decimal_odds = None def win_percentage(self): # 获取用户输入的胜率(百分比格式),转成小数存在实例属性中 win_percent = int(input('What is your win percentage?: ')) self.winP = win_percent / 100 def convert_to_decimal(self): # 获取用户输入的美国赔率,转成十进制赔率存在实例属性中 american_odds = int(input('What are the American odds?: ')) if american_odds > 0: self.decimal_odds = (american_odds / 100) + 1 elif american_odds < 0: self.decimal_odds = -(100 / american_odds) + 1 else: raise ValueError("美国赔率不能为0") def implement_kc(self): # 校验前置数据是否存在 if not self.winP or not self.decimal_odds: raise ValueError("请先获取胜率和转换赔率后再计算凯利值") # 标准凯利准则公式,结果为总资金应投入的比例,负数返回0代表无投注价值 kCrit = (self.winP * self.decimal_odds - 1) / (self.decimal_odds - 1) return max(kCrit, 0)
使用示例
# 只需要创建1个实例即可,所有数据存在这个实例中 kelly_calc = KellyCriterion() # 依次执行获取胜率、转换赔率、计算结果 kelly_calc.win_percentage() kelly_calc.convert_to_decimal() bet_ratio = kelly_calc.implement_kc() print(f"建议投注比例为总资金的{bet_ratio:.2%}")
内容的提问来源于stack exchange,提问作者Able Archer
相关产品推荐
相关产品推荐

