Constrained Portfolio Construction & Factor Attribution

A monthly walk-forward study of how shrinkage estimates, risk objectives, trading constraints, and transaction costs affect portfolio weights, followed by factor-based active-return reconciliation.

What happens after a return estimate?

The project studies the portfolio-construction layer between noisy estimates and feasible portfolio weights: covariance estimation, downside objectives, benchmark-relative risk, turnover, transaction costs, factor exposure, and discrete holding counts.

7long-only methods
72monthly holding periods
8exact holdings in CVaR MILP
10 bpone-way turnover cost model

Public demonstration

Deterministic synthetic panel

Twelve synthetic assets and synthetic factor returns exercise the complete workflow. Public figures are engineering demonstrations, not investment results.

Retained-data adapter

External CRSP-derived price panel

The adapter has been validated against 101 retained securities from 2018-2025. Licensed rows, weights, and performance outputs are not published.

Weights are formed from lagged information

For holding month t, estimates use observations dated through t-1. Missing returns are never replaced with zero. Portfolio weights drift with realized returns before turnover and transaction costs are computed at the next rebalance.

2018-2019Estimation warm-up

History used to seed the first monthly decision.

2020-2023Development

Method and constraint development period.

2024-2025Already-inspected evaluation

Reported with that label; not described as a pristine test.

Mean shrinkageμ̂i = 0.5μ̄i + 0.5μ̄grand
CovarianceΣ̂ = Ledoit-Wolf shrinkage estimate
Turnoverτ = 0.5 ∑i|wi - w̃i|

A curated comparison, not a model catalog

MethodObjectiveImplementationRole
Equal weightNoneAnalyticReference portfolio
Global minimum varianceMinimize varianceCVXPYRisk-only baseline
Shrinkage mean-varianceReturn minus risk penaltyCVXPYNoisy-forecast allocation
Maximum estimated SharpeBest solved frontier pointCVXPY frontier gridExplicit GMV fallback if excess return is nonpositive
Historical joint CVaRMinimize empirical 95% loss CVaRCVXPYDownside-risk objective
Benchmark-relative constrainedActive utility net of turnover penaltyCVXPYTracking error, turnover, and factor controls
Exact-cardinality CVaRHistorical CVaR with binary selectionSciPy/HiGHS MILPExactly eight selected assets
Separate appendix. A 130/30 mathematical construction is not included in the main comparison because the project does not model borrow availability, fees, recalls, financing, margin, or market impact.

Feasibility is part of the research result

The benchmark-relative problem controls position size, ex-ante tracking error, one-way turnover, transaction-cost penalty, and active FF5+momentum exposures. The mixed-integer problem links continuous weights to binary selection variables and checks the selected count and integrality residual.

Benchmark-relative position0 ≤ wi ≤ 20%
Benchmark-relative tracking error√(w-b)'Σ(w-b) ≤ 8%
Benchmark-relative turnoverτ ≤ 30%
Exact-cardinality CVaR∑zi = 8; 1%-25% if selected
# src/constrained_portfolio/optimization.py
w = cp.Variable(len(assets))
active = w - benchmark
constraints = [
    cp.sum(w) == 1,
    w >= 0,
    w <= max_weight,
    cp.quad_form(active, cp.psd_wrap(sigma))
        <= tracking_error_limit**2,
]

one_way_turnover = 0.5 * (
    cp.norm1(w - prior) + outside_prior_absolute_weight
)
constraints.append(one_way_turnover <= turnover_limit)
constraints.extend([
    active_factor <= tolerance,
    active_factor >= -tolerance,
])

The figures show method behavior on synthetic data

The public run contains 72 monthly decisions from January 2020 through December 2025. Returns include the stated 10 bp one-way turnover cost model. The paths are useful for comparing construction rules, but they are not evidence of alpha or an investable strategy.

Cumulative net value of six long-only methods on the synthetic public demonstration
Growth of one dollar for six representative long-only methods. The 130/30 appendix is omitted.
Synthetic annualized return and volatility with turnover represented by bubble size
Return, volatility, and turnover are computed from the same deterministic synthetic run.

Active-return reconciliation

Lagged rolling asset regressions estimate exposures under an FF5-plus-momentum specification; the public demonstration uses synthetic factor series. Monthly active return is decomposed into factor contributions, a specific reconciliation residual, and transaction costs.

Active-return factor attribution for the benchmark-relative synthetic portfolio
Sums of monthly arithmetic contributions for the benchmark-relative method. They are not a geometric multi-period attribution.
Interpretation. The specific term is a reconciliation residual. It is not evidence of security-selection skill.

Every solution is checked against its stated constraints

2.3e-13maximum budget residual
4.23%maximum ex-ante tracking error; 8% limit
26.28%maximum turnover; 30% limit
19 / 72explicit GMV fallback months

The exact-cardinality method selected eight assets in every public-demo month, with maximum integrality residual approximately 3.6e-14 and zero reported MIP gap. Gross return less transaction cost reconciles exactly to net return.

A six-month moving-block bootstrap provides 95% intervals for return, volatility, Sharpe ratio, and maximum drawdown. Every public-demo Sharpe interval crosses zero, so the project does not make a statistical-performance claim.

Construction mechanics, not an investment claim

Public evidence

The displayed performance and attribution use synthetic assets and factors. They demonstrate the pipeline, not an empirical strategy.

Retained data

The external panel contains split-adjusted price returns without dividends and a current-constituent, survivorship-biased universe.

Tail estimation

Private CVaR windows contain 18-29 complete monthly scenarios, often leaving only one or two observations in the 95% tail.

Benchmark

The reference is eligible-universe equal weight. The project does not reproduce the Nasdaq-100 or a historical market-cap benchmark.

Coverage

Historical sector data and benchmark weights are unavailable, so sector constraints and Brinson attribution are omitted.

Use

The cost model, constraints, and 130/30 appendix are research assumptions, not a claim of live investability.