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.
Step 2: ICD-10 to HCC Mapping
ICD-10 codes map to HCC categories based on CMS crosswalk tables.
Step 3: Apply Hierarchies
More severe HCCs supersede less severe ones in the same hierarchy.
Step 4: Calculate RAF Score
Sum all HCC coefficients plus demographic factors to get the RAF score.
Common HCC Categories
| HCC | Category Description | Example ICD-10 | Coeff (V28) |
|---|---|---|---|
| HCC 18 | Diabetes with Acute Complications | E11.00, E11.01, E11.65 | 0.318 |
| HCC 85 | Congestive Heart Failure | I50.20-I50.9 | 0.331 |
| HCC 111 | Chronic Obstructive Pulmonary Disease | J44.0, J44.1, J44.9 | 0.335 |
| HCC 59 | Major Depressive and Bipolar Disorders | F31.0-F31.9, F32.0-F33.9 | 0.309 |
| HCC 40 | Rheumatoid Arthritis | M05.00-M06.9 | 0.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
- • Age 72, Female = 0.379
- • HCC 18 (Diabetes with Acute Complications) = 0.318
- • HCC 85 (Congestive Heart Failure) = 0.331
- • HCC 111 (COPD) = 0.335
- • Diabetes + CHF (D3) = 0.154
+ 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