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.
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_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
- • 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_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
From the Blog
Logical Data Models for Healthcare Risk Adjustment: Accuracy, HCCs, and CMS Reporting
10 min readRead Data EngineeringSQL vs Python for Healthcare Data Analysis, Load, and Storage: A Practical Guide for Data Engineers
16 min readRead Healthcare Data ModelingHCC Risk Adjustment Data Model: Building Accurate Risk Score Pipelines in SQL
12 min readReadBrowse all healthcare data guides