DEV Community

VBC Risk Analytics
VBC Risk Analytics

Posted on

How ICD-10 Codes Map to an HCC / RAF Score (and Why the Same Code Set Yields Different Scores)

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
Enter fullscreen mode Exit fullscreen mode

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:

  1. A current ICD-10 → HCC crosswalk for the target model version
  2. The hierarchy (trumping) table
  3. The coefficient table
  4. 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)