Long/Short Tax-Aware
Active extension. Long more than the book, short the difference. 130/30 through 250/150.
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%.
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.
| Σ wᵢ = 1 | Net exposure stays at 100% of NAV |
| Σ wᵢ⁺ ≤ L | Long-side gross capped at L (1.30 for 130/30) |
| Σ wᵢ⁻ ≤ L − 1 | Short-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.
- 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.
- 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.
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.
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.
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.
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 Indexing | Market-Neutral Pair Sleeve | Long/Short Tax-Aware | |
|---|---|---|---|
| Net exposure | 100% | 0% | 100% |
| Gross exposure | 100% | 200% | 160% – 400% |
| Source of return | Index + tax alpha | Cross-sectional alpha | Index + tax + active |
| Role | Standalone book | Companion sleeve | Standalone book |