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.

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_description     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_date      DATE NOT NULL,
  
  -- Provider
  provider_npi        VARCHAR(10),
  
  -- HCC Mapping
  hcc_code            VARCHAR(10),
  hcc_description     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_date ON patient_diagnosis_hcc(diagnosis_date);
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_name    VARCHAR(100),
  hcc_combinations    TEXT[],                          -- Array of HCC codes
  coefficient         DECIMAL(6,3),
  
  UNIQUE(model_version, interaction_name)
);

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_date >= '2024-01-01'
    AND pdh.diagnosis_date <= '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_name || ' ' || p.last_name as patient_name,
  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

Related Healthcare Guides