If you're building anything that touches Medicare Advantage risk adjustment, sooner or later you hit this question:
"How do ICD-10 codes map to an HCC / RAF score?"
The short answer that trips most people up: ICD-10-CM codes don't carry a RAF weight individually. There's a pipeline between the diagnosis code and the number, and skipping a step gives you a wrong score. Here's the whole chain.
The Pipeline
1. ICD-10 → HCC
Each qualifying diagnosis maps into a Hierarchical Condition Category (HCC) — a clinically grouped bucket. Many ICD-10 codes collapse into a single HCC, and not every ICD-10 code maps to a payable HCC at all. The crosswalk is many-to-one, and it's lossy by design.
2. Apply the hierarchies
Within a disease family, only the most severe HCC is kept. A more severe HCC "traps" the milder related HCCs so the model doesn't pay twice for the same underlying problem.
The critical part for implementers: do this before you sum anything. If you sum coefficients first and trump later, you'll double-count.
3. Sum the coefficients
RAF = demographic_factor
+ Σ (coefficient for each surviving HCC)
+ interaction_terms
The demographic factor comes from age/sex (and enrollment characteristics). Interaction terms are extra weight for specific disease combinations — they aren't just additive HCCs.
4. Mind the model version
This is the one that silently breaks reconciliations. CMS-HCC V24 and V28 use different HCC maps and different coefficients. The exact same set of ICD-10 codes produces a different RAF depending on the model year you run it against. If two systems disagree on a member's score, "which model version?" is the first question to ask.
What You Actually Need Programmatically
To compute this yourself, you need four artifacts — all keyed to the correct payment year:
- A current ICD-10 → HCC crosswalk for the target model version
- The hierarchy (trumping) table
- The coefficient table
- The interaction list
Get the payment year wrong on any one of these and the score is wrong. These tables change annually with the CMS Rate Announcement, so a cached copy from two years ago is a bug waiting to happen.
Sanity-Checking Your Implementation
Disclosure: I'm the CEO of VBC Risk Analytics and we build rafscorecalculator.com, so I have a financial interest in what follows. With that caveat out of the way — if you want to verify your own implementation, the RAF Score Calculator walks the ICD-10 → HCC → RAF chain with worked examples and computes a member under both V24 and V28. It's handy as a reference oracle for unit tests when you're validating your own crosswalk logic.
This is a general explanation of the mechanics, not coding or billing advice. HCC and coefficient specs change every payment year — always validate against the current CMS Rate Announcement rather than a table you cached last cycle.
If you're implementing this and hit an edge case with hierarchies or interaction terms, drop it in the comments.
Top comments (0)