StrategiesLong/Short Tax-Aware

Long/Short Tax-Aware

Active extension. Long more than the book, short the difference. 130/30 through 250/150.

Net exposure
100%
Gross exposure
160% – 400%
Profiles
130/30 → 250/150
Backtest · 20152024Illustrative
Ann. return (after-tax)
12.1%
Tracking error
14.0%
After-tax boost
+1.3%
US large-cap index

The dark track is the strategy's after-tax NAV. The grey track is the benchmark NAV. Both start at $1M on the start date, rebalanced daily under the CLARABEL solver.

Numbers are plausible placeholders, not a real backtest. Replace by running taxview-runner over the same window. Daily rebalance, CLARABEL solver. Marginal-rate assumptions: short-term 37%, long-term 20%, NIIT 3.8%.

Illustrative
2024-12-31(end of window)
Strategy (after-tax)$6.97M
Benchmark$5.40M
$1.00M$2.00M$3.00M$4.00M$5.00M$6.00M$7.00M20152017201920212023
Static view. Resize wider for hover details.
Ann. return
12.1%
Benchmark return
8.7%
Alpha (after-tax)
132 bps
Tracking error
1398 bps
Avg turnover
26.4%
Lifetime harvested
54.2% NAV
The idea

A long-only book can only act when names fall. Adding a short leg gives the optimizer a second cross-section of harvest opportunities — names that rallied into stretched valuations, then came back.

The objective
Subject to
Σ wᵢ = 1Net exposure stays at 100% of NAV
Σ wᵢ⁺ ≤ LLong-side gross capped at L (1.30 for 130/30)
Σ wᵢ⁻ ≤ L − 1Short-side gross capped at L−1 (0.30 for 130/30)

Same shape as tax-aware DI, plus a third penalty term φ⊤|w| that prices each short's borrow fee directly into the objective. A name expensive to borrow needs a stronger short signal to clear into the portfolio.

We solve this as a portfolio-optimization problem each day, using CVXPY with the CLARABEL conic solver. The solver searches the feasible set defined by the constraints and returns the weight vector that minimises (or maximises) the objective — typically in tens of milliseconds for a 500-name universe.

What goes in, what comes out
Inputs
  • Long lots + shorts

    Lot history on the long side, current short positions on the short side.

  • Benchmark

    The long benchmark (S&P 100 / 500 / Russell 1000) — net exposure target.

  • Borrow curve

    Per-name stock-loan fees from the broker, priced into the optimizer's objective.

  • Leverage split

    The active gross profile, e.g. 130/30 through 250/150.

Outputs
  • Long trades

    Buys and harvest sells on the long leg, lot ID on every sale.

  • Short trades

    Opening and covering trades on the short leg.

  • Realized P/L + borrow

    Capital gains/losses plus accrued borrow as an ordinary-income line.

Customization · Coming soon

Factor tilt

A factor tilt lets the optimizer hold more of the names that score well on a chosen factor — quality, value, momentum, or low-volatility — and less of the names that score poorly. The portfolio still tracks the benchmark, but with a measurable lean toward the chosen factor.

How the optimizer applies it

B_f is the column of factor loadings for the chosen factor from the risk model. The constraint forces the portfolio's active exposure to that factor to be at least t_f standard deviations above the benchmark. The optimizer redistributes weight within the tracking-error budget to satisfy it — buying high-scoring names, underweighting low-scoring ones.

The trade-off

You consume part of your tracking-error budget on the tilt. Less budget remains for tax-loss harvesting, so factor tilts typically reduce expected harvest activity slightly. The factor's own active return is the offset.

Where you see it

The console's risk panel shows the current active factor exposure next to its target. Trade tickets annotate names whose factor score drove the buy or sell.

 Tax-Aware Direct IndexingMarket-Neutral Pair SleeveLong/Short Tax-Aware
Net exposure100%0%100%
Gross exposure100%200%160% – 400%
Source of returnIndex + tax alphaCross-sectional alphaIndex + tax + active
RoleStandalone bookCompanion sleeveStandalone book