You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何创建并调用Python类计算体育投注场景下的凯利准则数值

解决办法

核心问题点

  • 类的实例方法缺失必填的self参数:Python中所有类的实例方法,第一个参数必须是self,用来指向当前创建的实例对象,所有实例属性都要绑定到self上才能在不同方法间共享。
  • 实例数据未共享:你创建了3个独立的KellyCriterion实例,分别存胜率、存赔率、计算结果,不同实例之间的属性是完全隔离的,计算方法自然拿不到前两步的输入值。
  • 方法调用存在拼写错误:你定义的赔率转换方法叫convert_to_decimal,调用时写成了convert_to_decimals多了尾缀s。
  • 输入处理和公式存在逻辑问题:
    1. 用户输入的胜率是百分比数值(比如输入60代表60%胜率),需要除以100转成0.6的小数形式才能代入公式
    2. 你给出的公式分子分母都有(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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 23:36:00