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.
| Horizon | n events | Gross stock ret | Net PnL | Hit rate | r/σ net | Avg 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 division | n | Mean 20d | Hit rate | r/σ |
|---|---|---|---|---|
| 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
TGT— TARGET CORP (FY2026)DG— DOLLAR GENERAL CORP (FY2026)KR— KROGER CO (FY2026)GAP— GAP INC (FY2026)LOW— LOWES COMPANIES INC (FY2026)
Caveats
- 20d horizon underperforms (-1.03% net) — mean reversion takes longer.
- 252d horizon delivers +13.47% net — the right holding period for compounders.
- Doesn't filter for earnings *quality* — pair with accruals_quality_low to weed out manipulation.
Citations
- Sloan, R. (1996). 'Do stock prices fully reflect information in accruals and cash flows about future earnings?' The Accounting Review.
Live data → /api/methodology/signal/positive_eps_streak · MCP → pyflo_signal_methodology(signal="positive_eps_streak")