← all signals

margin_compression_severe

stress   default: short

Definition

Fires on >500 bps year-over-year decline in operating margin. Captures the 'good business getting worse' pattern.

Trigger logic

(prior_fy_op_margin - current_fy_op_margin) > 0.05  AND prior_fy_op_margin > 0.05. Op margin = OperatingIncomeLoss / Revenues.

Source: signals/build_signals.py:238

Calibration — gross stock return vs net of execution costs

Cost model: 5 bps half-spread each side, 10 × √($1M / 30d ADV) impact each side, ADV-tiered borrow (≥$50M ADV → 10 bps annual; ≥$5M → 30; <$5M → 100), scaled by holding_days/252 if short.

Horizonn eventsGross stock retNet PnL Hit rater/σ netAvg cost (bps)
1d 2,429 +2.00% -2.03% +36.27% -0.02 46
5d 2,429 +3.35% -2.80% +38.74% -0.02 47
20d 2,364 +6.26% -4.81% +38.32% -0.03 52
60d 2,266 +78.74% -75.14% +40.47% -0.03 65
252d 2,195 +41.39% -31.94% +39.77% -0.09 126

Sector breakdown (top 8 by |r/σ| at 20d)

SIC divisionnMean 20dHit rater/σ
Services (health + legal + edu) 106 +46.69% +37.74% +0.16
Transportation, Communications, Utilities 93 +39.75% +35.48% +0.11
Wholesale + Retail Trade 130 -1.98% +33.85% -0.06
Finance, Insurance, Real Estate 108 +5.81% +32.41% +0.05
Manufacturing (light) 479 +2.04% +38.62% +0.04
Manufacturing (heavy) 894 +5.36% +40.83% +0.03
Mining + Construction 151 +0.45% +40.40% +0.01
Services (business + personal) 403 -0.15% +35.48% -0.00

Recent triggers

Caveats

Citations


Live data → /api/methodology/signal/margin_compression_severe  ·  MCP → pyflo_signal_methodology(signal="margin_compression_severe")