cuOPT vs CVXPY: a per-strategy bake-off for tax-aware portfolio optimization
Six strategies, two solvers, one question: where does GPU-accelerated mathematical programming earn its keep against a mature CPU convex framework — in solve-time, in solution quality, and in the after-tax dollar that lands in the account.
Working notes on tax-aware portfolio construction.
Strategy deep-dives that bake the methodology into the backtest they describe; country posts on the actual statutes the optimizer honours; engineering write-ups on how the platform is built; and a single banner piece — above — comparing GPU and CPU optimizers across every strategy in the catalog.
6 posts
One per strategy in the catalog. Modeling choices, datasets, backtests across multiple vintages, observations.
- Strategy · deep diveMay 2026
Tax-aware direct indexing, in full: model, data, backtest, observations
From the lot-level harvest objective to the wash-sale lockout, the constituent universe, the risk model, and ten vintages of backtests on a US large-cap index.
After-tax alpha+72 bps / yr - Strategy · deep diveMay 2026
Long/short tax-aware: where does the extra harvest come from?
Decomposing the long-only book versus 130/30, 150/50, and 200/100 — what the short leg adds in harvestable losses, what borrow accrual takes back, and how the leverage knob translates into after-tax alpha.
After-tax alpha · 130/30+128 bps / yr - Strategy · deep diveMay 2026
The pair sleeve: dollar-neutral, factor-neutral, and what's left over
A small companion sleeve to a tax-aware DI book. The construction zeroes net beta and pins factor exposure; what remains is cross-sectional positioning, tax friction, and borrow accrual — modeled, backtested, and decomposed.
Net beta · realized0.02 - Strategy · deep diveMay 2026
One construction, four tax engines: cross-jurisdiction direct indexing
The same optimizer, swapped between US §1091, Canadian ACB averaging, Australian 50% CGT discount, and Indian STT + grandfathering. Where the after-tax alpha lands when the tax engine changes underneath.
Alpha range across jurisdictions+50 — +130 bps - Strategy · deep diveMay 2026
An options overlay on a concentrated stock: monetizing without selling
Covered calls, protective puts, and zero-cost collars on a single concentrated holding. How the overlay optimizer picks strikes, what the §1092 qualified-covered-call rule constrains, and what the premium yield looks like over a decade of single-name regimes.
Premium yield · median yr+3.5% - Strategy · deep diveMay 2026
Variable prepaid forwards: cash today, gain deferred
How a VPF is structured against a concentrated holding, why §1259 doesn't bite at typical collar widths, and the present-value cash-vs-deferral trade the optimizer surfaces under three counterparty curves.
PV of cash today82% of spot
4 posts
Country-by-country: the statutes, the lot mechanics, the wash-sale equivalents, and what the optimizer's tax engine actually computes.
- Jurisdiction · United StatesMay 2026
United States: §1091 wash sales, HIFO, and the realisation calendar
The US tax engine in detail — what makes a security 'substantially identical', how HIFO is computed at the lot, the short/long boundary, and the surcharges (NIIT, AMT, state) the optimizer prices in.
Loss-harvest window30 days both sides - Jurisdiction · CanadaMay 2026
Canada: ACB averaging and the superficial-loss rule
Why HIFO is unavailable, how the average-cost-base mechanic changes the harvest cadence, and where the 30-day superficial-loss rule differs from §1091 in the controlled-affiliate net it casts.
Lot methodACB (statute) - Jurisdiction · AustraliaMay 2026
Australia: FIFO, the 50% CGT discount, and the holding-period gate
How the 12-month CGT discount changes the marginal-cost calculus inside the optimizer's objective, the FIFO interaction with deemed-disposition events, and what the ATO's wash-sale 'mischief' guidance actually says about loss harvesting.
Long-term lot rate½ × marginal - Jurisdiction · IndiaMay 2026
India: STT, the LTCG exemption, and 2018 grandfathering
The transaction-tax leg, the ₹1L LTCG exemption, the §10(38) grandfathering of pre-2018 acquisition cost, and how the optimizer values lots whose basis is the higher of cost and 31 January 2018 fair market value.
LTCG exemption₹1L / year
3 posts
The math behind each one-shot tool — transition planning, year-end harvest, charitable giving — written for practitioners.
- Tool · methodologyMay 2026
The transition planner: a multi-period LP for moving a portfolio under a tax budget
From a current concentrated portfolio to a benchmark-tracking book, one quarter at a time. The LP formulation, how the realised-gain budget binds, what 'cumulative integrated tracking error' means, and a worked transition over eight quarters.
Horizon · default8 quarters - Tool · methodologyMay 2026
Year-end loss harvest maximizer: one-sided harvest under a calendar gate
Late-November snapshots, the gain-ceiling-of-zero constraint, the 30-day pre/post wash-sale window, and what 'harvested loss / NAV' realistically tops out at across US large-cap, US all-cap, and a 50-name concentrated book.
Median Dec harvest1.4% NAV - Tool · methodologyMay 2026
The charitable-giving optimizer: which lots leave the portfolio without realising the gain
Picking the appreciated lots whose in-kind donation maximises capital-gains tax avoided, subject to a TE-preservation cap on the residual portfolio. The objective, the AGI-cap binding, and the difference between gifting cash and gifting stock at scale.
Avoided / gift $≈ 17 ¢ on the dollar
3 posts
How the platform is built. Daily orchestration, snapshot replay, cadence economics, kill-switch.
- Engineering · systemMay 2026
The DailyRunner: orchestration, idempotency, and the kill switch
How twenty accounts get rebalanced every morning before market open, why every solve is account-scoped and idempotent, what the per-account run_seq is for, and how a single boolean flag freezes the whole fleet.
- Engineering · systemMay 2026
Reproducibility by snapshot: replaying any solve, any day
Every Run row carries the strategy params, the covariance matrix, the constraint set, and the lot state at solve-time. The shape of the snapshot, the storage cost we accept, and the audit story that falls out for free.
- Engineering · operationsMay 2026
Daily, weekly, or monthly: when does the cadence pay for itself?
An empirical sweep — same strategy, same universe, three rebalance frequencies — measuring after-tax alpha against operational cost, transaction cost, and slippage. The break-even NAV at which daily wins.
Daily break-even NAV≈ $400k
4 posts
Backtest hygiene, risk-model construction, replacement-security selection, and what after-tax alpha actually measures.
- Methodology · backtestMay 2026
Building a backtest you can defend
Lookahead, survivorship, point-in-time benchmark constituents, holiday calendars, dividend timing, corporate actions. The hygiene checklist behind every backtest on this site, and why each item is on it.
- Methodology · risk modelMay 2026
Risk model construction: the Σ matrix, the factor loadings, and why both matter
How the covariance matrix is estimated (Ledoit–Wolf shrinkage), how the factor loadings are derived, the refresh cadence, and what changes in tracking-error feasibility when Σ is built from 252 days versus 504 days of returns.
- Methodology · tradingMay 2026
Replacement-security selection under wash-sale: how the optimizer keeps the factor exposure
When a name is sold for a loss and locked for 30 days, the optimizer needs a substitute that's correlated enough to preserve tracking error but not 'substantially identical' under §1091. The selection rule, the cluster heuristics, and the audit trail.
- Methodology · measurementMay 2026
What 'tax alpha' actually measures (and what it doesn't)
Separating tax alpha from factor alpha, market exposure, and timing luck. Why naive tax-alpha numbers in published material are usually too high, and the three corrections this platform applies before reporting it.
Posts here are educational. Numbers in figures and tables are illustrative unless explicitly marked as a real run; charts are flagged in oxblood when synthesized for presentation. See the disclosures for the assumptions behind every backtest.