Back to Guides
Risk Adjustment

HCC Risk Adjustment Guide

Complete guide to Hierarchical Condition Categories (HCC) and risk adjustment. Learn RAF score calculation, CMS-HCC models, Medicare Advantage coding, and accurate payment methodologies.

What is HCC Risk Adjustment?

HCC (Hierarchical Condition Categories) is a risk adjustment model used by CMS to predict healthcare costs and adjust Medicare Advantage payments based on patient health status. Sicker patients generate higher HCC scores and higher capitated payments to health plans.

The Risk Adjustment Factor (RAF) score quantifies a patient's expected cost relative to the average Medicare beneficiary. A RAF score of 1.0 means average risk, while 2.0 means twice the expected cost. Plans with higher RAF scores receive higher per-member-per-month (PMPM) payments. Use our free HCC Calculator to calculate CMS-HCC V28 RAF scores instantly.

How HCC Risk Adjustment Works

Step 1: Diagnosis Documentation

Provider documents patient conditions using ICD-10 codes during face-to-face encounters.

Example: E11.65 (Type 2 diabetes with hyperglycemia)

Step 2: ICD-10 to HCC Mapping

ICD-10 codes map to HCC categories based on CMS crosswalk tables.

Example: E11.65 → HCC 19 (Diabetes with Chronic Complications)

Step 3: Apply Hierarchies

More severe HCCs supersede less severe ones in the same hierarchy.

Example: HCC 18 (Diabetes with Acute Complications) supersedes HCC 19

Step 4: Calculate RAF Score

Sum all HCC coefficients plus demographic factors to get the RAF score.

Example: Demographics (0.379) + HCC 18 (0.318) + HCC 85 (0.331) = RAF 1.028

Common HCC Categories

HCCCategory DescriptionExample ICD-10Coeff (V28)
HCC 18Diabetes with Acute ComplicationsE11.00, E11.01, E11.650.318
HCC 85Congestive Heart FailureI50.20-I50.90.331
HCC 111Chronic Obstructive Pulmonary DiseaseJ44.0, J44.1, J44.90.335
HCC 59Major Depressive and Bipolar DisordersF31.0-F31.9, F32.0-F33.90.309
HCC 40Rheumatoid ArthritisM05.00-M06.90.299

HCC Database Schema

-- HCC Crosswalk (ICD-10 to HCC Mapping)
CREATE TABLE hcc_crosswalk (
  id                  SERIAL PRIMARY KEY,
  model_version       VARCHAR(10),                     -- V24, V28, etc.
  icd10_code          VARCHAR(10) NOT NULL,
  hcc_code            VARCHAR(10) NOT NULL,
  hcc_desc     VARCHAR(255),
  coefficient         DECIMAL(6,3),
  
  effective_year      INTEGER,
  
  UNIQUE(model_version, icd10_code, hcc_code)
);

CREATE INDEX idx_crosswalk_icd10 ON hcc_crosswalk(icd10_code, model_version);
CREATE INDEX idx_crosswalk_hcc ON hcc_crosswalk(hcc_code, model_version);

-- HCC Hierarchies
CREATE TABLE hcc_hierarchy (
  id                  SERIAL PRIMARY KEY,
  model_version       VARCHAR(10),
  superior_hcc        VARCHAR(10) NOT NULL,            -- Higher severity HCC
  subordinate_hcc     VARCHAR(10) NOT NULL,            -- Lower severity HCC (dropped)
  
  UNIQUE(model_version, superior_hcc, subordinate_hcc)
);

-- Patient HCC Scores
CREATE TABLE patient_hcc_score (
  id                  UUID PRIMARY KEY DEFAULT gen_random_uuid(),
  patient_id          UUID NOT NULL,
  
  -- Scoring Period
  payment_year        INTEGER NOT NULL,
  data_collection_year INTEGER NOT NULL,              -- Prior year diagnoses
  
  -- Demographics
  age                 INTEGER,
  gender              VARCHAR(10),
  medicaid_status     BOOLEAN,
  disabled_status     BOOLEAN,
  institutional_status BOOLEAN,
  
  -- Demographic RAF
  demographic_score   DECIMAL(6,3),
  
  -- HCC List (array of active HCCs after hierarchies)
  hcc_list            TEXT[],
  
  -- Disease RAF
  disease_score       DECIMAL(6,3),
  
  -- Disease Interactions
  interaction_score   DECIMAL(6,3),
  
  -- Total RAF Score
  raf_score           DECIMAL(6,3) NOT NULL,
  
  -- Metadata
  calculated_at       TIMESTAMP DEFAULT NOW(),
  
  UNIQUE(patient_id, payment_year)
);

CREATE INDEX idx_patient_hcc_patient ON patient_hcc_score(patient_id);
CREATE INDEX idx_patient_hcc_year ON patient_hcc_score(payment_year);

-- Patient Diagnosis History (for RAF calculation)
CREATE TABLE patient_diagnosis_hcc (
  id                  UUID PRIMARY KEY DEFAULT gen_random_uuid(),
  patient_id          UUID NOT NULL,
  
  -- Diagnosis
  encounter_id        UUID,
  icd10_code          VARCHAR(10) NOT NULL,
  diagnosis_dt      DATE NOT NULL,
  
  -- Provider
  prov_npi        VARCHAR(10),
  
  -- HCC Mapping
  hcc_code            VARCHAR(10),
  hcc_desc     VARCHAR(255),
  coefficient         DECIMAL(6,3),
  
  -- Status
  is_valid_encounter  BOOLEAN DEFAULT TRUE,            -- Face-to-face?
  included_in_raf     BOOLEAN DEFAULT TRUE,
  superseded_by_hcc   VARCHAR(10),                     -- If dropped by hierarchy
  
  created_at          TIMESTAMP DEFAULT NOW()
);

