Working Paper · v1.0 · 2026

A Multi-Factor Systematic Equity Portfolio
with Volatility Targeting and a Drawdown Overlay

Localware · Research Note 26-01
Abstract
We document the construction of a fully-automated, in-process equity portfolio combining four orthogonal factor sleeves (cross-sectional momentum, quality, low volatility, and short-term mean-reversion) under a 12% volatility target with sector and per-name caps and a drawdown overlay. The system targets an information ratio of 1.5+ at low realised volatility and avoids any external broker dependency by design.

1. Universe and data

The investable universe is a curated set of ≈ 90 large- and mid-capitalisation US equities spanning every GICS sector. SPY is included as the market benchmark for beta and factor regressions but is excluded from signal generation. Daily open-high-low-close-volume bars are sourced from the Yahoo Finance public API and persisted in Postgres (table prices, primary key (security_id, date)) with idempotent upserts so the worker is safe to re-run.

Fundamentals are pulled weekly from the same source: trailing P/E, P/B, ROE, debt-to-equity, market capitalisation, and earnings growth. Survivorship bias in the universe is acknowledged and not corrected — the historical results overstate the true ex-ante hit rate by a small margin we estimate at 30–80 bps annualised.

2. Strategy sleeves

2.1. Cross-sectional momentum (40%)

Following Jegadeesh and Titman (1993) and Asness, Moskowitz, and Pedersen (2013), we rank the universe each rebalance by 12-month price return skipping the most recent month:

(1)

The portfolio holds the top-decile names long and the bottom-decile short, equal weighted within each leg, capped at 30 names per leg. Skipping the most-recent month removes the short-horizon reversal effect that contaminates raw 12-month rankings.

2.2. Quality (25%)

Quality combines profitability, leverage, and growth into a composite z-score:

(2)

Names with , and positive year-on-year earnings growth are eligible; the top 30 by composite score are held long with equal weight.

2.3. Low volatility (20%)

We compute realised 60-day daily volatility,

(3)

and hold the bottom-quintile (lowest realised vol) names long, equal weighted, capped at 50 names. This sleeve harvests the well-documented betting-against-beta premium (Frazzini and Pedersen, 2014).

2.4. Short-term mean reversion (15%)

A name is held long if its Wilder 14-day RSI is below 30 and its current price is above its 200-day simple moving average. Positions are exited after five trading days regardless of further mean reversion, ensuring the sleeve does not double-up on momentum-driven breakdowns.

3. Portfolio construction

Sleeve signals are summed weighted by their static allocation to produce raw target weights. We then apply, in order:

  1. Per-name cap of 5%, applied as a hard clamp.
  2. Per-sector cap of 25%, scaling all positive weights within an over-cap sector pro-rata.
  3. Volatility target: scale the gross weight vector so the ex-ante portfolio volatility equals 12%. With sample covariance on the trailing 60 days,
    (4)
  4. Drawdown overlay: if the rolling drawdown exceeds 8%, multiply gross by 0.5 until the drawdown recovers below the threshold.
  5. Cap aggregate gross leverage at 1.5×.

4. Execution model

The simulator fills orders at the close-of-day adjusted price plus a slippage charge of

(5)

where the first term is a fixed half-spread proxy, the second adds a high-low spread component capped at 20 bps, and the third applies a 15 bps impact penalty when the order size exceeds 1% of trailing 30-day average dollar volume. Commissions are per share with a one-dollar minimum.

5. Risk model

The 1-day historical Value-at-Risk and Expected Shortfall are

(6)

We additionally regress the portfolio return on five factor proxies built from the universe: market (SPY), size (small-minus-big by market cap), value (low-minus-high P/B), profitability (high-minus-low ROE), and a low-vol proxy in place of CMA (low-vol minus high-vol).

6. Targets and expectations

Table 10. Design targets versus historical evidence on similar stacks
MetricTargetComparable evidence
Annualised return~ 18%15–22%
Sharpe ratio> 1.51.3–1.7
Maximum drawdown< 12%8–14%
Annualised volatility~ 12%10–13%
Historical evidence aggregated from Asness et al. (2013, 2014), Frazzini and Pedersen (2014), and AQR working papers; figures are typical, not guaranteed.

7. Implementation notes

The system is implemented as Python workers writing to a Postgres instance, with a Next.js read-only front-end. The scheduler runs the daily pipeline at 16:30 ET on weekdays and the fundamentals refresh on Sunday at 02:00. There is no broker API in the path: order generation and fills are entirely synthetic, against the most recent recorded price. All portfolio state lives in the database — there is no in-memory cache that can diverge from the persisted truth.

References