Back to Publications

Feature Engineering for Volatility Contraction Pattern (VCP) Analysis

The Volatility Contraction Concept

The Volatility Contraction Pattern (VCP), originally popularized by legendary trader Mark Minervini, is a structural chart phenomenon indicating supply-demand equilibrium. The pattern denotes that as an asset consolidates, it goes through successive waves of selling absorption, resulting in smaller price corrections and declining volume dry-ups. While discretionary traders identify these contractions visually, systematic engineers must formulate strict algebraic rules to quantify these setups as numerical features for model inference.

"Volatility contraction represents the systematic absorption of overhead supply. As selling pressure dries up, a tiny burst of buying power is sufficient to trigger a high-momentum breakout."

Algebraic Formulation of Contraction Waves

To identify contractions systematically, we define the following features:

  • Wave Magnitude (C_k): The peak-to-trough drop of each contraction. Let P_k be the local high and T_k be the subsequent local low. The correction is computed as:
    C_k = (P_k - T_k) / P_k * 100
  • Contraction Progression: A valid VCP requires sequential wave damping:
    C_1 > C_2 > C_3 > ... > C_n
  • Tightness Parameter: The final wave's amplitude must fall below a strict threshold (e.g., C_n <= 5%).

Volume Dry-up (VDU) Index

Contraction magnitude is only half of the VCP equation. High-probability breakouts require confirmation that volume has dried up near the base of the consolidation, signaling that no active sellers remain in the market. We quantify this by defining a Volume Dry-up (VDU) Index, which measures current volume against its historical 20-day simple moving average:

# Mathematically defining VDU
df['volume_sma20'] = df['Volume'].rolling(20).mean()
df['vdu_score'] = df['Volume'] / df['volume_sma20']

# A tight base requires volume to dry up significantly
is_vdu_active = df['vdu_score'].iloc[-1] < 0.6  # Current volume is 40% below average

Machine Learning Feature Integration

By mapping contraction magnitude sequences (C_1, C_2, C_3) and volume dry-up parameters into daily floating-point arrays, we construct robust structural features. When combined with HMM regime scores, our machine learning classifiers successfully distinguish high-probability breakout setups from false, low-momentum gaps, securing excellent downside protection.