← all signals

positive_eps_streak

quality   default: long

Definition

Fires on companies with consecutive years of positive earnings — quality compounder candidates. Surfaces stable franchises with earnings durability, not speculative growth.

Trigger logic

≥3 consecutive fiscal years with positive net income (NetIncomeLoss). Rebuilt yearly from facts.parquet aggregated by (cik, fy).

Source: signals/build_signals.py:91

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 21,256 +0.05% -0.16% +49.53% -0.04 22
5d 21,258 +0.10% -0.10% +50.10% -0.00 22
20d 21,218 -0.80% -1.03% +49.80% -0.04 22
60d 19,852 +1.64% +1.48% +54.15% +0.04 22
252d 19,501 +13.65% +13.47% +64.44% +0.27 22

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

SIC divisionnMean 20dHit rater/σ
Finance, Insurance, Real Estate 7,030 -2.28% +46.00% -0.20
Manufacturing (heavy) 4,446 -0.52% +49.82% -0.04
Services (business + personal) 1,961 -0.54% +51.71% -0.04
Mining + Construction 856 -0.43% +51.99% -0.03
Transportation, Communications, Utilities 1,835 +1.29% +54.77% +0.02
Manufacturing (light) 2,377 +0.22% +52.25% +0.01
Wholesale + Retail Trade 1,946 +0.02% +52.42% +0.00
Services (health + legal + edu) 694 -0.01% +52.88% -0.00

Recent triggers

Caveats

Citations


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