A desk that repeatedly solves a long-only S&P 500 frontier can get every corner in 0.14 seconds. Schmelzer does it with one call to scikit-learn's lars_path, after shifting the response by a value calculated in advance. All 94 corners agree with an independent QP to 5.4×10^-13. This is the most useful portfolio plumbing I have read in a while, and Schmelzer presents it as engineering. The case for using it rests on optimization speed and accuracy; the paper supplies no evidence about returns.
How does a LASSO path trace the frontier?
Markowitz's Critical Line Algorithm moves from one frontier corner to the next. At each corner, an asset enters or leaves; between corners, weights follow straight lines. LARS traces an equivalent path for the LASSO, whose corners are called knots. A companion paper by Schmelzer and Hastie proves that a change of variables makes the paths coincide. Factor Σ = X'X, then choose y so that X'y = μ. The objective ½w'Σw − μ'w becomes ½‖y − Xw‖² minus a constant. X has one row per asset. Nobody observed y; it is an algebraic construction with no statistical content.
That construction gives three frontiers. A gross-exposure cap, ‖w‖₁ ≤ c, produces the plain LASSO path and thus the long-short frontier. Rescale those columns by c/t to hold leverage fixed while varying risk appetite. For a long-only, fully invested book, 1'v equals ‖v‖₁ when v ≥ 0, turning the budget problem into a nonnegative LASSO. X can be any square root of Σ, including centred returns or a stacked factor-model matrix requiring no factorisation.
The tests use a seeded 20-asset, five-factor problem; simulated factor models at n = 20, 50, 100 and 500, with three seeds each; and 494 S&P 500 stocks with 1213 daily returns from July 2021 to May 2026. Centred returns serve as X for the stocks.
The stop at maximum Sharpe
An ordinary LASSO solver lowers its penalty ν from max μ_j to zero and stops: negative penalties are outside its remit. Normalise the long-only solution at ν = 0 and it is the long-only maximum-Sharpe portfolio. In the test problem, that point arrives at tilt 0.1414, after 17 corners. The frontier continues. Its budget constraint still binds below that tilt, even as the constraint's multiplier becomes negative.
Schmelzer completes the square again to reach that portion of the frontier. Solve X'd = 1 and give the positive LASSO y − ν₀d as its response. A solver penalty ν' ≥ 0 then corresponds to ν = ν₀ + ν' in the original problem. The shifted call finds 19 corners on the test problem, including the missed corners at tilts 0.1158 and 0.0128.
Choosing ν₀ takes care. The paper finds the last corner in advance by identifying the minimum-variance support through an NNLS fit of X against d, then subtracts a margin. Across the test problem, one factor model and the stocks, ν_last is −4.95, −11.9 and −0.178, respectively. "No fixed value would be safe," the author writes. The stock-data margin sweep makes the risk concrete: δ = 10^-4 misses the final corner, whereas every δ from 10^-2 to 1 finds all 94 with KKT residuals below 4×10^-13. At δ = 100, the residual rises to 2×10^-11.
There is a trading interpretation for ν: it is Black's zero-beta rate. For any rate in the covered range, the long-only maximum-Sharpe portfolio lies on a straight line between two path columns. On the stocks, ν_last is about fifty times max|μ_j| below zero. The unshifted call therefore reaches only a small part of that range.
Speed on the S&P 500
The complete path for 494 stocks takes 0.14 seconds. One QP solve takes about 0.12 seconds; a 100-point grid of cold solves takes about 12 seconds. Warm-started OSQP reuses its factorisation and starts each solve from the preceding one. At tolerance 10^-6, that grid takes 4.9 seconds, roughly 35 times the path's 0.14 s, and agrees with the cold QP to 4.1×10^-13. At 10^-5, OSQP takes 3.4 seconds, though some points miss by 10^-3. These timings come from one laptop.
The author's accuracy claim needs separating from the speed claim. At grid points, warm OSQP at 10^-6 is already within 4.1×10^-13 of the cold QP, versus 5.4×10^-13 for the path. Coverage is the better argument: grid solves miss corners between their chosen points, whereas the path supplies the corners and every intervening portfolio follows by exact interpolation.
What does 10^-13 agreement buy?
Faithful arithmetic for the supplied inputs. Each stock corner agrees with its QP to 5.4×10^-13, and the 53-name minimum-variance portfolio agrees to 1.2×10^-15. On simulated 500-asset factor models, a 239 ms median run finds 503 corners. The gap to the QP is 6.7×10^-11; the KKT residuals attribute that gap to the QP's error.
The inputs still carry estimation error. Σ comes from the sample covariance of 1213 days, so the exact frontier is exact for that sample. The author is explicit about the scope: "The numbers above test the implementation." We found no out-of-sample return or transaction-cost figure in the paper, and the author claims none.
The stock universe uses S&P 500 constituents listed on Wikipedia at download time and applies that list back to 2021. A return study using the file would inherit survivorship; the accuracy comparisons do not. Separately, the long-short Sharpe rise from 0.539 at the first corner to 2.120 at the end belongs to the simulated problem. The author calls those Sharpe ratios "far above anything real assets offer" and says the monotone rise has not been proven.
Where the method ends
Σ must be positive definite. The author regards a singular Σ as the wrong case because the identity is not known to hold there. Raw sample covariances with T < n are therefore outside the method; the stock test has 1213 days for 494 names. Beyond sign restrictions, the method allows either a gross cap or a budget. Signs must be all free or all nonnegative, leaving out dollar-neutral books, 130/30 books and sector limits. Among the software considered, only scikit-learn has the positive LASSO. Its lars_path defaults to a 500-step stop; the 500-asset model requires 503 corners, so max_iter should be about 10n.
For a long-only, budget-only desk sweeping risk aversion or a zero-beta rate daily, the path can replace a QP grid today. The lost final corner at δ = 10^-4 shows why the shift deserves care. A disagreement with a QP at the default δ = 1 on a well-conditioned Σ would change my view.