Blog

Roth Conversion vs ACA Subsidy: The Cliff Is Back

Two dollars of income cost a couple I was modeling last week $9,574. Not two thousand — two. That is the Roth conversion vs ACA subsidy problem in one line, and as of January it is live again for anyone retiring before 65.

The enhanced premium tax credits that ran from 2021 through 2025 expired on December 31 and were not extended. What came back with them is the old 400%-of-the-federal-poverty-line cliff: below it you get a subsidy, above it you get nothing at all. Not a taper. Nothing.

Chart of the 2026 ACA subsidy cliff: household premium rises gently with income, then jumps from $8,426 to $18,000 at $84,600 of MAGI
What a married couple pays for a benchmark silver plan as income rises. At 400% of the federal poverty line the premium tax credit disappears all at once — which is why a Roth conversion in a pre-Medicare year needs to be sized, not guessed.
Continue reading “Roth Conversion vs ACA Subsidy: The Cliff Is Back”

Every Constraint in My Excel NBA DFS Optimizer

A few days ago I wrote that a basketball rules file would come out nearly empty, and that the interesting part of an NBA optimizer is not the optimization. Then I went looking for something else and found a workbook I had forgotten I wrote: FCP Optimizer — Master v6.7, an NBA daily fantasy optimizer in Excel, with a change log that starts at version 4. So rather than speculate about NBA DFS optimizer constraints, here is the actual model, read straight out of the file.

It is a mixed integer program with about 200 binary variables, solved by CBC through the OpenSolver add-in. Everything below is what the sheet and its macros really do, not a cleaned-up version of it.

Diagram of the mixed integer program inside the Excel NBA daily fantasy optimizer, showing objective and seven constraints
Continue reading “Every Constraint in My Excel NBA DFS Optimizer”

The Textbook Fix That Made My MILP Twice As Slow

The textbook move, when a mixed-integer program solves slowly, is to tighten the linear relaxation. Add the constraint that makes the LP bound closer to the integer optimum, give branch and bound less room to wander, watch it finish faster.

I did that to the stacking constraint in my hockey lineup optimizer last week. It got twice as slow. Same slate, same solver, same lineups out the other end — 2.20 seconds a lineup before, 4.38 after. I reverted it and left a comment telling future-me not to helpfully fix it again.

Bar chart of seconds per lineup by stacking formulation: naive 3.00, cover inequalities 2.20, two-sided counters 4.38
Three formulations of the same constraint, same slate and solver. The textbook tightening is the slowest of the three.

Continue reading “The Textbook Fix That Made My MILP Twice As Slow”

A Free NHL Lineup Optimizer for DraftKings

The NHL lineup optimizer is live. Free, no account, no email, no cap on lineups. You upload one file — the player pool exactly as it downloads from DraftKings — and it hands back a CSV formatted for re-upload.

It is the hockey version of the football optimizer and the baseball one, same solver underneath, a different rulebook on top. Hockey turned out to be the easiest of the four sports I have tried, which was a pleasant surprise after basketball, where the stacking rules turned out to barely exist at all.

NHL DFS lineup optimizer rules screen showing line and power-play stacking, goalie rules and diversity caps
The rules screen. Tier 1 is DraftKings’ own rules, Tier 2 shapes a single lineup, Tier 3 is how the set differs from itself.

Continue reading “A Free NHL Lineup Optimizer for DraftKings”

NBA DFS Correlation: 3 Seasons, 500,000 Pairs

In the last post I argued that basketball gives an optimizer nothing to stack, because no rule of the sport links two players’ scores the way a batting order or a quarterback does. That was reasoning, not evidence. So I pulled three seasons of box scores and actually measured NBA DFS correlation — 62,681 player-games, 3,690 games, and 505,721 pairs of players who shared a floor.

The short version: the structural argument holds, the numbers are far smaller than most stacking advice implies, and the most interesting thing in the data is something I had predicted backwards.

Line chart of NBA teammate and opponent DraftKings score correlation crossing as the final margin widens
Continue reading “NBA DFS Correlation: 3 Seasons, 500,000 Pairs”