2010, 2011 & a $4K/month Challenge

A few months back with what seemed like two months of work left to do, I publicly committed myself to launching jMockups in four weeks. The number of things I wanted to get done prior to launching was daunting, but I desperately needed to get the product out there and in the hands of actual users to start collecting feedback.

How’d it go? I didn’t launch it in four weeks; I launched in less than three.

Public accountability is a powerful thing. Sebastian Marshal writes about his own experience:

If I hadn’t set this goal and been accountable publicly, to my friend and to everyone who reads here, I wouldn’t have done it in two weeks. Honestly – I’m pretty internally motivated, but I’ve had a lot of stuff going on the last two weeks, it wouldn’t have happened. But it did happen, largely because I was publicly accountable.

This productivity hack that works especially well for me. I’m an INTJ on the Meyers Briggs type indicator and one of our defining characteristics is the value we place on competence. By publicly committing myself to launch, I put my own competence on the line so I did what it took to meet the goal. Practically this meant postponing a lot of the things on my todo list until after the launch, working some long nights and weekends, and taking a week off of work.

Publicly committing myself worked well for me once, so I’m trying it again.

The Scene

I spent most of 2010 building. I launched Preceden in late January and continued working on it through May. In June I started working on jMockups and launched it in late October. My focus in 2010 (and largely 2009 and 2008) was on learning and building. I knew I eventually wanted to make money off of the apps, but money wasn’t my primary goal.

I’ll be with my current job until October 2012 so I can’t pursue this full time just yet. Because I have a day job I’ve never had to rely on my web app income to survive. It’s always been like Oh, I had another sign up. That’s nice. That’s got to change.

October 2010–a mere 21 months away–will approach fast. In order for web app development/entrepreneurship to be viable long term, I have to start making more money. My true passion lies in building things–not money–but without money I can’t spend my time building things.

The Goal

I don’t have exact numbers (which is part of the problem), but Preceden currently makes about $500/month and costs $70 to operate. jMockups makes $24/month (whohoo!) and costs about $200/month to operate (doh!). Taken together, I’m making about $250/month.

It’s not entirely fair to value the apps in terms of their current profits, but that’s obviously a big part of it. Preceden targets a small niche and has a small goal: be the best timeline tool. jMockups targets a large niche and has an ambitious goal: improve the way people design websites. Long term, jMockups has the potential to be a home run; Preceden doesn’t.

With that in mind:

My goal is to make $4,000 per month from Preceden and jMockups by the end of 2011.

That’s about 16x what they make now. If a public commitment isn’t scary, it’s probably not ambitious enough. And since this is terrifying, I figure it’s a good number to shoot for.

I’ll make monthly progress updates starting at the end of January.

The Plan

Preceden has a marketing problem. It’s is a quality tool that has a lot of happy users, but not enough people know about it. I need to get more people to the site and need more of them to convert to paying customers. My plan with Preceden is to start marketing it heavily (via things like AdWords), perform lots of A/B testing, and optimize the hell out of it by way of extensive analysis. If I can get Preceden to a point where outbound marketing has a measurable positive ROI, I’ll be in really good shape.

jMockups has a product problem. The tool is good, but not great. Trying to change the way people design websites is hard (I probably should have picked a more narrow niche to start with, but that’s another story). I’ve been adding two or three new features a week since it launched in October, but I haven’t spent much time on the other things it takes to create a successful web product. For example, there’s currently way too much friction from when a user arrives at the site and to when they create a mockup that they’re happy with. And it shows in the usage metrics (75% of new users create 1 mockup and never come back). In 2011, I’ll continue working on the product but I’ll place a stronger emphasis on usability, education, and building a community. The revenue should follow from doing these things well.

I have a sole founder problem. But not really. I like the independence of working alone, but having someone else to build with and bounce ideas off of would be great. I’m not going to spend a lot of time actively searching for a cofounder, but if the opportunity presents itself I’d definitely give it a shot. (Interested? Drop me a note: matthew.h.mazur@gmail.com)

###

So here’s to 2011. I don’t know how things are going to turn out, but hopefully with this public commitment they’ll turn out a little bit better than they otherwise would have.

Poker Bot Preflop Strategy Explained

This is post #19 in an ongoing series of articles about my work as a poker bot developer.

