Price forecast: which generics get expensive next
Every generic drug market in the country, ranked by the modeled chance that its pharmacy price — NADAC, the national average of what pharmacies actually pay — rises sharply soon. Two targets, one toggle: +50% within 6 months or +25% within 3 months. Each row shows the probability, the exact inputs it was computed from, and the Medicaid dollars at stake, because a prediction you can't audit isn't worth publishing.
Freshness: scored 2026-09-03 from the latest NADAC file; models trained 2026-09-02 and backtested on data they never saw. Scores refresh daily; the models are refit deliberately, and every fit is kept so a published number can always be traced to its coefficients.
ⓘ How this was built
- CMS NADAC — weekly feed plus yearly archives, 2013–present (data.medicaid.gov)
- ACA FUL weighted-average AMP series (manufacturer prices)
- FDA NDC Directory marketing dates (who is actively selling)
- FDA drug shortages, recalls, and inspection classifications; DECRS/SPL facility links
- CMS State Drug Utilization Data 2025 (Medicaid dollars at stake)
Logistic regression per target over a monthly grid of historical dates since 2018: features built only from data knowable at each date, labels from what actually happened next, a temporal train/test split with the 2024 NADAC methodology change inside the holdout, then a refit on everything and an isotonic calibration so a displayed 12% means roughly one such market in eight actually rose. Full methodology, coefficients, backtest, and signal lifts are below the table.
Pipeline and calculations built by Claude (Fable 5) from the public datasets above. Educational only — verify against primary sources before acting.
The forecast
| Chance | Drug market | Price now | 3 mo | 12 mo | Medicaid $ at stake | |
|---|---|---|---|---|---|---|
| 4% 9.4× base | sodium chloride, sodium lactate, potassium chloride, calcium chloride injectable · 7 labelers unit price only $0.0038 · sterile injectable · only 7 active labeler(s) | $0.004 per unit | −1% | +31% | $6.6M on $13.3M (2025) | |
| 4% 9.4× base | polyethylene glycol-3350 and electrolytes other · 2 labelers unit price only $0.0046 · only 2 active labeler(s) · pharmacy margin already compressed | $0.005 per unit | −0% | +3% | $3.2M on $6.3M (2025) | |
| 4% 9.4× base | polyethylene glycol 3350, sodium chloride, sodium bicarbonate, potassium chloride other · 3 labelers unit price only $0.0050 · only 3 active labeler(s) · down 41% over two years — prices this far below trend usually rebound | $0.005 per unit | −11% | −4% | $563K on $1.1M (2025) | |
| 4% 9.4× base | sodium phosphate, dibasic and sodium phosphate, monobasic other · 2 labelers unit price only $0.0095 · only 2 active labeler(s) · price up 15% over 6 months | $0.009 per unit | +15% | +16% | $264K on $529K (2025) | |
| 3% 6.7× base | polyethylene glycol 3350, sodium sulfate anhydrous, sodium bicarbonate, sodium chloride, potassium chloride other · 5 labelers unit price only $0.0053 · only 5 active labeler(s) · pharmacy margin already compressed | $0.005 per unit | −0% | +2% | $1.3M on $2.5M (2025) | |
| 3% 6.7× base | lidocaine hydrochloride and epinephrine injectable · 6 labelers sterile injectable · unit price already $0.14 · only 6 active labeler(s) | $0.139 per unit | +0% | +0% | $128K on $256K (2025) | |
| 3% 6.7× base | ondansetron hydrochloride injectable · 4 labelers sterile injectable · unit price already $0.18 · only 4 active labeler(s) | $0.177 per unit | −2% | −16% | $114K on $229K (2025) | |
| 3% 6.7× base | calcium carbonate 10gr (648 mg) oral solid · 3 labelers unit price only $0.0081 · only 3 active labeler(s) · pharmacy margin already compressed | $0.008 per unit | +0% | +3% | $61K on $122K (2025) | |
| 3% 6.4× base | famotidine injectable · 7 labelers sterile injectable · unit price already $0.33 · only 7 active labeler(s) | $0.327 per unit | +0% | +0% | $880K on $1.8M (2025) | |
| 3% 6.4× base | lactulose solution usp, 10 g/15 ml other · 3 labelers unit price already $0.01 · only 3 active labeler(s) · pharmacy margin already compressed | $0.013 per unit | −3% | −1% | $587K on $1.2M (2025) | |
| 2% 4.7× base | sodium chloride injectable · 26 labelers 13 Class I/II recall(s) in 12 months · sterile injectable · unit price already $0.09 | $0.088 per unit | +1% | +6% | $48.1M on $96.1M (2025) | |
| 2% 4.7× base | propofol injectable · 13 labelers sterile injectable · unit price already $0.17 · pharmacy margin already compressed | $0.171 per unit | −2% | +0% | $2.6M on $5.2M (2025) | |
| 2% 4.7× base | cyclobenzaprine oral solid · 9 labelers unit price already $0.02 · only 9 active labeler(s) · pharmacy margin already compressed | $0.017 per unit | −4% | −11% | $1.9M on $3.9M (2025) | |
| 2% 4.7× base | lidocaine hydrochloride injectable · 25 labelers sterile injectable · unit price already $0.08 · 4 Class I/II recall(s) in 12 months | $0.080 per unit | −2% | −8% | $1.8M on $3.6M (2025) | |
| 2% 4.7× base | chlorhexidine gluconate 0.12% oral rinse other · 14 labelers unit price only $0.0072 · pharmacy margin already compressed · sole-source market | $0.007 per unit | −0% | −5% | $1.4M on $2.9M (2025) | |
| 2% 4.7× base | polyethylene glycol-3350 and electrolytes with flavor pack other · 1 labeler unit price only $0.0039 · only 1 active labeler(s) · pharmacy margin already compressed | $0.004 per unit | +3% | +6% | $925K on $1.9M (2025) | |
| 2% 4.7× base | brompheniramine maleate and pseudoephedrine hydrochloride other · 2 labelers unit price already $0.07 · only 2 active labeler(s) · pharmacy margin already compressed | $0.071 per unit | −1% | −17% | $905K on $1.8M (2025) | |
| 2% 4.7× base | polyethylene glycol 3350, sodium chloride, sodium bicarbonate and potassium chloride with lemon flavor other · 1 labeler unit price only $0.0050 · only 1 active labeler(s) · down 41% over two years — prices this far below trend usually rebound | $0.005 per unit | −11% | −4% | $601K on $1.2M (2025) | |
| 2% 4.7× base | bupivacaine hydrochloride injectable · 24 labelers sterile injectable · unit price already $0.07 · pharmacy margin already compressed | $0.067 per unit | +0% | +4% | $472K on $944K (2025) | |
| 2% 4.7× base | tobramycin injectable · 10 labelers sterile injectable · price up 23% over 6 months · only 10 active labeler(s) | $0.740 per unit | +13% | −9% | $454K on $909K (2025) | |
| 2% 4.7× base | cholestyramine light other · 2 labelers unit price already $0.11 · only 2 active labeler(s) · price up 11% over 6 months | $0.114 per unit | +4% | −13% | $314K on $629K (2025) | |
| 2% 4.7× base | sodium citrate and citric acid monohydrate other · 6 labelers unit price already $0.02 · only 6 active labeler(s) · pharmacy margin already compressed | $0.024 per unit | −0% | +0% | $245K on $491K (2025) | |
| 2% 4.7× base | midazolam injectable · 5 labelers sterile injectable · unit price already $0.23 · only 5 active labeler(s) | $0.234 per unit | +2% | +3% | $240K on $480K (2025) | |
| 2% 4.7× base | haloperidol lactate injectable · 6 labelers sterile injectable · only 6 active labeler(s) · pharmacy margin already compressed | $0.789 per unit | +1% | +2% | $162K on $325K (2025) | |
| 2% 4.7× base | polyethylene glycol 3350 and electrolytes with lemon flavor other · 1 labeler unit price only $0.0046 · only 1 active labeler(s) · pharmacy margin already compressed | $0.005 per unit | −0% | +3% | $145K on $289K (2025) |
A screening list for pharmacists, buyers, and payers — not a forecast for any single product and not purchasing advice. Every row's “inputs” button shows the data behind its number.
How to read a row
- Chanceis a calibrated probability: the model's raw score mapped onto how often markets with that score actually hit the target in history. “3× base” compares it to the average market-month in the held-out period.
- Price now / 3 mo / 12 mo are the market's median NADAC unit price and its matched change — the same NDCs at both dates, so a change in which package sizes are sold cannot fake a move.
- Medicaid $ at stake is last complete year's Medicaid spend on the market's NDCs times the target rise (50% or 25%): what the rise would add per year if it happened and volume held. Sizing, not prediction.
- Whylists the factors contributing most to this row's score; the “inputs” button lists every factor, with values.
How it was built — in full
1. What is being predicted
A market is one ingredient in one form bucket (oral solid, injectable, other) — every NDC of every labeler selling it. Its price each month is the median across those NDCs of the NADAC unit price. A rise is measured on matched NDCs: for each NDC priced at both dates we take the ratio, then the median of those ratios. The target is that matched median reaching +50% at any month within the next six (or +25% within three). Between 2014 and 2026 we found 949 such six-month rises across 550 markets; 63% were still +50% or more six months later, 42% a full year later — these are not blips.
2. The NADAC methodology change, and what we did about it
Beginning with its December 2024 monthly file, CMS computes generic NADAC rates as a three-month moving average of monthly acquisition costs (a volatility measure adopted after the 2024 methodology dispute; brands are not averaged). A one-month jump now appears spread over three months, and the change is visible in the data: before it, 0.2–0.9% of NDC-months jumped 50% or more within a single month; after it, 0.006%. Left alone, that would make history and present incomparable and quietly break any model trained across the seam. Rather than try to undo CMS's average (an unstable inversion), we harmonized: every generic NDC's monthly price before December 2024 is replaced by the trailing three-month mean of its observed prices — history smoothed the way the present now is. All features and labels are computed on that one series, and the train/test split puts the methodology change inside the held-out period, so the reported test AUC is measured across it.
3. The inputs (features)
Fourteen features per market-month, each computed only from data available on that date. Price dynamics at four horizons, the manufacturer-side price series, and the supply-side factors the site's fragility model uses. Coefficients are on a z-scale (one standard deviation of each feature), so they are comparable to each other:
- price_level — current median NADAC unit price (log)-0.72
- nadac_3m — price change vs 3 months ago (matched NDCs, log ratio)+0.05
- nadac_6m — price change vs 6 months ago+0.13
- nadac_yoy — price change vs 12 months ago-0.04
- nadac_2y — price change vs 24 months ago-0.11
- wamp_yoy — manufacturer price (weighted AMP, from the FUL file) change vs 12 months ago+0.13
- ful_gap — how far the pharmacy price sits from the manufacturer benchmark (log NADAC/AMP)-0.24
- n_labelers — companies with an NDC actively marketed today-0.87
- sole_source — exactly one labeler-0.18
- injectable — sterile-injectable form+0.20
- active_episodes — FDA shortage episodes already open in the market+0.06
- tbd_active — a to-be-discontinued filing currently active+0.05
- recalls_12mo — Class I/II recalls touching the market in the last year+0.06
- oai_24mo — an NDC made at a facility with an OAI inspection in the last two years+0.03
- price_level — current median NADAC unit price (log)-0.55
- nadac_3m — price change vs 3 months ago (matched NDCs, log ratio)-0.04
- nadac_6m — price change vs 6 months ago+0.02
- nadac_yoy — price change vs 12 months ago-0.15
- nadac_2y — price change vs 24 months ago-0.17
- wamp_yoy — manufacturer price (weighted AMP, from the FUL file) change vs 12 months ago+0.15
- ful_gap — how far the pharmacy price sits from the manufacturer benchmark (log NADAC/AMP)-0.14
- n_labelers — companies with an NDC actively marketed today-1.02
- sole_source — exactly one labeler-0.16
- injectable — sterile-injectable form+0.08
- active_episodes — FDA shortage episodes already open in the market+0.05
- tbd_active — a to-be-discontinued filing currently active+0.07
- recalls_12mo — Class I/II recalls touching the market in the last year+0.04
- oai_24mo — an NDC made at a facility with an OAI inspection in the last two years+0.04
4. The backtest
Each model is fit on market-months before 2024and scored on everything after — a period it never saw. AUC is the chance the model ranks a market that rose above one that did not (0.5 is a coin flip). “Hits in top 100” is the plainest test: of the 100 market-months the model was most confident about, how many actually rose.
| Target | Period | market-months | rises observed | base rate | AUC | hits in top 100 | hits in top 500 |
|---|---|---|---|---|---|---|---|
| +50% within 6 months | training (2018–2023) | 93,605 | 604 | 0.7% | 0.723 | 5 | 32 |
| held-out (2024–2026) | 48,552 | 215 | 0.4% | 0.732 | 6 | 16 | |
| +25% within 3 months | training (2018–2023) | 93,013 | 974 | 1.1% | 0.686 | 5 | 28 |
| held-out (2024–2026) | 52,294 | 463 | 0.9% | 0.720 | 5 | 8 |
5. What actually precedes a rise
The honest finding, and the reason this page is titled the way it is: the strongest precursor of a sharp rise is a sharp fall. Markets whose price has collapsed tend to snap back — a race to the bottom that reverses when labelers exit or stop selling at a loss. Supply-side warning signs (sole source, open shortages, inspections, recalls) barely move the odds of a large rise, and sole-source markets rise less often, because their prices are already high. The table shows, for every signal, how often it was present when a market went on to hit the target versus when it did not:
| Signal present at the time | in markets that rose | in markets that didn't | lift |
|---|---|---|---|
| price down >=20% in 3 months | 10.5% | 2.2% | 4.7× |
| price down >=30% in 6 months | 8.2% | 1.8% | 4.4× |
| price down >=30% over a year | 14.3% | 5.1% | 2.8× |
| price down >=50% over two years | 9.5% | 3.8% | 2.5× |
| manufacturer (AMP) price down >=30% YoY | 4.9% | 9.4% | 0.5× |
| sole-source market | 8.7% | 12.5% | 0.7× |
| two or fewer labelers | 21.4% | 23.1% | 0.9× |
| a discontinuation filing active | 7.8% | 5.9% | 1.3× |
| a shortage already open | 9.0% | 2.0% | 4.4× |
| Class I/II recall in 12 months | 6.7% | 6.1% | 1.1× |
| OAI inspection at a producing facility | 23.4% | 22.3% | 1.1× |
| sterile injectable | 8.2% | 5.8% | 1.4× |
| Signal present at the time | in markets that rose | in markets that didn't | lift |
|---|---|---|---|
| price down >=20% in 3 months | 15.1% | 2.1% | 7.0× |
| price down >=30% in 6 months | 10.0% | 1.8% | 5.5× |
| price down >=30% over a year | 20.8% | 5.0% | 4.1× |
| price down >=50% over two years | 12.3% | 3.7% | 3.3× |
| manufacturer (AMP) price down >=30% YoY | 8.6% | 9.3% | 0.9× |
| sole-source market | 9.1% | 12.5% | 0.7× |
| two or fewer labelers | 19.6% | 23.0% | 0.8× |
| a discontinuation filing active | 7.6% | 5.9% | 1.3× |
| a shortage already open | 5.3% | 2.0% | 2.6× |
| Class I/II recall in 12 months | 5.9% | 6.2% | 1.0× |
| OAI inspection at a producing facility | 23.2% | 22.1% | 1.1× |
| sterile injectable | 5.6% | 5.8% | 1.0× |
6. What this cannot predict
Supply-shock spikes. When isoniazid went 14.6× in early 2025 after a manufacturing failure, nothing in these inputs flagged it in advance — and no public dataset would have. This model finds the rises that leave tracks in prices; it does not see inside factories. Treat a low score as “no rebound pattern,” never as “safe.”
7. Known limits
- NADAC is a national average of invoice prices; an individual pharmacy's cost differs.
- Markets pool every NDC of an ingredient and form; a bucket can mix products of very different price (the inputs panel shows the NDCs, so you can see when it does).
- Medicaid dollars at stake use the latest complete year of CMS State Drug Utilization Data (2025) and Medicaid only; commercial and Medicare exposure is larger.
- Calibration is historical: if the market regime changes, probabilities drift until the next refit. Every refit is kept, so a published score is always explainable.
Reproduce it: every number on this page is produced by drugdashboards/price_rebound.py, public in our repository, from the datasets listed above.