| Type | Portfolio Strategy |
| Holdings | 15–25 positions |
| Max Position | 8% at cost |
| Sector Cap | 30% max |
| Rebalance | Quarterly |
| Style | GARP (Growth at Reasonable Price) |
Position size is a function of conviction and valuation. Cheaper stocks on a risk-adjusted basis get larger allocations. The framework uses a tiered system based on composite valuation scores.
| Tier | Criteria | Position Size | Max Positions |
|---|---|---|---|
| Core | PEG < 1.5, FCF Yield > 4%, P/E < 22 | 5% – 8% | 5–7 |
| Growth | PEG 1.0 – 2.0, FCF Yield > 2%, revenue growth > 15% | 3% – 5% | 6–8 |
| Speculative | PEG > 2.0 or negative FCF, high-conviction thesis | 1% – 3% | 3–5 |
| Cash Reserve | Dry powder for corrections | 5% – 15% | — |
pseudocodeFor each position:
base_weight = 1 / number_of_positions (equal weight baseline)
valuation_modifier:
PEG < 1.0 → +50% weight
PEG 1.0 – 1.5 → +25% weight
PEG 1.5 – 2.0 → +0% (baseline)
PEG > 2.0 → -25% weight
quality_modifier:
FCF Yield > 6% → +25% weight
FCF Yield 3% – 6% → +0% (baseline)
FCF Yield < 3% → -25% weight
adjusted_weight = base_weight × (1 + valuation_modifier)
× (1 + quality_modifier)
final_weight = min(adjusted_weight, 0.08) // 8% hard cap
final_weight = max(final_weight, 0.01) // 1% floor
Valuation-driven sizing creates sector concentration risk. If energy stocks are cheap across the board, the model will pile into energy — right before oil drops 40%. Sector caps prevent this.
| Constraint | Limit | Rationale |
|---|---|---|
| Single sector max | 30% | Prevents correlation blow-ups. No single macro event should impact >30% of the portfolio. |
| Top 2 sectors combined | 50% | Forces minimum 3-sector diversification. |
| Single position max | 8% at cost | Limits single-name risk. A 50% drawdown in the largest position costs 4% of portfolio. |
| Cash minimum | 5% | Always have dry powder. Opportunities appear when everything else is selling off. |
pseudocodeAfter sizing all positions:
for each sector:
if sector_weight > 0.30:
overflow = sector_weight - 0.30
reduce each position in sector proportionally
redistribute overflow to underweight sectors
(prefer highest FCF yield names in underweight sectors)
Verify: no single position > 8%, no sector > 30%
Remainder → cash reserve
Rebalance quarterly on the first trading day of January, April, July, and October. Calendar-based rules remove the temptation to time the market.
pseudocodeQuarterly rebalance:
1. Pull current prices and updated fundamentals
(P/E, PEG, FCF Yield for each holding)
2. Recalculate target weights using the sizing formula
3. Compare current weight vs. target weight:
- If drift > ±2% → trade to rebalance
- If drift < ±2% → no action (avoid overtrading)
4. Check for sells:
- PEG > 3.0 → sell entirely (valuation broken)
- Negative FCF for 2 consecutive quarters → sell
- Thesis invalidated (competitive, regulatory) → sell
5. Check for new entries:
- Scan watchlist for PEG < 1.5 + FCF Yield > 3%
- Fund new positions from cash reserve or trims
6. Apply sector constraints (step 2.0)
7. Execute trades
Between quarterly dates, rebalance only if:
| Scenario | Action |
|---|---|
| Portfolio down 10% from peak | Review all positions. Trim speculative tier. Increase cash to 10%+. |
| Portfolio down 20% from peak | Full rebalance. Cut all positions below conviction threshold. Cash to 15%+. |
| Single position down 30%+ | Mandatory thesis review. Three options: add (double down), hold (unchanged conviction), cut (thesis broken). |
| Sector down 25%+ | Evaluate whether sector-wide issue (macro) or company-specific. Macro = hold. Company-specific = cut the name. |
Diversification is not about the number of stocks — it's about the number of independent risk factors. 20 tech stocks is not diversified. 15 stocks across 5 uncorrelated sectors is.
referenceHigh correlation pairs (move together):
NVDA ↔ AMD (same sector, same demand drivers)
JPM ↔ BAC (both rate-sensitive, same macro exposure)
XOM ↔ CVX (both oil-price-dependent)
Low correlation pairs (independent drivers):
NVDA ↔ JNJ (tech capex vs. healthcare demand)
JPM ↔ KO (interest rates vs. consumer staples)
XOM ↔ MSFT (commodity vs. subscription software)
Build the portfolio from independent risk factors,
not just different ticker symbols.
A stock enters the portfolio when all of the following are met:
A stock exits the portfolio when any of the following occur:
The primary valuation input for position sizing. Lower PEG drives higher allocation weight through the valuation modifier.
The quality input for position sizing. Higher FCF yield drives higher allocation weight and validates earnings quality.
Entry filter and sector comparison tool. P/E below sector median is required for new positions.