When I first attempted to build a poker bot, I tried long and hard to come up with a single algorithm that given your two hole cards and the situation would spit out call, raise, or fold for every situation that the bot could face. Turns out its not a trivial task. There are a lot of factors that should affect your decision: your hole cards, your image, your opponent’s style, your position, the stack sizes relative to the blinds, the recent hand history, the stack to pot ratio once the flop hits and, and the history so far in the hand (in the case of three and four bets). To quantify all of this information – let alone weigh it in an intelligent way – is difficult, to say the least. After several weeks of fruitless attempts, I abandoned it in favor of a simpler, albeit less elegant solution.

At its core, my solution boils down to conditional statements using a simplified version of the current situation. Consider this:

“If your effective stack sizes is 55 big blinds and you’re the small blind and you’re first to act and your opponent is loose aggressive and you have 8h 6h then you should raise three times the big blind.”

It would be impossible to enumerate every possible combination this way, but if you take some shortcuts, you reduce it to a manageable number of factors.

Stack Size

In order to work with stack sizes, I grouped them together based on the effective stack size (effective stack size uses the smaller of your and your opponent’s stack size because the rest is not in play):

0 – 10bb: Shortstacked

10 – 15bb: Danger Zone

15 – 22bb: Red

22 – 35bb: Orange

35 – 50bb: Yellow

50 – 75bb: Green

(The maximum effective stack size you can have on PokerStars’ Heads Up SNGs is 1500/20 = 75 bb.)

These groups were based on my observations watching the bot and on the postflop stack to pot ratios.

Previous Actions

Like stack sizes, it would be impossible to list out every possible combination of actions leading up to current situation, so I used a shorthand:

1 = You’re small blind

2 = You’re big blind

All previous actions are reduced to C (call) or R (raise) and the size of the raises are ignored completely.

Examples:

– You’re small blind and just dealt: 1

– You’re big blind and your opponent raises: 2R

– You’re small blind, you limp and your opponent raises: 1CR

– You’re big blind, your opponent raises, you three bet, and he four bets: 2RRR

Every preflop decision can be represented this way.

Hole Cards

It’s generally not a good idea to group holecards beyond the standard 9s 9h = 99, 9s 8h = 98o, etc. There are times when 88, 99, and TT should be treated the same and other times when TT should be treated differently, so it won’t do you much good to create a “Mid Pocket Pair” group and treat everything in it the same way.

That being said, specifying an action for all 169 simplified hole card combinations for every situation would would be a tedious task to do by hand. In an effort to manage it, I created a seperate program specifically for creating ranges and assigning actions to the holecards. I called it Range Maker:

(If you’ve seen ALL IN Expert, the poker calculator that I developed after the poker bot, Range Maker is where the idea came from.)

There are two versions of Range Maker shown in the screenshot above. Below the grid on the left is the older version; on the left is newer version. The grid serves both.

The older version lets me assign a fold, call, raise, or push action to every hole card combination in the selected range.

In the example below, orange represents call, maroon a 3x raise, cyan push, and gray/pink fold:

As time went on I expanded it to include additional options:

The numbers on the right represent the distribution of raise/call/fold for that color. The randomness was necessary to fool observant opponents and PokerStars security, in case that was something they looked at. The decision to push or raise 3x was later delegated to software, which figured out what the stack to pot ratio would be postflop if the opponent called and pushed if it was too high.

Here’s an example of what the range looks like for the small blind opening range vs an aggressive opponent when the stack size was in the red zone (15 – 22 bb):

And here’s the same spot vs a call station:

It took a long time to get these ranges down. I would sit there and watch the bot play for hours, making pages of notes on what I wanted to adjust when the session was over.

For those of you looking for a bit more, here are the range files I used with each version:

These include virtually every range I ever worked with, so if you want to use these you’ll have to spend some time analyzing them to pick out the gems.

Putting it All Together

Here’s roughly how it went in an actual game:

1. Analyze the current situation: hole cards, stack size, previous action, and opponent style and group them.

2. Look up the range based on these factors

3. Act

Example: PokerStars 25/50 blinds, you are small blind with 2100 chips, call station opponent is big blind with 900 and you’re dealt Ks 5h.

Your effective size is 900/50 = 18 big blinds, putting you in the red zone and since you’re small blind and first to act, the previous action is simply “1”. Now with three layers of conditional statements (stack size, previous action, and opponent style) you can look up the range (see the screenshot above) and determine that K5o is 80% raise, 20% call, and 0% fold. Roll a die (in this case the random number generator) and pick an action based on that distribution.

Here’s the corresponding code for step 2:


