Long/Short Tax-Aware
Go more than 100% long, short the difference, and harvest tax losses on both sides.
Backtest figures will appear here once results on real data are published. Until then, this page sets out the method.
Backtest results are coming soon.
Backtest results on real data will be published with a forthcoming paper on SSRN, a preprint server for research papers. The paper describes the methodology and compares a CPU solver with a GPU solver on real data. Until then, this site explains the method, and the tools show results on sample portfolios.
When they land, this section will chart the strategy's after-tax growth against its benchmark and its drawdowns, with tracking error, turnover and harvested losses alongside.
A long-only portfolio can bank a tax loss only when a stock it owns falls. Short positions add a second source: a short that moves against the portfolio, because the stock rose, can be closed at a loss and replaced with a similar short, so the portfolio keeps its shape while the loss is banked.
| Σ wᵢ = 1 | Net exposure (longs minus shorts) stays at 100% of the portfolio's value |
| Σ wᵢ⁺ ≤ L | Longs add up to at most L (1.30 for 130/30) |
| Σ wᵢ⁻ ≤ L − 1 | Shorts add up to at most L − 1 (0.30 for 130/30) |
| wᵢ ≥ -0.005 | No single short larger than 0.5% of the portfolio's value |
| |wᵢ − w_b,ᵢ| ≤ 2% (soft) | Per-name and per-sector drift beyond ±2% is penalized in the objective |
The same two costs as tax-aware direct indexing (distance from the benchmark and tax), plus a third term, φ⊤w⁻, the fee for borrowing the stocks held short. Here w⁻ is the short side of the portfolio and φ the borrow rate: this configuration uses one default rate for every stock, though the optimizer also accepts a separate rate per stock. A short is worth holding only where it lowers the other two costs by more than its fee.
The optimizer library implements this objective: the problem is written in CVXPY (an open-source modelling library) and solved by a CPU-based conic solver, which returns the long and short weights that minimise it within the constraints. The backtester runs only the long-only direct-indexing configuration today, so there are no long-short backtest results yet; results on real data will come with the forthcoming paper on the methodology, which also compares a CPU solver with a GPU solver on real data. Nothing runs on this site: everything is computed offline.
- Long lots + shorts
Lot history on the long side, current short positions on the short side.
- Benchmark
The long benchmark (a broad US large-cap index) — net exposure target.
- Borrow rate
One default stock-loan fee applied to every short and priced into the objective; the optimizer accepts per-name rates, but none are supplied yet.
- 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 cost
Capital gains and losses on each sale, with the borrow fee reported as its own term in the objective's cost breakdown.
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.
| Tax-Aware Direct Indexing | Market-Neutral Pair Sleeve | Long/Short Tax-Aware | |
|---|---|---|---|
| Net exposure | 100% | 0% | 100% |
| Gross exposure | 100% | 200% | Up to 160% – 400% |
| Source of return | Index + tax alpha | Cross-sectional alpha | Index + tax + active |
| Role | Standalone book | Companion sleeve | Standalone book |