'How to create and call on a Python Class to calculate Kelly Criterion formula for sports betting?

I am trying to create a Python Class to calculate the Kelly Criterion formula in order to determine the precise bet size for an individual sport's investment. I am not very good with using the Class function or init function and could use some help.

The Class I am trying to create uses three functions:

  1. Function 1 asks the user to input the estimated win percentage of the bet (saved to variable 'winP').

  2. Function 2 asks the user to input the American odds for this particular bet. I then convert the American odds to Decimal odds to use with the Kelly Criterion formula (saved to variable 'odds').

  3. Function 3 takes 'winP' and 'odds' and implements this data into the Kelly Criterion formula.

The Kelly Criterion formula that I am using is:

Kelly Criterion (kCrit) = ((odds - 1) * (1 - winP)) / (odds - 1)

'odds' is the Decimal form of the American odds after conversion. 'winP' in the expected winning probability of this particular bet.

I was able to get the 1st and 2nd function to work perfectly (win_percentage, convert_to_decimal), however I was unable to get the 3rd function to work (implement_kc)

Here is my code below:

class KellyCriterion:
    
    def win_percentage(percent):
        
        winP = int(input('What is your win percentage?: '))
        return winP


    def convert_to_decimal(odds):

        odds = int(input('What are the American odds?: '))
        
        if odds > 0:
            odds = (odds/100) + 1
            return odds
        elif odds < 0:
            odds = -(100/odds) + 1
            return odds
        
    def implement_kc(winP, odds):
        
        kCrit = ((odds - 1) * (1-winP)) / (odds-1)
        return kCrit

winPercent = KellyCriterion()
winPercent.win_percentage()

betSize = KellyCriterion()
betSize.convert_to_decimals()

I was not sure how to call on the 3rd function properly:

kelly = KellyCriterion()
kelly.implement_kc()

I received an error: NameError: name 'winP' is not defined.

I am a beginner with using Class functions and could use some help. I also tried using an init(self) function but not exactly sure how those work.

Any suggestions would be greatly appreciated. Thanks in advance for any help that you may offer.

Just to clarify the 1st function (win_percentage) and 2nd function (convert_to_decimal) work just fine. I am having issues with the 3rd function (implement_kc).

I would like to find a way to call on the KellyCriterion Class to: 1) ask the user what is their win percentage; 2) ask the user what are the American odds; 3) implement both of their responses into the Kelly Criterion formula to find out the appropriate bet size.

Thanks again!



Solution 1:[1]

If you want to write a class, you need to pass self to the functions. Moreover, the way you have winPercent = KellyCriterion() and betSize = KellyCriterion() means you have two separate instances of the KellyCriterion class, which don't communicate with one another. What you want, is a single instance so you can assign both winP and odds to that instance, otherwise any call to the implement_kc() method is going to be missing values and return an error.

As an aside, here's a post that shows a class-based implementation of the Kelly Criterion and some more background on how it's done. Could be helpful for reference.

Anyway, here's some code that will work, at least if I understand what you're trying to accomplish:

class KellyCriterion:
    
  def win_percentage(self):
      
    winP = int(input('What is your win percentage?: '))
    self.winP = winP / 100

  def convert_to_decimal(self):

    odds = int(input('What are the American odds?: '))
    
    if odds > 0:
      self.odds = (odds/100) + 1
    elif odds < 0:
      self.odds = -(100/odds) + 1
      
  def implement_kc(self):
      
    kCrit = ((self.odds - 1) * (1-self.winP)) / (self.odds-1)
    return kCrit

If we run it:

KC = KellyCriterion()
KC.win_percentage()
KC.convert_to_decimal()
print(f"Wager: {KC.implement_kc():.2f}%")

If we enter, say 51 and -110 when prompted for input, then we get:

Wager: 0.49%

Now each of the input functions you defined assign an attribute to the class (e.g. self.winP and self.odds) that the implement_kc() method will use later when you call it.

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 hubbs5