'------------------------------------------------------------
'  Name    : PreflopActionFromFile
'  Purpose : Given a specific situation, this'll look up my range in
'            the Hero Ranges.txt file and see what I want to do with this hand
'------------------------------------------------------------
'
Public Function PreflopActionFromFile(sHoleCards As String, sRangeName As String) As String

 Dim sRangeFile_Old As String                ' old range file
 Dim sRangeFile_New As String                ' advanced ranging (mixed ranges)
 Dim sNewINIData As String                   ' data from the advanced file
 Dim iDataPos As Integer                     ' start of the distribution
 Dim sDistribution As String                 ' data from that file
 Dim sDistributionSplit() As String          ' split it up

 Dim sSimpleHand As String                   ' AA, AQs...
 Dim dRndNum As Double                       ' a random #
 Dim dRaisePerc As Double
 Dim dCallPerc As Double
 Dim sINIVal As String

 sSimpleHand = SimpleHand(sHoleCards)

 sRangeFile_Old = App.Path & "ResourcesHero Ranges.ini"
 sRangeFile_New = App.Path & "ResourcesHero Advanced.txt"
 sNewINIData = GetFromINI("Range Data", sRangeName, sRangeFile_New)

 If sNewINIData <> vbNullString Then
 ' There is an entry in the advanced range file

 iDataPos = InStr(sNewINIData, sSimpleHand)
 sDistribution = Mid(sNewINIData, iDataPos + Len(sSimpleHand) + Len(" ("), InStr(iDataPos, sNewINIData, ")") - iDataPos - Len(sSimpleHand) - Len(" ("))
 sDistributionSplit = Split(sDistribution, "/")

 ' Make an update
 Update "Mixed Distribution: " & sSimpleHand & " (" & sDistribution & ")", 2, eDecision

 dRndNum = Rnd
 dRaisePerc = Val(sDistributionSplit(0)) / 100
 dCallPerc = Val(sDistributionSplit(1)) / 100

 ' Make a decision...
 If dRndNum <= dRaisePerc Then
 PreflopActionFromFile = "R"
 ElseIf dRndNum <= (dRaisePerc + dCallPerc) Then
 PreflopActionFromFile = "C"
 Else
 PreflopActionFromFile = "F"
 End If

 Update "Action Chosen: " & PreflopActionFromFile, 3, eDecision

 Else

 Update "Hero Range: " & sRangeName, 1

 sINIVal = GetFromINI("Ranges", sRangeName & " (R)", sRangeFile_Old)
 If InStr(sINIVal, SimpleHand(sHoleCards)) > 0 Then
 PreflopActionFromFile = "R"
 Exit Function
 End If

 sINIVal = GetFromINI("Ranges", sRangeName & " (C)", sRangeFile_Old)
 If InStr(sINIVal, SimpleHand(sHoleCards)) > 0 Then
 PreflopActionFromFile = "C"
 Exit Function
 End If

 sINIVal = GetFromINI("Ranges", sRangeName & " (P)", sRangeFile_Old)
 If InStr(sINIVal, SimpleHand(sHoleCards)) > 0 Then
 PreflopActionFromFile = "P"
 Exit Function
 End If

 PreflopActionFromFile = "F"
 End If

End Function

Final Thoughts

This approach covered about 90% of all the preflop situations the bot faced in the course of a game, but about 10% had to be handled with special cases. Consider, for example, an opponent who pushes every time with 75bb. You can’t just treat this as a 2R situation and call with the standard range. There are also a lot of situations where you should shove simply based on its expected value, which you have to figure out in spots that warrant it (which require you to estimate your opponent’s raising and calling range).

If you’re an aspiring botter and have questions about any of this, feel free to shoot me an email. And good luck.

Matt

Poker Blog #2 Archive

During my hey-days as an online poker I kept a blog where I wrote frequently between June and December 2006. An archive of that blog is hosted on this website, which you can read here. I stopped writing when I started working working on the poker bot because it’s not something you can write about publicly without fear of reprisal.

In July 2007, after working on the shortstacking bot for several months, I got it into my head that I’d be better off getting back into poker. Armed with a notebook full of poker formulas, I set out confidently to make a killing. And, of course, I had to start a blog to chronicle my adventures.

But it was not meant to be. After several posts, I decided I didn’t want to write about it publicly. And a little while later, I decided I’d rather work on the bot than play poker, even though playing would probably be more lucrative.

I’m doing some online house-cleaning today–getting rid of accounts I haven’t used in a while–and I stumbled across this blog. It’s not much, four posts, all from July 2007, but I’m posting it here because it’s somewhat interesting and why not.