CREATE INDEX idx_dx_hcc_patient ON patient_diagnosis_hcc(patient_id);
CREATE INDEX idx_dx_hcc_dt ON patient_diagnosis_hcc(diagnosis_dt);
CREATE INDEX idx_dx_hcc_code ON patient_diagnosis_hcc(hcc_code);

-- Disease Interactions (for V28 model)
CREATE TABLE hcc_interaction (
  id                  SERIAL PRIMARY KEY,
  model_version       VARCHAR(10),
  interaction_nm    VARCHAR(100),
  hcc_combinations    TEXT[],                          -- Array of HCC codes
  coefficient         DECIMAL(6,3),
  
  UNIQUE(model_version, interaction_nm)
);

RAF Score Calculation Example

Patient Profile: 72-year-old Female, Community

Demographic Factors:
  • • Age 72, Female = 0.379
Active HCCs (from diagnoses):
  • • HCC 18 (Diabetes with Acute Complications) = 0.318
  • • HCC 85 (Congestive Heart Failure) = 0.331
  • • HCC 111 (COPD) = 0.335
Disease Interactions:
  • • Diabetes + CHF (D3) = 0.154
RAF Calculation:
0.379 (demographics)
+ 0.318 (HCC 18)
+ 0.331 (HCC 85)
+ 0.335 (HCC 111)
+ 0.154 (interaction)
= 1.517 RAF Score

SQL Query Examples

Calculate Patient RAF Score

WITH patient_hccs AS (
  SELECT DISTINCT
    pdh.patient_id,
    pdh.hcc_code,
    hc.coefficient
  FROM patient_diagnosis_hcc pdh
  JOIN hcc_crosswalk hc ON pdh.hcc_code = hc.hcc_code
  WHERE pdh.diagnosis_dt >= '2024-01-01'
    AND pdh.diagnosis_dt <= '2024-12-31'
    AND pdh.included_in_raf = TRUE
    AND hc.model_version = 'V28'
)
SELECT 
  patient_id,
  ARRAY_AGG(hcc_code ORDER BY hcc_code) as hcc_list,
  0.379 as demographic_score,              -- Hardcoded for example
  SUM(coefficient) as disease_score,
  0.379 + SUM(coefficient) as raf_score
FROM patient_hccs
WHERE patient_id = 'patient-uuid'
GROUP BY patient_id;

Find Patients with Missing HCC Documentation

-- Patients with HCC last year but not this year
SELECT 
  p.mrn,
  p.first_nm || ' ' || p.last_nm as patient_nm,
  phs_prior.hcc_list as prior_year_hccs,
  phs_current.hcc_list as current_year_hccs,
  phs_prior.raf_score as prior_raf,
  COALESCE(phs_current.raf_score, 0) as current_raf
FROM patient p
JOIN patient_hcc_score phs_prior ON p.id = phs_prior.patient_id
  AND phs_prior.payment_year = 2024
LEFT JOIN patient_hcc_score phs_current ON p.id = phs_current.patient_id
  AND phs_current.payment_year = 2025
WHERE phs_prior.raf_score > 1.0
  AND COALESCE(phs_current.raf_score, 0) < 0.5
ORDER BY phs_prior.raf_score DESC;

HCC Coding Best Practices

  • Code to highest specificity: Use complete ICD-10 codes (E11.65, not E11.6)
  • Annual documentation: Chronic conditions must be documented EVERY year
  • Face-to-face encounters only: Telehealth counts, lab-only visits don't
  • Support with clinical evidence: Document severity and treatment
  • Avoid "rule out" diagnoses: Only code confirmed conditions

Frequently Asked Questions

What is an HCC code and how does it affect Medicare Advantage payments?

HCC (Hierarchical Condition Category) codes are groupings of ICD-10 diagnosis codes that represent clinically meaningful disease categories for risk adjustment. CMS uses HCC codes to adjust Medicare Advantage capitation payments — each HCC has a coefficient that, when summed with demographic factors, produces the RAF score. Higher RAF scores generate higher PMPM payments to health plans.

What is the difference between CMS-HCC V24 and V28?

CMS-HCC V28 is the updated model that phased in starting 2024 and fully replaces V24 by 2026. V28 added 115 new HCC categories (from 86 to 115 payment HCCs), revised ICD-10 mappings to reflect modern coding practices, and recalibrated coefficients using more recent Medicare FFS data. V28 generally reduces payments for conditions with improved treatment outcomes and increases them for high-cost conditions.

How often must HCC diagnoses be documented?

Chronic conditions that drive HCC risk adjustment must be documented every year in a face-to-face encounter. A diagnosis documented in 2024 does not carry forward to 2025 — providers must re-document and re-attest to every chronic condition annually. This is the most common cause of RAF score drops from year to year.

What types of encounters are valid for HCC risk adjustment?

Valid encounters include face-to-face visits with qualified providers (physicians, NPPs, clinical nurse specialists) — both in-person and telehealth. Lab-only results, radiology reads, and telephone calls without a clinical assessment do not qualify. The encounter must include an assessment and plan that supports the diagnosis being coded.

How do disease interactions work in the CMS-HCC model?

Disease interactions are additional RAF coefficients applied when a patient has specific combinations of HCCs that together predict higher costs than the sum of individual HCC scores alone. For example, a patient with both diabetes (HCC 18) and congestive heart failure (HCC 85) may trigger an interaction coefficient that adds to their total RAF score beyond what each condition contributes separately.

Related Healthcare Guides