###

Prelude to a Blog

I’m starting a blog again. It helps me to write my thoughts down, which should ultimately help me be a more profitable player. I have some thoughts as to what I want to accomplish in the future as far as poker goes, but I’m going to hold off details. I’m in the process of moving jobs, which will keep me busy for two to three weeks. Once I am settled in, I will begin a new challenge.

###

Stack Size Math

I tend to play by feel. I have a general sense of pot odds and the effects of stack sizes on my strategy, but rarely do I formally go through the numbers in my head. I’m going to start to focus on the numbers during every hand I play, because I feel it can greatly improve my game.

Honestly I don’t expect to do all of these on every hand, but a general idea is important.

General
I intend to call:
– What are my pot odds/BEP?
– How much will I have remaining if I call?
– How much will the pot be if I call?
– What percentage of my opponent’s stack has he committed total
– What percentage of my stack will I have committed if I call?
– If I’m drawing, how much must I make if I hit for this call to be profitable?

I intend to bet/raise:
– What pot odds/BEP am I offering to my opponent?
– What will be the new pot size if he calls?
– How much will my stack size be?
– How much will his stack size be?
– If he shoves, what will my pot odds/BEP be?

Math
The math for calling scenarios:

Pot Odds = (Total Pot / To Call) : 1
BEP = 1/(1 + Pot Odds)
New Pot = Total Pot + To Call
Stack Hero committed = (Total Pot – To Call) / 2
Stack Villain committed = (Total Pot – Stack Hero Committed)
% Villain committed = Stack Villain committed / (Villain Stack + Stack Villain committed)

Necessary Win = (To Call / Equity) – To Call – Total Pot

If I intend to bet/raise:
Offer Pot Odds = (Bet / (Bet + Total Pot) : 1

Preflop Raise/Shove Scenarios:
Before I raise I should consider the odds I’ll get if he pushes:

Scenario1: Hero is short stacked
Ex: 25/50 blinds. Hero posts SB, leaving 975 behind. Villain posts BB, leaving 1950 behind. Hero raises to 150, Villain shoves.

My Pot Odds = (My Stack + Raise To + SB)/(My Stack – Raise To + SB) : 1

Scenario1: Villain is short stacked
Ex: 25/50 blinds. Hero posts SB, leaving 1975 behind. Villain posts BB, leaving 950 behind. Hero raises to 150, Villain shoves.

My Pot Odds = (His Stack + Raise To + BB)/(His Stack – Raise To + BB) : 1

###

HU Cash, Random Thoughts

I deposited $600 to FTP today using my Mastercard, which surprisingly worked. I played a good two hours of NL100, dropping maybe $300 in the process. I played terribly and was not used to the deep stacks. I will try it again sometime, but I don’t know if I am willing to devote the time to learn a new type of game, when SNGs are so profitable for me.

My current plan is to do a 2 year, $100k challenge. This is on top of my day job, which should occupy 8-4 on weekdays. The extra money will help me keep my options flexible and it will go a long way for many years to come.

Heads Up SNGs are… deceptive. You can make $500 one day, lose $300 the next day, make $200, lose $150. How much have you actually made? $62.50/day. My point is that just because you have big wins, doesn’t mean that thats actually what you’re making. Take this guy for example:

rockets23
Games: 7106, Avg Stake: $491
Net: $13,658
ROI: 1%, $/Game: $2

I’ve seen this guy around for a long time. He’s played 7100 games and made a whopping $13k. $2/game. That’s equivalent to someone playing $20s with a 10% ROI. What good has the high stakes gotten him? If he would have stayed at a lower stake and made $5/game, he’d have $32k now instead of $13k. The lesson is this: Stay at a stake that you can make a good $/hr. Otherwise, you’re just wasting your time…

###

Epiphany

I had a realization this evening: this blog is bad for me. Ironic, since I restarted this last night.

For a long time I thought that keeping my performance public would keep me accountable. The truth is that it is keeping me from reaching my potential as a poker player. The greatest poker player would be accountable only to himself. I like writing, but not for others. I can’t really be honest here. There is just too much ego inherent in a blog, especially one about poker. As much as I try to write without asking “What will they think if I write this?” its very difficult to do in practice. I find myself distancing myself from my mistakes when I play. Its even harder to admit to in a blog, because you want people to respect your play.

I will keep writing, but it will primarily be in a Word document on my desktop rather than a Blogspot page. I’ll update this blog as big things happen.