<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE article PUBLIC "-//NLM//DTD JATS (Z39.96) Journal Archiving and Interchange DTD v1.2 20190208//EN"
                  "JATS-archivearticle1.dtd">
<article xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:xlink="http://www.w3.org/1999/xlink" dtd-version="1.2" article-type="other">
<front>
<journal-meta>
<journal-id journal-id-type="publisher-id">jrepstat</journal-id>
<journal-title-group>
<journal-title>Journal of Reproducible Statistics</journal-title>
</journal-title-group>
<publisher>
<publisher-name>FAIR Press</publisher-name>
</publisher>
</journal-meta>
<article-meta>
<title-group>
<article-title>The Efficient Frontier from a LASSO Solver: A numerical check of the CLA–LASSO identity</article-title>
</title-group>
<contrib-group>
<contrib contrib-type="author">
<contrib-id contrib-id-type="orcid">https://orcid.org/0009-0009-9771-3501</contrib-id>
<name>
<surname>Schmelzer</surname>
<given-names>Thomas</given-names>
</name>
<aff>Jebel Quant Research, Abu Dhabi</aff>
</contrib>
</contrib-group>
<pub-date date-type="pub" publication-format="electronic">
<year>2026</year>
</pub-date>
<volume>1</volume>
<elocation-id>7</elocation-id>
<history>
<date date-type="received" iso-8601-date="2026-10-14"><day>14</day><month>10</month><year>2026</year></date>
<date date-type="accepted" iso-8601-date="2026-10-15"><day>15</day><month>10</month><year>2026</year></date>
</history>
<permissions>
<license license-type="open-access" xlink:href="https://creativecommons.org/licenses/by/4.0/">
<license-p>This is an open access article distributed under the terms of the Creative Commons Attribution 4.0 International License (CC-BY 4.0), which permits unrestricted use, distribution and reproduction in any medium provided the original work is properly cited.</license-p>
</license>
</permissions>
<self-uri content-type="html" xlink:href="https://jrepstat.fairpressjournals.com/articles/the-efficient-frontier-from-a-lasso-solver-a-numerical-check-of-the-cla-lasso-identity/"/>
<abstract>
<p>Schmelzer and Hastie prove that Markowitz's Critical Line Algorithm and the LASSO path trace the same curve. This companion note checks that result numerically with a stock LASSO solver, lars_path from scikit-learn, and no portfolio software. It covers long–short portfolios under a leverage cap, fixed leverage with varying risk appetite, and the classical long-only, fully invested frontier. Every corner the path returns meets its own optimality conditions to about 10⁻¹³ and agrees with independent quadratic-programming solvers, on factor models of up to 500 assets, on the Fama–French size and book-to-market portfolios, and on five years of simulated daily returns of 500 stocks. A plain call stops the long-only path at the maximum-Sharpe portfolio; shifting the response once, by an amount computed in advance, lets a single call reach the minimum-variance portfolio. The script, its checks, a script that fetches the data, and an R cross-check are published, with a locked environment, so that anyone can repeat them.</p>
</abstract>
<kwd-group kwd-group-type="author">
<kwd>efficient frontier</kwd>
<kwd>critical line algorithm</kwd>
<kwd>LASSO</kwd>
<kwd>least angle regression</kwd>
<kwd>portfolio optimisation</kwd>
<kwd>reproducibility</kwd>
</kwd-group>
<custom-meta-group>
<custom-meta>
<meta-name>data-availability-route</meta-name>
<meta-value>open</meta-value>
</custom-meta>
</custom-meta-group>
</article-meta>
</front>
<body>
<sec id="introduction">
  <title>Introduction</title>
  <p>As the trade-off between expected return and variance changes, the
  optimal portfolio moves along straight lines and changes direction
  only at finitely many <italic>corner portfolios</italic>, where an
  asset enters or leaves. Markowitz’s Critical Line Algorithm (CLA)
  (<xref alt="Markowitz, 1956" rid="ref-markowitz1956" ref-type="bibr">Markowitz,
  1956</xref>) walks from one corner to the next. The LASSO
  (<xref alt="Tibshirani, 1996" rid="ref-tibshirani1996" ref-type="bibr">Tibshirani,
  1996</xref>) behaves the same way as its penalty moves, and the LARS
  algorithm
  (<xref alt="Efron et al., 2004" rid="ref-efron2004" ref-type="bibr">Efron
  et al., 2004</xref>) walks its corners, which statisticians call
  knots. Schmelzer and Hastie
  (<xref alt="2026" rid="ref-perspective" ref-type="bibr">2026</xref>)
  prove that after a change of variables the two paths coincide. This
  note checks that result numerically, by computing frontiers with a
  LASSO solver and testing them against independent solvers, in three
  settings:</p>
  <list list-type="order">
    <list-item>
      <p>long–short under a gross-exposure cap, where the plain LASSO
      path is the frontier
      (Section <xref alt="5" rid="secU003Alongshort">5</xref>);</p>
    </list-item>
    <list-item>
      <p>fixed leverage with varying risk appetite, where the same path
      is rescaled
      (Section <xref alt="6" rid="secU003Aleverage">6</xref>);</p>
    </list-item>
    <list-item>
      <p>long only and fully invested, where the nonnegative LASSO path,
      shifted once, covers the whole frontier in one call
      (Section <xref alt="7" rid="secU003Alongonly">7</xref>,
      Algorithm 1).</p>
    </list-item>
  </list>
  <p>The usual alternative is to solve a quadratic program on a grid of
  tilts. Each solve is only as accurate as its tolerance, and every
  corner between two grid points is missed. A path algorithm returns the
  corners themselves, and every other frontier portfolio is a linear
  interpolation between two of them.</p>
</sec>
<sec id="secU003Ahistory">
  <title>Background</title>
  <p>Markowitz
  (<xref alt="1952" rid="ref-markowitz1952" ref-type="bibr">1952</xref>)
  called a portfolio efficient if no other has a higher expected return
  <inline-formula><alternatives>
  <tex-math><![CDATA[E]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi>E</mml:mi></mml:math></alternatives></inline-formula>
  without a higher variance <inline-formula><alternatives>
  <tex-math><![CDATA[V]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi>V</mml:mi></mml:math></alternatives></inline-formula>,
  or a lower <inline-formula><alternatives>
  <tex-math><![CDATA[V]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi>V</mml:mi></mml:math></alternatives></inline-formula>
  without a lower <inline-formula><alternatives>
  <tex-math><![CDATA[E]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi>E</mml:mi></mml:math></alternatives></inline-formula>.
  Traced by minimising <inline-formula><alternatives>
  <tex-math><![CDATA[\tfrac12V-\lambda E]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mstyle displaystyle="false"><mml:mfrac><mml:mn>1</mml:mn><mml:mn>2</mml:mn></mml:mfrac></mml:mstyle><mml:mi>V</mml:mi><mml:mo>−</mml:mo><mml:mi>λ</mml:mi><mml:mi>E</mml:mi></mml:mrow></mml:math></alternatives></inline-formula>
  over fully invested portfolios for <inline-formula><alternatives>
  <tex-math><![CDATA[\lambda\ge0]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>λ</mml:mi><mml:mo>≥</mml:mo><mml:mn>0</mml:mn></mml:mrow></mml:math></alternatives></inline-formula>,
  they form the efficient frontier, with the minimum-variance portfolio
  at <inline-formula><alternatives>
  <tex-math><![CDATA[\lambda=0]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>λ</mml:mi><mml:mo>=</mml:mo><mml:mn>0</mml:mn></mml:mrow></mml:math></alternatives></inline-formula>.
  The CLA followed
  (<xref alt="Markowitz, 1956" rid="ref-markowitz1956" ref-type="bibr">Markowitz,
  1956</xref>). Tobin
  (<xref alt="1958" rid="ref-tobin1958" ref-type="bibr">1958</xref>) and
  Sharpe
  (<xref alt="1964" rid="ref-sharpe1964" ref-type="bibr">1964</xref>)
  moved the picture to the <inline-formula><alternatives>
  <tex-math><![CDATA[(\sigma,E)]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mo stretchy="false" form="prefix">(</mml:mo><mml:mi>σ</mml:mi><mml:mo>,</mml:mo><mml:mi>E</mml:mi><mml:mo stretchy="false" form="postfix">)</mml:mo></mml:mrow></mml:math></alternatives></inline-formula>
  plane, where Sharpe located the dominant portfolio, the one with the
  highest Sharpe ratio, at the tangent from the riskless rate.</p>
  <p>The LASSO fits least squares under <inline-formula><alternatives>
  <tex-math><![CDATA[\lVert \beta\rVert _1\le t]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:msub><mml:mrow><mml:mo stretchy="true" form="prefix">‖</mml:mo><mml:mi>β</mml:mi><mml:mo stretchy="true" form="postfix">‖</mml:mo></mml:mrow><mml:mn>1</mml:mn></mml:msub><mml:mo>≤</mml:mo><mml:mi>t</mml:mi></mml:mrow></mml:math></alternatives></inline-formula>
  and so shrinks and selects at once. Its path is piecewise linear in
  <inline-formula><alternatives>
  <tex-math><![CDATA[t]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi>t</mml:mi></mml:math></alternatives></inline-formula>.
  Osborne, Presnell and Turlach
  (<xref alt="2000" rid="ref-osborne2000" ref-type="bibr">2000</xref>)
  gave a homotopy for it and Efron et
  al. (<xref alt="2004" rid="ref-efron2004" ref-type="bibr">2004</xref>)
  gave LARS, which also covers the positive LASSO. Later practice moved
  to coordinate descent on a grid of penalties
  (<xref alt="Friedman et al., 2010" rid="ref-friedman2010" ref-type="bibr">Friedman
  et al., 2010</xref>), which, like a grid of tilts, returns points
  rather than corners.</p>
  <p>The two literatures developed for decades without citing each other
  (<xref alt="Schmelzer &amp; Hastie, 2026, Section 5" rid="ref-perspective" ref-type="bibr">Schmelzer
  &amp; Hastie, 2026, Section 5</xref>). The best-known bridge, Brodie
  et
  al. (<xref alt="2009" rid="ref-brodie2009" ref-type="bibr">2009</xref>),
  read a Markowitz problem with a gross-exposure penalty as a LASSO, but
  swept the penalty at a fixed target return rather than tracing the
  frontier. Fan, Zhang and Yu
  (<xref alt="2012" rid="ref-fan2012" ref-type="bibr">2012</xref>) ran
  LARS along the gross-exposure cap of the minimum-variance portfolio.
  They removed the budget by regressing on a reference asset, which
  leaves an <inline-formula><alternatives>
  <tex-math><![CDATA[\ell_1]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:msub><mml:mi>ℓ</mml:mi><mml:mn>1</mml:mn></mml:msub></mml:math></alternatives></inline-formula>
  constraint that is no longer the LASSO’s, so their path is an
  approximation.</p>
</sec>
<sec id="secU003Atest">
  <title>The test problem</title>
  <p>The test problem is the seeded 20-asset example of Figure 1 in
  Schmelzer &amp; Hastie
  (<xref alt="2026" rid="ref-perspective" ref-type="bibr">2026</xref>):
  a five-factor covariance <inline-formula><alternatives>
  <tex-math><![CDATA[\Sigma=\operatorname{diag}(d)+U\operatorname{diag}(\delta)U^{\top}]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi mathvariant="normal">Σ</mml:mi><mml:mo>=</mml:mo><mml:mrow><mml:mi mathvariant="normal">diag</mml:mi><mml:mo>&#8289;</mml:mo></mml:mrow><mml:mo stretchy="false" form="prefix">(</mml:mo><mml:mi>d</mml:mi><mml:mo stretchy="false" form="postfix">)</mml:mo><mml:mo>+</mml:mo><mml:mi>U</mml:mi><mml:mrow><mml:mi mathvariant="normal">diag</mml:mi><mml:mo>&#8289;</mml:mo></mml:mrow><mml:mo stretchy="false" form="prefix">(</mml:mo><mml:mi>δ</mml:mi><mml:mo stretchy="false" form="postfix">)</mml:mo><mml:msup><mml:mi>U</mml:mi><mml:mi>⊤</mml:mi></mml:msup></mml:mrow></mml:math></alternatives></inline-formula>,
  and <inline-formula><alternatives>
  <tex-math><![CDATA[\mu]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi>μ</mml:mi></mml:math></alternatives></inline-formula>
  the sample mean of 50 days of returns simulated from it. Its units are
  arbitrary and its expected returns large against its risk, so Sharpe
  ratios reach <inline-formula><alternatives>
  <tex-math><![CDATA[2.1]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mn>2.1</mml:mn></mml:math></alternatives></inline-formula>
  per period, far above anything real assets offer. It is for
  illustration only;
  Section <xref alt="8" rid="secU003Aevidence">8</xref> adds real
  portfolio returns and a larger universe on a daily scale. The
  companion script <monospace>python/make_figures.py</monospace>
  regenerates every figure and number in the note, and its tests check
  each against a tolerance. The statement on
  <xref alt="code and data availability" rid="secU003Aavailability">code
  and data availability</xref> at the end says where to find it.</p>
</sec>
<sec id="secU003Asub">
  <title>From mean–variance to least squares</title>
  <p>Let <inline-formula><alternatives>
  <tex-math><![CDATA[\Sigma\succ0]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi mathvariant="normal">Σ</mml:mi><mml:mo>≻</mml:mo><mml:mn>0</mml:mn></mml:mrow></mml:math></alternatives></inline-formula>
  be the covariance of <inline-formula><alternatives>
  <tex-math><![CDATA[n]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi>n</mml:mi></mml:math></alternatives></inline-formula>
  assets and <inline-formula><alternatives>
  <tex-math><![CDATA[\mu]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi>μ</mml:mi></mml:math></alternatives></inline-formula>
  their expected returns. With the Cholesky factor
  <inline-formula><alternatives>
  <tex-math><![CDATA[\Sigma=LL^{\top}]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi mathvariant="normal">Σ</mml:mi><mml:mo>=</mml:mo><mml:mi>L</mml:mi><mml:msup><mml:mi>L</mml:mi><mml:mi>⊤</mml:mi></mml:msup></mml:mrow></mml:math></alternatives></inline-formula>,
  set <inline-formula><alternatives>
  <tex-math><![CDATA[X=L^{\top}]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>X</mml:mi><mml:mo>=</mml:mo><mml:msup><mml:mi>L</mml:mi><mml:mi>⊤</mml:mi></mml:msup></mml:mrow></mml:math></alternatives></inline-formula>
  and <inline-formula><alternatives>
  <tex-math><![CDATA[y=L^{-1}\mu]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>y</mml:mi><mml:mo>=</mml:mo><mml:msup><mml:mi>L</mml:mi><mml:mrow><mml:mi>−</mml:mi><mml:mn>1</mml:mn></mml:mrow></mml:msup><mml:mi>μ</mml:mi></mml:mrow></mml:math></alternatives></inline-formula>,
  so that <inline-formula><alternatives>
  <tex-math><![CDATA[X^{\top}X=\Sigma]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:msup><mml:mi>X</mml:mi><mml:mi>⊤</mml:mi></mml:msup><mml:mi>X</mml:mi><mml:mo>=</mml:mo><mml:mi mathvariant="normal">Σ</mml:mi></mml:mrow></mml:math></alternatives></inline-formula>
  and <inline-formula><alternatives>
  <tex-math><![CDATA[X^{\top}y=\mu]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:msup><mml:mi>X</mml:mi><mml:mi>⊤</mml:mi></mml:msup><mml:mi>y</mml:mi><mml:mo>=</mml:mo><mml:mi>μ</mml:mi></mml:mrow></mml:math></alternatives></inline-formula>.
  Then for every portfolio <inline-formula><alternatives>
  <tex-math><![CDATA[w]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi>w</mml:mi></mml:math></alternatives></inline-formula>
  <styled-content id="eqU003Asquare"><disp-formula><alternatives>
  <tex-math><![CDATA[\begin{equation}
  \label{eq:square}
  \tfrac12\,w^{\top}\Sigma w-\mu^{\top}w
  \;=\; \tfrac12\lVert y-Xw\rVert _2^2-\tfrac12\lVert y\rVert _2^2 ,
  \end{equation} \qquad(1)]]></tex-math>
  <mml:math display="block" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mrow><mml:mstyle displaystyle="false"><mml:mfrac><mml:mn>1</mml:mn><mml:mn>2</mml:mn></mml:mfrac></mml:mstyle><mml:mspace width="0.167em"></mml:mspace><mml:msup><mml:mi>w</mml:mi><mml:mi>⊤</mml:mi></mml:msup><mml:mi mathvariant="normal">Σ</mml:mi><mml:mi>w</mml:mi><mml:mo>−</mml:mo><mml:msup><mml:mi>μ</mml:mi><mml:mi>⊤</mml:mi></mml:msup><mml:mi>w</mml:mi><mml:mspace width="0.278em"></mml:mspace><mml:mo>=</mml:mo><mml:mspace width="0.278em"></mml:mspace><mml:mstyle displaystyle="false"><mml:mfrac><mml:mn>1</mml:mn><mml:mn>2</mml:mn></mml:mfrac></mml:mstyle><mml:msubsup><mml:mrow><mml:mo stretchy="true" form="prefix">‖</mml:mo><mml:mi>y</mml:mi><mml:mo>−</mml:mo><mml:mi>X</mml:mi><mml:mi>w</mml:mi><mml:mo stretchy="true" form="postfix">‖</mml:mo></mml:mrow><mml:mn>2</mml:mn><mml:mn>2</mml:mn></mml:msubsup><mml:mo>−</mml:mo><mml:mstyle displaystyle="false"><mml:mfrac><mml:mn>1</mml:mn><mml:mn>2</mml:mn></mml:mfrac></mml:mstyle><mml:msubsup><mml:mrow><mml:mo stretchy="true" form="prefix">‖</mml:mo><mml:mi>y</mml:mi><mml:mo stretchy="true" form="postfix">‖</mml:mo></mml:mrow><mml:mn>2</mml:mn><mml:mn>2</mml:mn></mml:msubsup><mml:mo>,</mml:mo></mml:mrow><mml:mspace width="2.0em"></mml:mspace><mml:mo stretchy="false" form="prefix">(</mml:mo><mml:mn>1</mml:mn><mml:mo stretchy="false" form="postfix">)</mml:mo></mml:mrow></mml:math></alternatives></disp-formula></styled-content>
  and under any constraints the mean–variance problem is a least-squares
  problem.</p>
  <preformat>X = np.linalg.cholesky(Sigma, upper=True)  # X.T @ X == Sigma
y = np.linalg.lstsq(X.T, mu)[0]            # X.T @ y == mu
w = np.linalg.lstsq(X, y)[0]               # unconstrained optimum Sigma^{-1} mu</preformat>
  <p>The last line solves the normal equations
  <inline-formula><alternatives>
  <tex-math><![CDATA[X^{\top}Xw=X^{\top}y]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:msup><mml:mi>X</mml:mi><mml:mi>⊤</mml:mi></mml:msup><mml:mi>X</mml:mi><mml:mi>w</mml:mi><mml:mo>=</mml:mo><mml:msup><mml:mi>X</mml:mi><mml:mi>⊤</mml:mi></mml:msup><mml:mi>y</mml:mi></mml:mrow></mml:math></alternatives></inline-formula>,
  which are <inline-formula><alternatives>
  <tex-math><![CDATA[\Sigma w=\mu]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi mathvariant="normal">Σ</mml:mi><mml:mi>w</mml:mi><mml:mo>=</mml:mo><mml:mi>μ</mml:mi></mml:mrow></mml:math></alternatives></inline-formula>.
  With constraints, the optimality conditions become normal equations
  restricted to the assets held, a linear system in the trade-off
  parameter. The weights stay linear until the holdings change, and
  those changes are the corners. The substitution is a change of
  variables, not a statistical model: <inline-formula><alternatives>
  <tex-math><![CDATA[X]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi>X</mml:mi></mml:math></alternatives></inline-formula>
  has one row per asset, and <inline-formula><alternatives>
  <tex-math><![CDATA[y]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi>y</mml:mi></mml:math></alternatives></inline-formula>
  is not data
  (<xref alt="Schmelzer &amp; Hastie, 2026, Section 4" rid="ref-perspective" ref-type="bibr">Schmelzer
  &amp; Hastie, 2026, Section 4</xref>).</p>
  <p>Only <inline-formula><alternatives>
  <tex-math><![CDATA[X^{\top}X]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:msup><mml:mi>X</mml:mi><mml:mi>⊤</mml:mi></mml:msup><mml:mi>X</mml:mi></mml:mrow></mml:math></alternatives></inline-formula>
  and <inline-formula><alternatives>
  <tex-math><![CDATA[X^{\top}y]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:msup><mml:mi>X</mml:mi><mml:mi>⊤</mml:mi></mml:msup><mml:mi>y</mml:mi></mml:mrow></mml:math></alternatives></inline-formula>
  matter, so any square root of <inline-formula><alternatives>
  <tex-math><![CDATA[\Sigma]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi mathvariant="normal">Σ</mml:mi></mml:math></alternatives></inline-formula>
  will do. If <inline-formula><alternatives>
  <tex-math><![CDATA[\Sigma]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi mathvariant="normal">Σ</mml:mi></mml:math></alternatives></inline-formula>
  is a sample covariance from a <inline-formula><alternatives>
  <tex-math><![CDATA[T\times n]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>T</mml:mi><mml:mo>×</mml:mo><mml:mi>n</mml:mi></mml:mrow></mml:math></alternatives></inline-formula>
  return matrix <inline-formula><alternatives>
  <tex-math><![CDATA[R]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi>R</mml:mi></mml:math></alternatives></inline-formula>
  with <inline-formula><alternatives>
  <tex-math><![CDATA[T>n]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>T</mml:mi><mml:mo>&gt;</mml:mo><mml:mi>n</mml:mi></mml:mrow></mml:math></alternatives></inline-formula>,
  the centred returns <inline-formula><alternatives>
  <tex-math><![CDATA[X=(R-\mathbf 1\bar r^{\top})/\sqrt{T-1}]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>X</mml:mi><mml:mo>=</mml:mo><mml:mo stretchy="false" form="prefix">(</mml:mo><mml:mi>R</mml:mi><mml:mo>−</mml:mo><mml:mn mathvariant="bold">𝟏</mml:mn><mml:msup><mml:mover><mml:mi>r</mml:mi><mml:mo accent="true">‾</mml:mo></mml:mover><mml:mi>⊤</mml:mi></mml:msup><mml:mo stretchy="false" form="postfix">)</mml:mo><mml:mi>/</mml:mi><mml:msqrt><mml:mrow><mml:mi>T</mml:mi><mml:mo>−</mml:mo><mml:mn>1</mml:mn></mml:mrow></mml:msqrt></mml:mrow></mml:math></alternatives></inline-formula>
  work, with <inline-formula><alternatives>
  <tex-math><![CDATA[y]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi>y</mml:mi></mml:math></alternatives></inline-formula>
  from <monospace>lstsq</monospace>. For a factor model, stacking
  <inline-formula><alternatives>
  <tex-math><![CDATA[\operatorname{diag}(d)^{1/2}]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mrow><mml:mi mathvariant="normal">diag</mml:mi><mml:mo>&#8289;</mml:mo></mml:mrow><mml:mo stretchy="false" form="prefix">(</mml:mo><mml:mi>d</mml:mi><mml:msup><mml:mo stretchy="false" form="postfix">)</mml:mo><mml:mrow><mml:mn>1</mml:mn><mml:mi>/</mml:mi><mml:mn>2</mml:mn></mml:mrow></mml:msup></mml:mrow></mml:math></alternatives></inline-formula>
  over <inline-formula><alternatives>
  <tex-math><![CDATA[\operatorname{diag}(\delta)^{1/2}U^{\top}]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mrow><mml:mi mathvariant="normal">diag</mml:mi><mml:mo>&#8289;</mml:mo></mml:mrow><mml:mo stretchy="false" form="prefix">(</mml:mo><mml:mi>δ</mml:mi><mml:msup><mml:mo stretchy="false" form="postfix">)</mml:mo><mml:mrow><mml:mn>1</mml:mn><mml:mi>/</mml:mi><mml:mn>2</mml:mn></mml:mrow></mml:msup><mml:msup><mml:mi>U</mml:mi><mml:mi>⊤</mml:mi></mml:msup></mml:mrow></mml:math></alternatives></inline-formula>
  gives an <inline-formula><alternatives>
  <tex-math><![CDATA[(n+k)\times n]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mo stretchy="false" form="prefix">(</mml:mo><mml:mi>n</mml:mi><mml:mo>+</mml:mo><mml:mi>k</mml:mi><mml:mo stretchy="false" form="postfix">)</mml:mo><mml:mo>×</mml:mo><mml:mi>n</mml:mi></mml:mrow></mml:math></alternatives></inline-formula>
  matrix with no factorisation at all, and
  <inline-formula><alternatives>
  <tex-math><![CDATA[y=(\operatorname{diag}(d)^{-1/2}\mu,\,0)]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>y</mml:mi><mml:mo>=</mml:mo><mml:mo stretchy="false" form="prefix">(</mml:mo><mml:mrow><mml:mi mathvariant="normal">diag</mml:mi><mml:mo>&#8289;</mml:mo></mml:mrow><mml:mo stretchy="false" form="prefix">(</mml:mo><mml:mi>d</mml:mi><mml:msup><mml:mo stretchy="false" form="postfix">)</mml:mo><mml:mrow><mml:mi>−</mml:mi><mml:mn>1</mml:mn><mml:mi>/</mml:mi><mml:mn>2</mml:mn></mml:mrow></mml:msup><mml:mi>μ</mml:mi><mml:mo>,</mml:mo><mml:mspace width="0.167em"></mml:mspace><mml:mn>0</mml:mn><mml:mo stretchy="false" form="postfix">)</mml:mo></mml:mrow></mml:math></alternatives></inline-formula>.
  Both reproduce the Cholesky path to rounding.</p>
</sec>
<sec id="secU003Alongshort">
  <title>Long–short with a leverage cap</title>
  <fig id="figU003Afrontier">
    <caption><p>Both frontiers of the test problem, computed with a
    LASSO solver. <italic>(a)</italic> Long–short under a gross-exposure
    cap. <italic>(b)</italic> Long-only, fully invested: blue corners
    come from a plain call, red squares are the two it misses
    (Section <xref alt="7" rid="secU003Alongonly">7</xref>). A triangle
    marks the highest-return portfolio, a diamond the maximum-Sharpe and
    a star the minimum-variance portfolio; the inset magnifies the
    low-risk end.</p></caption>
    <graphic mimetype="application" mime-subtype="pdf" xlink:href="figures/frontier.pdf" />
  </fig>
  <p><bold>Parameters.</bold> <inline-formula><alternatives>
  <tex-math><![CDATA[\lambda]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi>λ</mml:mi></mml:math></alternatives></inline-formula>:
  the tilt, or risk appetite. <inline-formula><alternatives>
  <tex-math><![CDATA[c]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi>c</mml:mi></mml:math></alternatives></inline-formula>:
  the gross-exposure cap, and <inline-formula><alternatives>
  <tex-math><![CDATA[\kappa]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi>κ</mml:mi></mml:math></alternatives></inline-formula>:
  its multiplier, the LASSO penalty of
  Sections <xref alt="5" rid="secU003Alongshort">5</xref>
  and <xref alt="6" rid="secU003Aleverage">6</xref>.
  <inline-formula><alternatives>
  <tex-math><![CDATA[t=\mathbf 1^{\top}v=1/\lambda]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>t</mml:mi><mml:mo>=</mml:mo><mml:msup><mml:mn mathvariant="bold">𝟏</mml:mn><mml:mi>⊤</mml:mi></mml:msup><mml:mi>v</mml:mi><mml:mo>=</mml:mo><mml:mn>1</mml:mn><mml:mi>/</mml:mi><mml:mi>λ</mml:mi></mml:mrow></mml:math></alternatives></inline-formula>:
  the budget of the rescaled long-only problem, and
  <inline-formula><alternatives>
  <tex-math><![CDATA[\nu]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi>ν</mml:mi></mml:math></alternatives></inline-formula>:
  its multiplier, the LASSO penalty of
  Section <xref alt="7" rid="secU003Alongonly">7</xref>.</p>
  <p>With the gross exposure <inline-formula><alternatives>
  <tex-math><![CDATA[\lVert w\rVert _1]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:msub><mml:mrow><mml:mo stretchy="true" form="prefix">‖</mml:mo><mml:mi>w</mml:mi><mml:mo stretchy="true" form="postfix">‖</mml:mo></mml:mrow><mml:mn>1</mml:mn></mml:msub></mml:math></alternatives></inline-formula>
  capped at <inline-formula><alternatives>
  <tex-math><![CDATA[c]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi>c</mml:mi></mml:math></alternatives></inline-formula>,
  <styled-content id="eqU003Amark"><disp-formula><alternatives>
  <tex-math><![CDATA[\begin{equation}
  \label{eq:mark}
  \min_w\ \tfrac12\,w^{\top}\Sigma w-\mu^{\top}w
  \qquad\text{s.t.}\qquad \lVert w\rVert _1\le c
  \end{equation} \qquad(2)]]></tex-math>
  <mml:math display="block" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mrow><mml:munder><mml:mi mathvariant="normal">min</mml:mi><mml:mi>w</mml:mi></mml:munder><mml:mspace width="0.222em"></mml:mspace><mml:mstyle displaystyle="false"><mml:mfrac><mml:mn>1</mml:mn><mml:mn>2</mml:mn></mml:mfrac></mml:mstyle><mml:mspace width="0.167em"></mml:mspace><mml:msup><mml:mi>w</mml:mi><mml:mi>⊤</mml:mi></mml:msup><mml:mi mathvariant="normal">Σ</mml:mi><mml:mi>w</mml:mi><mml:mo>−</mml:mo><mml:msup><mml:mi>μ</mml:mi><mml:mi>⊤</mml:mi></mml:msup><mml:mi>w</mml:mi><mml:mspace width="2.0em"></mml:mspace><mml:mtext mathvariant="normal">s.t.</mml:mtext><mml:mspace width="2.0em"></mml:mspace><mml:msub><mml:mrow><mml:mo stretchy="true" form="prefix">‖</mml:mo><mml:mi>w</mml:mi><mml:mo stretchy="true" form="postfix">‖</mml:mo></mml:mrow><mml:mn>1</mml:mn></mml:msub><mml:mo>≤</mml:mo><mml:mi>c</mml:mi></mml:mrow><mml:mspace width="2.0em"></mml:mspace><mml:mo stretchy="false" form="prefix">(</mml:mo><mml:mn>2</mml:mn><mml:mo stretchy="false" form="postfix">)</mml:mo></mml:mrow></mml:math></alternatives></disp-formula></styled-content>
  is, by <xref alt="(1)" rid="eqU003Asquare">(1)</xref>, the LASSO in
  constrained form, the observation behind the sparse portfolios of
  Brodie et
  al. (<xref alt="2009" rid="ref-brodie2009" ref-type="bibr">2009</xref>).
  Its penalised form is <inline-formula><alternatives>
  <tex-math><![CDATA[\min_\beta\tfrac12\lVert y-X\beta\rVert _2^2+\kappa\lVert \beta\rVert _1]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:msub><mml:mrow><mml:mi mathvariant="normal">min</mml:mi><mml:mo>&#8289;</mml:mo></mml:mrow><mml:mi>β</mml:mi></mml:msub><mml:mstyle displaystyle="false"><mml:mfrac><mml:mn>1</mml:mn><mml:mn>2</mml:mn></mml:mfrac></mml:mstyle><mml:msubsup><mml:mrow><mml:mo stretchy="true" form="prefix">‖</mml:mo><mml:mi>y</mml:mi><mml:mo>−</mml:mo><mml:mi>X</mml:mi><mml:mi>β</mml:mi><mml:mo stretchy="true" form="postfix">‖</mml:mo></mml:mrow><mml:mn>2</mml:mn><mml:mn>2</mml:mn></mml:msubsup><mml:mo>+</mml:mo><mml:mi>κ</mml:mi><mml:msub><mml:mrow><mml:mo stretchy="true" form="prefix">‖</mml:mo><mml:mi>β</mml:mi><mml:mo stretchy="true" form="postfix">‖</mml:mo></mml:mrow><mml:mn>1</mml:mn></mml:msub></mml:mrow></mml:math></alternatives></inline-formula>,
  where <inline-formula><alternatives>
  <tex-math><![CDATA[\kappa\ge0]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>κ</mml:mi><mml:mo>≥</mml:mo><mml:mn>0</mml:mn></mml:mrow></mml:math></alternatives></inline-formula>
  is the multiplier of the cap and <inline-formula><alternatives>
  <tex-math><![CDATA[c=\lVert \beta(\kappa)\rVert _1]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>c</mml:mi><mml:mo>=</mml:mo><mml:msub><mml:mrow><mml:mo stretchy="true" form="prefix">‖</mml:mo><mml:mi>β</mml:mi><mml:mo stretchy="false" form="prefix">(</mml:mo><mml:mi>κ</mml:mi><mml:mo stretchy="false" form="postfix">)</mml:mo><mml:mo stretchy="true" form="postfix">‖</mml:mo></mml:mrow><mml:mn>1</mml:mn></mml:msub></mml:mrow></mml:math></alternatives></inline-formula>.
  So the LASSO path is the frontier of
  <xref alt="(2)" rid="eqU003Amark">(2)</xref>
  (<xref alt="Schmelzer &amp; Hastie, 2026" rid="ref-perspective" ref-type="bibr">Schmelzer
  &amp; Hastie, 2026</xref>, Theorem 1), and
  <monospace>scikit-learn</monospace>
  (<xref alt="Pedregosa et al., 2011" rid="ref-sklearn" ref-type="bibr"><named-content content-type="nocase">Pedregosa
  et al.</named-content>, 2011</xref>) computes it:</p>
  <preformat>_, _, B = lars_path(X, y, method=&quot;lasso&quot;)  # columns: start, corners, end
_, _, B = lars_path_gram(Xy=mu, Gram=Sigma, n_samples=len(mu), method=&quot;lasso&quot;)</preformat>
  <p>The second line gives the same path from
  <inline-formula><alternatives>
  <tex-math><![CDATA[(\Sigma,\mu)]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mo stretchy="false" form="prefix">(</mml:mo><mml:mi mathvariant="normal">Σ</mml:mi><mml:mo>,</mml:mo><mml:mi>μ</mml:mi><mml:mo stretchy="false" form="postfix">)</mml:mo></mml:mrow></mml:math></alternatives></inline-formula>
  alone. In R the <monospace>lars</monospace> package
  (<xref alt="Hastie &amp; Efron, 2022" rid="ref-lars" ref-type="bibr">Hastie
  &amp; Efron, 2022</xref>) traces it too:</p>
  <code language="r script">library(lars)
X &lt;- chol(Sigma)                          # t(X) %*% X == Sigma
y &lt;- backsolve(X, mu, transpose = TRUE)   # t(X) %*% y == mu
fit &lt;- lars(X, y, type = &quot;lasso&quot;, normalize = FALSE, intercept = FALSE)
B &lt;- t(coef(fit))                         # columns: start, corners, end</code>
  <p>It has no positivity constraint, so the long-only path of
  Section <xref alt="7" rid="secU003Alongonly">7</xref> needs
  <monospace>scikit-learn</monospace>. On the test problem the path has
  21 columns: the empty portfolio at the start, 19 corners, each adding
  one asset, and the end. The path starts at
  <inline-formula><alternatives>
  <tex-math><![CDATA[w=0]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>w</mml:mi><mml:mo>=</mml:mo><mml:mn>0</mml:mn></mml:mrow></mml:math></alternatives></inline-formula>,
  which is optimal while <inline-formula><alternatives>
  <tex-math><![CDATA[\kappa\ge\max_j|\mu_j|]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>κ</mml:mi><mml:mo>≥</mml:mo><mml:msub><mml:mrow><mml:mi mathvariant="normal">max</mml:mi><mml:mo>&#8289;</mml:mo></mml:mrow><mml:mi>j</mml:mi></mml:msub><mml:mo stretchy="false" form="prefix">|</mml:mo><mml:msub><mml:mi>μ</mml:mi><mml:mi>j</mml:mi></mml:msub><mml:mo stretchy="false" form="prefix">|</mml:mo></mml:mrow></mml:math></alternatives></inline-formula>,
  and ends at <inline-formula><alternatives>
  <tex-math><![CDATA[\kappa=0]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>κ</mml:mi><mml:mo>=</mml:mo><mml:mn>0</mml:mn></mml:mrow></mml:math></alternatives></inline-formula>,
  where the cap stops binding at <inline-formula><alternatives>
  <tex-math><![CDATA[w^\star=\Sigma^{-1}\mu]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:msup><mml:mi>w</mml:mi><mml:mo>⋆</mml:mo></mml:msup><mml:mo>=</mml:mo><mml:msup><mml:mi mathvariant="normal">Σ</mml:mi><mml:mrow><mml:mi>−</mml:mi><mml:mn>1</mml:mn></mml:mrow></mml:msup><mml:mi>μ</mml:mi></mml:mrow></mml:math></alternatives></inline-formula>
  with <inline-formula><alternatives>
  <tex-math><![CDATA[\lVert w^\star\rVert _1=7.765]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:msub><mml:mrow><mml:mo stretchy="true" form="prefix">‖</mml:mo><mml:msup><mml:mi>w</mml:mi><mml:mo>⋆</mml:mo></mml:msup><mml:mo stretchy="true" form="postfix">‖</mml:mo></mml:mrow><mml:mn>1</mml:mn></mml:msub><mml:mo>=</mml:mo><mml:mn>7.765</mml:mn></mml:mrow></mml:math></alternatives></inline-formula>.
  That end maximises <inline-formula><alternatives>
  <tex-math><![CDATA[\mu^{\top}w-\frac12w^{\top}\Sigma w]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:msup><mml:mi>μ</mml:mi><mml:mi>⊤</mml:mi></mml:msup><mml:mi>w</mml:mi><mml:mo>−</mml:mo><mml:mfrac><mml:mn>1</mml:mn><mml:mn>2</mml:mn></mml:mfrac><mml:msup><mml:mi>w</mml:mi><mml:mi>⊤</mml:mi></mml:msup><mml:mi mathvariant="normal">Σ</mml:mi><mml:mi>w</mml:mi></mml:mrow></mml:math></alternatives></inline-formula>,
  the second-order approximation to expected log growth, so it is the
  Kelly portfolio
  (<xref alt="Kelly, 1956" rid="ref-kelly1956" ref-type="bibr">Kelly,
  1956</xref>). Since <inline-formula><alternatives>
  <tex-math><![CDATA[\Sigma^{-1}\mu]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:msup><mml:mi mathvariant="normal">Σ</mml:mi><mml:mrow><mml:mi>−</mml:mi><mml:mn>1</mml:mn></mml:mrow></mml:msup><mml:mi>μ</mml:mi></mml:mrow></mml:math></alternatives></inline-formula>
  also maximises the scale-free Sharpe ratio, it points towards the
  maximum-Sharpe portfolio. On the test problem the Sharpe ratio rises
  from corner to corner, from <inline-formula><alternatives>
  <tex-math><![CDATA[0.539]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mn>0.539</mml:mn></mml:math></alternatives></inline-formula>
  at the first to <inline-formula><alternatives>
  <tex-math><![CDATA[\sqrt{\mu^{\top}\Sigma^{-1}\mu}=2.120]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:msqrt><mml:mrow><mml:msup><mml:mi>μ</mml:mi><mml:mi>⊤</mml:mi></mml:msup><mml:msup><mml:mi mathvariant="normal">Σ</mml:mi><mml:mrow><mml:mi>−</mml:mi><mml:mn>1</mml:mn></mml:mrow></mml:msup><mml:mi>μ</mml:mi></mml:mrow></mml:msqrt><mml:mo>=</mml:mo><mml:mn>2.120</mml:mn></mml:mrow></mml:math></alternatives></inline-formula>
  at the end, although nothing shown here says it must. Neither end is
  the minimum-variance portfolio, which needs the budget
  <inline-formula><alternatives>
  <tex-math><![CDATA[\mathbf 1^{\top}w=1]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:msup><mml:mn mathvariant="bold">𝟏</mml:mn><mml:mi>⊤</mml:mi></mml:msup><mml:mi>w</mml:mi><mml:mo>=</mml:mo><mml:mn>1</mml:mn></mml:mrow></mml:math></alternatives></inline-formula>
  that <xref alt="(2)" rid="eqU003Amark">(2)</xref> lacks.</p>
</sec>
<sec id="secU003Aleverage">
  <title>Fixed leverage, varying risk appetite</title>
  <p>A mandate usually fixes the leverage, say
  <inline-formula><alternatives>
  <tex-math><![CDATA[c=2]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>c</mml:mi><mml:mo>=</mml:mo><mml:mn>2</mml:mn></mml:mrow></mml:math></alternatives></inline-formula>,
  and varies risk appetite through a tilt <inline-formula><alternatives>
  <tex-math><![CDATA[\lambda>0]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>λ</mml:mi><mml:mo>&gt;</mml:mo><mml:mn>0</mml:mn></mml:mrow></mml:math></alternatives></inline-formula>.
  Substituting <inline-formula><alternatives>
  <tex-math><![CDATA[w=\lambda v]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>w</mml:mi><mml:mo>=</mml:mo><mml:mi>λ</mml:mi><mml:mi>v</mml:mi></mml:mrow></mml:math></alternatives></inline-formula>
  in <inline-formula><alternatives>
  <tex-math><![CDATA[\min\tfrac12w^{\top}\Sigma w-\lambda\mu^{\top}w]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mrow><mml:mi mathvariant="normal">min</mml:mi><mml:mo>&#8289;</mml:mo></mml:mrow><mml:mstyle displaystyle="false"><mml:mfrac><mml:mn>1</mml:mn><mml:mn>2</mml:mn></mml:mfrac></mml:mstyle><mml:msup><mml:mi>w</mml:mi><mml:mi>⊤</mml:mi></mml:msup><mml:mi mathvariant="normal">Σ</mml:mi><mml:mi>w</mml:mi><mml:mo>−</mml:mo><mml:mi>λ</mml:mi><mml:msup><mml:mi>μ</mml:mi><mml:mi>⊤</mml:mi></mml:msup><mml:mi>w</mml:mi></mml:mrow></mml:math></alternatives></inline-formula>
  subject to <inline-formula><alternatives>
  <tex-math><![CDATA[\lVert w\rVert _1\le c]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:msub><mml:mrow><mml:mo stretchy="true" form="prefix">‖</mml:mo><mml:mi>w</mml:mi><mml:mo stretchy="true" form="postfix">‖</mml:mo></mml:mrow><mml:mn>1</mml:mn></mml:msub><mml:mo>≤</mml:mo><mml:mi>c</mml:mi></mml:mrow></mml:math></alternatives></inline-formula>
  gives <xref alt="(2)" rid="eqU003Amark">(2)</xref> with cap
  <inline-formula><alternatives>
  <tex-math><![CDATA[c/\lambda]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>c</mml:mi><mml:mi>/</mml:mi><mml:mi>λ</mml:mi></mml:mrow></mml:math></alternatives></inline-formula>.
  The same path therefore serves: a column
  <inline-formula><alternatives>
  <tex-math><![CDATA[\beta]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi>β</mml:mi></mml:math></alternatives></inline-formula>
  with <inline-formula><alternatives>
  <tex-math><![CDATA[t=\lVert \beta\rVert _1]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>t</mml:mi><mml:mo>=</mml:mo><mml:msub><mml:mrow><mml:mo stretchy="true" form="prefix">‖</mml:mo><mml:mi>β</mml:mi><mml:mo stretchy="true" form="postfix">‖</mml:mo></mml:mrow><mml:mn>1</mml:mn></mml:msub></mml:mrow></mml:math></alternatives></inline-formula>,
  scaled to <inline-formula><alternatives>
  <tex-math><![CDATA[w=(c/t)\beta]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>w</mml:mi><mml:mo>=</mml:mo><mml:mo stretchy="false" form="prefix">(</mml:mo><mml:mi>c</mml:mi><mml:mi>/</mml:mi><mml:mi>t</mml:mi><mml:mo stretchy="false" form="postfix">)</mml:mo><mml:mi>β</mml:mi></mml:mrow></mml:math></alternatives></inline-formula>,
  is optimal at tilt <inline-formula><alternatives>
  <tex-math><![CDATA[\lambda=c/t]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>λ</mml:mi><mml:mo>=</mml:mo><mml:mi>c</mml:mi><mml:mi>/</mml:mi><mml:mi>t</mml:mi></mml:mrow></mml:math></alternatives></inline-formula>.</p>
  <preformat>t = np.abs(B[:, 1:]).sum(0)             # gross exposure of each column
W, tilts = B[:, 1:] * (c / t), c / t    # the same portfolios at leverage c</preformat>
  <p>At <inline-formula><alternatives>
  <tex-math><![CDATA[c=2]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>c</mml:mi><mml:mo>=</mml:mo><mml:mn>2</mml:mn></mml:mrow></mml:math></alternatives></inline-formula>
  the columns cover tilts from <inline-formula><alternatives>
  <tex-math><![CDATA[745.6]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mn>745.6</mml:mn></mml:math></alternatives></inline-formula>
  down to <inline-formula><alternatives>
  <tex-math><![CDATA[0.2576]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mn>0.2576</mml:mn></mml:math></alternatives></inline-formula>.
  Below that the cap is slack and the solution
  <inline-formula><alternatives>
  <tex-math><![CDATA[\lambda\Sigma^{-1}\mu]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>λ</mml:mi><mml:msup><mml:mi mathvariant="normal">Σ</mml:mi><mml:mrow><mml:mi>−</mml:mi><mml:mn>1</mml:mn></mml:mrow></mml:msup><mml:mi>μ</mml:mi></mml:mrow></mml:math></alternatives></inline-formula>
  shrinks to zero, so the path covers every tilt.</p>
</sec>
<sec id="secU003Alongonly">
  <title>Long only, fully invested</title>
  <fig id="figU003Aweights-lo">
    <caption><p>The long-only path of the test problem against the tilt
    <inline-formula><alternatives>
    <tex-math><![CDATA[\lambda]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi>λ</mml:mi></mml:math></alternatives></inline-formula>.
    <italic>Left:</italic> the weights; blue where a plain call supplies
    them, red (shaded) where it does not. <italic>Right:</italic> the
    budget multiplier <inline-formula><alternatives>
    <tex-math><![CDATA[\nu=(\mu-\Sigma v)_j]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>ν</mml:mi><mml:mo>=</mml:mo><mml:mo stretchy="false" form="prefix">(</mml:mo><mml:mi>μ</mml:mi><mml:mo>−</mml:mo><mml:mi mathvariant="normal">Σ</mml:mi><mml:mi>v</mml:mi><mml:msub><mml:mo stretchy="false" form="postfix">)</mml:mo><mml:mi>j</mml:mi></mml:msub></mml:mrow></mml:math></alternatives></inline-formula>,
    <inline-formula><alternatives>
    <tex-math><![CDATA[j]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi>j</mml:mi></mml:math></alternatives></inline-formula>
    on the support. A plain call covers <inline-formula><alternatives>
    <tex-math><![CDATA[\nu\ge0]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>ν</mml:mi><mml:mo>≥</mml:mo><mml:mn>0</mml:mn></mml:mrow></mml:math></alternatives></inline-formula>
    and ends at <inline-formula><alternatives>
    <tex-math><![CDATA[\nu=0]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>ν</mml:mi><mml:mo>=</mml:mo><mml:mn>0</mml:mn></mml:mrow></mml:math></alternatives></inline-formula>,
    <inline-formula><alternatives>
    <tex-math><![CDATA[\lambda=0.1414]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>λ</mml:mi><mml:mo>=</mml:mo><mml:mn>0.1414</mml:mn></mml:mrow></mml:math></alternatives></inline-formula>
    (dashed); the shift <xref alt="(4)" rid="eqU003Ashift">(4)</xref>
    reaches the two further corners (squares) where
    <inline-formula><alternatives>
    <tex-math><![CDATA[\nu<0]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>ν</mml:mi><mml:mo>&lt;</mml:mo><mml:mn>0</mml:mn></mml:mrow></mml:math></alternatives></inline-formula>.</p></caption>
    <p><inline-graphic mimetype="application" mime-subtype="pdf" xlink:href="figures/weights_longonly.pdf">
      <alt-text>image</alt-text>
    </inline-graphic>
    <inline-graphic mimetype="application" mime-subtype="pdf" xlink:href="figures/multiplier.pdf">
      <alt-text>image</alt-text>
    </inline-graphic></p>
  </fig>
  <p>The classical frontier requires <inline-formula><alternatives>
  <tex-math><![CDATA[w\ge0]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>w</mml:mi><mml:mo>≥</mml:mo><mml:mn>0</mml:mn></mml:mrow></mml:math></alternatives></inline-formula>
  and <inline-formula><alternatives>
  <tex-math><![CDATA[\mathbf 1^{\top}w=1]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:msup><mml:mn mathvariant="bold">𝟏</mml:mn><mml:mi>⊤</mml:mi></mml:msup><mml:mi>w</mml:mi><mml:mo>=</mml:mo><mml:mn>1</mml:mn></mml:mrow></mml:math></alternatives></inline-formula>.
  Substituting <inline-formula><alternatives>
  <tex-math><![CDATA[w=\lambda v]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>w</mml:mi><mml:mo>=</mml:mo><mml:mi>λ</mml:mi><mml:mi>v</mml:mi></mml:mrow></mml:math></alternatives></inline-formula>
  and using <xref alt="(1)" rid="eqU003Asquare">(1)</xref> turns the
  tilted problem into
  <styled-content id="eqU003Annls"><disp-formula><alternatives>
  <tex-math><![CDATA[\begin{equation}
  \label{eq:nnls}
  \min_v\ \tfrac12\lVert Xv-y\rVert _2^2
  \qquad\text{s.t.}\qquad \mathbf 1^{\top}v=t,\ \ v\ge0,
  \qquad t=1/\lambda ,
  \end{equation} \qquad(3)]]></tex-math>
  <mml:math display="block" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mrow><mml:munder><mml:mi mathvariant="normal">min</mml:mi><mml:mi>v</mml:mi></mml:munder><mml:mspace width="0.222em"></mml:mspace><mml:mstyle displaystyle="false"><mml:mfrac><mml:mn>1</mml:mn><mml:mn>2</mml:mn></mml:mfrac></mml:mstyle><mml:msubsup><mml:mrow><mml:mo stretchy="true" form="prefix">‖</mml:mo><mml:mi>X</mml:mi><mml:mi>v</mml:mi><mml:mo>−</mml:mo><mml:mi>y</mml:mi><mml:mo stretchy="true" form="postfix">‖</mml:mo></mml:mrow><mml:mn>2</mml:mn><mml:mn>2</mml:mn></mml:msubsup><mml:mspace width="2.0em"></mml:mspace><mml:mtext mathvariant="normal">s.t.</mml:mtext><mml:mspace width="2.0em"></mml:mspace><mml:msup><mml:mn mathvariant="bold">𝟏</mml:mn><mml:mi>⊤</mml:mi></mml:msup><mml:mi>v</mml:mi><mml:mo>=</mml:mo><mml:mi>t</mml:mi><mml:mo>,</mml:mo><mml:mspace width="0.222em"></mml:mspace><mml:mspace width="0.222em"></mml:mspace><mml:mi>v</mml:mi><mml:mo>≥</mml:mo><mml:mn>0</mml:mn><mml:mo>,</mml:mo><mml:mspace width="2.0em"></mml:mspace><mml:mi>t</mml:mi><mml:mo>=</mml:mo><mml:mn>1</mml:mn><mml:mi>/</mml:mi><mml:mi>λ</mml:mi><mml:mo>,</mml:mo></mml:mrow><mml:mspace width="2.0em"></mml:mspace><mml:mo stretchy="false" form="prefix">(</mml:mo><mml:mn>3</mml:mn><mml:mo stretchy="false" form="postfix">)</mml:mo></mml:mrow></mml:math></alternatives></disp-formula></styled-content>
  with <inline-formula><alternatives>
  <tex-math><![CDATA[w=v/t]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>w</mml:mi><mml:mo>=</mml:mo><mml:mi>v</mml:mi><mml:mi>/</mml:mi><mml:mi>t</mml:mi></mml:mrow></mml:math></alternatives></inline-formula>
  (<xref alt="Schmelzer &amp; Hastie, 2026" rid="ref-perspective" ref-type="bibr">Schmelzer
  &amp; Hastie, 2026</xref>, Proposition 3). For
  <inline-formula><alternatives>
  <tex-math><![CDATA[v\ge0]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>v</mml:mi><mml:mo>≥</mml:mo><mml:mn>0</mml:mn></mml:mrow></mml:math></alternatives></inline-formula>
  the budget is <inline-formula><alternatives>
  <tex-math><![CDATA[\lVert v\rVert _1]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:msub><mml:mrow><mml:mo stretchy="true" form="prefix">‖</mml:mo><mml:mi>v</mml:mi><mml:mo stretchy="true" form="postfix">‖</mml:mo></mml:mrow><mml:mn>1</mml:mn></mml:msub></mml:math></alternatives></inline-formula>,
  so <xref alt="(3)" rid="eqU003Annls">(3)</xref> is the nonnegative
  LASSO, whose penalty <inline-formula><alternatives>
  <tex-math><![CDATA[\nu]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi>ν</mml:mi></mml:math></alternatives></inline-formula>
  is the multiplier of the budget.
  <monospace>lars_path(…, positive=True)</monospace> traces it, and each
  column divided by its sum is a corner portfolio at tilt
  <inline-formula><alternatives>
  <tex-math><![CDATA[1/\mathbf 1^{\top}v]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mn>1</mml:mn><mml:mi>/</mml:mi><mml:msup><mml:mn mathvariant="bold">𝟏</mml:mn><mml:mi>⊤</mml:mi></mml:msup><mml:mi>v</mml:mi></mml:mrow></mml:math></alternatives></inline-formula>.</p>
  <p><bold>The stop.</bold> Called on <inline-formula><alternatives>
  <tex-math><![CDATA[(X,y)]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mo stretchy="false" form="prefix">(</mml:mo><mml:mi>X</mml:mi><mml:mo>,</mml:mo><mml:mi>y</mml:mi><mml:mo stretchy="false" form="postfix">)</mml:mo></mml:mrow></mml:math></alternatives></inline-formula>
  the path runs from <inline-formula><alternatives>
  <tex-math><![CDATA[\nu=\max_j\mu_j]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>ν</mml:mi><mml:mo>=</mml:mo><mml:msub><mml:mrow><mml:mi mathvariant="normal">max</mml:mi><mml:mo>&#8289;</mml:mo></mml:mrow><mml:mi>j</mml:mi></mml:msub><mml:msub><mml:mi>μ</mml:mi><mml:mi>j</mml:mi></mml:msub></mml:mrow></mml:math></alternatives></inline-formula>
  down to <inline-formula><alternatives>
  <tex-math><![CDATA[\nu=0]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>ν</mml:mi><mml:mo>=</mml:mo><mml:mn>0</mml:mn></mml:mrow></mml:math></alternatives></inline-formula>
  and stops there, because a LASSO solver takes no negative penalty. (If
  every <inline-formula><alternatives>
  <tex-math><![CDATA[\mu_j\le0]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:msub><mml:mi>μ</mml:mi><mml:mi>j</mml:mi></mml:msub><mml:mo>≤</mml:mo><mml:mn>0</mml:mn></mml:mrow></mml:math></alternatives></inline-formula>
  it returns only the origin.) On the test problem that gives 17
  corners, down to tilt <inline-formula><alternatives>
  <tex-math><![CDATA[0.1415]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mn>0.1415</mml:mn></mml:math></alternatives></inline-formula>.
  The stopping point <inline-formula><alternatives>
  <tex-math><![CDATA[v_0=\arg\min_{v\ge0}\frac12v^{\top}\Sigma v-\mu^{\top}v]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:msub><mml:mi>v</mml:mi><mml:mn>0</mml:mn></mml:msub><mml:mo>=</mml:mo><mml:mrow><mml:mi mathvariant="normal">arg</mml:mi><mml:mo>&#8289;</mml:mo></mml:mrow><mml:msub><mml:mrow><mml:mi mathvariant="normal">min</mml:mi><mml:mo>&#8289;</mml:mo></mml:mrow><mml:mrow><mml:mi>v</mml:mi><mml:mo>≥</mml:mo><mml:mn>0</mml:mn></mml:mrow></mml:msub><mml:mfrac><mml:mn>1</mml:mn><mml:mn>2</mml:mn></mml:mfrac><mml:msup><mml:mi>v</mml:mi><mml:mi>⊤</mml:mi></mml:msup><mml:mi mathvariant="normal">Σ</mml:mi><mml:mi>v</mml:mi><mml:mo>−</mml:mo><mml:msup><mml:mi>μ</mml:mi><mml:mi>⊤</mml:mi></mml:msup><mml:mi>v</mml:mi></mml:mrow></mml:math></alternatives></inline-formula>
  is the end of Section <xref alt="5" rid="secU003Alongshort">5</xref>
  with long-only weights. Writing <inline-formula><alternatives>
  <tex-math><![CDATA[v=sw]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>v</mml:mi><mml:mo>=</mml:mo><mml:mi>s</mml:mi><mml:mi>w</mml:mi></mml:mrow></mml:math></alternatives></inline-formula>
  with <inline-formula><alternatives>
  <tex-math><![CDATA[\mathbf 1^{\top}w=1]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:msup><mml:mn mathvariant="bold">𝟏</mml:mn><mml:mi>⊤</mml:mi></mml:msup><mml:mi>w</mml:mi><mml:mo>=</mml:mo><mml:mn>1</mml:mn></mml:mrow></mml:math></alternatives></inline-formula>
  and maximising over the scale <inline-formula><alternatives>
  <tex-math><![CDATA[s\ge0]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>s</mml:mi><mml:mo>≥</mml:mo><mml:mn>0</mml:mn></mml:mrow></mml:math></alternatives></inline-formula>
  first leaves <inline-formula><alternatives>
  <tex-math><![CDATA[\frac12(\mu^{\top}w)^2/w^{\top}\Sigma w]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mfrac><mml:mn>1</mml:mn><mml:mn>2</mml:mn></mml:mfrac><mml:mo stretchy="false" form="prefix">(</mml:mo><mml:msup><mml:mi>μ</mml:mi><mml:mi>⊤</mml:mi></mml:msup><mml:mi>w</mml:mi><mml:msup><mml:mo stretchy="false" form="postfix">)</mml:mo><mml:mn>2</mml:mn></mml:msup><mml:mi>/</mml:mi><mml:msup><mml:mi>w</mml:mi><mml:mi>⊤</mml:mi></mml:msup><mml:mi mathvariant="normal">Σ</mml:mi><mml:mi>w</mml:mi></mml:mrow></mml:math></alternatives></inline-formula>,
  half the squared Sharpe ratio, so <inline-formula><alternatives>
  <tex-math><![CDATA[v_0/\mathbf 1^{\top}v_0]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:msub><mml:mi>v</mml:mi><mml:mn>0</mml:mn></mml:msub><mml:mi>/</mml:mi><mml:msup><mml:mn mathvariant="bold">𝟏</mml:mn><mml:mi>⊤</mml:mi></mml:msup><mml:msub><mml:mi>v</mml:mi><mml:mn>0</mml:mn></mml:msub></mml:mrow></mml:math></alternatives></inline-formula>
  is the long-only maximum-Sharpe portfolio, at tilt
  <inline-formula><alternatives>
  <tex-math><![CDATA[0.1414]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mn>0.1414</mml:mn></mml:math></alternatives></inline-formula>.
  The frontier continues beyond it: the budget still binds while
  <inline-formula><alternatives>
  <tex-math><![CDATA[\nu]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi>ν</mml:mi></mml:math></alternatives></inline-formula>
  turns negative
  (Figure <xref alt="2" rid="figU003Aweights-lo">2</xref>), which a
  constraint allows and a penalty does not
  (<xref alt="Schmelzer &amp; Hastie, 2026, Section 3.4" rid="ref-perspective" ref-type="bibr">Schmelzer
  &amp; Hastie, 2026, Section 3.4</xref>). The stop is a property of the
  penalised form that LASSO solvers use.</p>
  <p><bold>The shift.</bold> Completing the square once more moves the
  penalty into the response:
  <styled-content id="eqU003Ashift"><disp-formula><alternatives>
  <tex-math><![CDATA[\begin{equation}
  \label{eq:shift}
  \tfrac12\lVert Xv-y\rVert _2^2+\nu\,\mathbf 1^{\top}v
  =\tfrac12\lVert Xv-(y-\nu d)\rVert _2^2+\text{const},
  \qquad X^{\top}d=\mathbf 1 .
  \end{equation} \qquad(4)]]></tex-math>
  <mml:math display="block" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mrow><mml:mstyle displaystyle="false"><mml:mfrac><mml:mn>1</mml:mn><mml:mn>2</mml:mn></mml:mfrac></mml:mstyle><mml:msubsup><mml:mrow><mml:mo stretchy="true" form="prefix">‖</mml:mo><mml:mi>X</mml:mi><mml:mi>v</mml:mi><mml:mo>−</mml:mo><mml:mi>y</mml:mi><mml:mo stretchy="true" form="postfix">‖</mml:mo></mml:mrow><mml:mn>2</mml:mn><mml:mn>2</mml:mn></mml:msubsup><mml:mo>+</mml:mo><mml:mi>ν</mml:mi><mml:mspace width="0.167em"></mml:mspace><mml:msup><mml:mn mathvariant="bold">𝟏</mml:mn><mml:mi>⊤</mml:mi></mml:msup><mml:mi>v</mml:mi><mml:mo>=</mml:mo><mml:mstyle displaystyle="false"><mml:mfrac><mml:mn>1</mml:mn><mml:mn>2</mml:mn></mml:mfrac></mml:mstyle><mml:msubsup><mml:mrow><mml:mo stretchy="true" form="prefix">‖</mml:mo><mml:mi>X</mml:mi><mml:mi>v</mml:mi><mml:mo>−</mml:mo><mml:mo stretchy="false" form="prefix">(</mml:mo><mml:mi>y</mml:mi><mml:mo>−</mml:mo><mml:mi>ν</mml:mi><mml:mi>d</mml:mi><mml:mo stretchy="false" form="postfix">)</mml:mo><mml:mo stretchy="true" form="postfix">‖</mml:mo></mml:mrow><mml:mn>2</mml:mn><mml:mn>2</mml:mn></mml:msubsup><mml:mo>+</mml:mo><mml:mtext mathvariant="normal">const</mml:mtext><mml:mo>,</mml:mo><mml:mspace width="2.0em"></mml:mspace><mml:msup><mml:mi>X</mml:mi><mml:mi>⊤</mml:mi></mml:msup><mml:mi>d</mml:mi><mml:mo>=</mml:mo><mml:mn mathvariant="bold">𝟏</mml:mn><mml:mi>.</mml:mi></mml:mrow><mml:mspace width="2.0em"></mml:mspace><mml:mo stretchy="false" form="prefix">(</mml:mo><mml:mn>4</mml:mn><mml:mo stretchy="false" form="postfix">)</mml:mo></mml:mrow></mml:math></alternatives></disp-formula></styled-content>
  If the nonnegative LASSO runs on <inline-formula><alternatives>
  <tex-math><![CDATA[y-\nu_0d]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>y</mml:mi><mml:mo>−</mml:mo><mml:msub><mml:mi>ν</mml:mi><mml:mn>0</mml:mn></mml:msub><mml:mi>d</mml:mi></mml:mrow></mml:math></alternatives></inline-formula>
  for some <inline-formula><alternatives>
  <tex-math><![CDATA[\nu_0<0]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:msub><mml:mi>ν</mml:mi><mml:mn>0</mml:mn></mml:msub><mml:mo>&lt;</mml:mo><mml:mn>0</mml:mn></mml:mrow></mml:math></alternatives></inline-formula>,
  its penalty <inline-formula><alternatives>
  <tex-math><![CDATA[\nu'\ge0]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:msup><mml:mi>ν</mml:mi><mml:mo>′</mml:mo></mml:msup><mml:mo>≥</mml:mo><mml:mn>0</mml:mn></mml:mrow></mml:math></alternatives></inline-formula>
  acts as <inline-formula><alternatives>
  <tex-math><![CDATA[\nu=\nu_0+\nu']]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>ν</mml:mi><mml:mo>=</mml:mo><mml:msub><mml:mi>ν</mml:mi><mml:mn>0</mml:mn></mml:msub><mml:mo>+</mml:mo><mml:msup><mml:mi>ν</mml:mi><mml:mo>′</mml:mo></mml:msup></mml:mrow></mml:math></alternatives></inline-formula>
  on the original problem, and one path covers every
  <inline-formula><alternatives>
  <tex-math><![CDATA[\nu\ge\nu_0]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>ν</mml:mi><mml:mo>≥</mml:mo><mml:msub><mml:mi>ν</mml:mi><mml:mn>0</mml:mn></mml:msub></mml:mrow></mml:math></alternatives></inline-formula>.
  For the Cholesky factor <inline-formula><alternatives>
  <tex-math><![CDATA[d=(X^{\top})^{-1}\mathbf 1]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>d</mml:mi><mml:mo>=</mml:mo><mml:mo stretchy="false" form="prefix">(</mml:mo><mml:msup><mml:mi>X</mml:mi><mml:mi>⊤</mml:mi></mml:msup><mml:msup><mml:mo stretchy="false" form="postfix">)</mml:mo><mml:mrow><mml:mi>−</mml:mi><mml:mn>1</mml:mn></mml:mrow></mml:msup><mml:mn mathvariant="bold">𝟏</mml:mn></mml:mrow></mml:math></alternatives></inline-formula>;
  for a tall <inline-formula><alternatives>
  <tex-math><![CDATA[X]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi>X</mml:mi></mml:math></alternatives></inline-formula>
  least squares returns the minimum-norm solution.
  <monospace>lars_path</monospace> reports
  <inline-formula><alternatives>
  <tex-math><![CDATA[\nu']]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:msup><mml:mi>ν</mml:mi><mml:mo>′</mml:mo></mml:msup></mml:math></alternatives></inline-formula>
  divided by the number of rows, and it stops after 500 steps unless
  told otherwise, which a large problem needs:</p>
  <preformat>d = np.linalg.lstsq(X.T, np.ones(len(mu)))[0]   # solves X.T @ d == 1
alphas, _, V = lars_path(X, y - nu0 * d, method=&quot;lasso&quot;, positive=True,
                         max_iter=10 * len(mu))
nu = nu0 + len(y) * alphas                      # budget multiplier per column
corners = V[:, 1:-1]                            # drop the origin and the end
W, tilts = corners / corners.sum(0), 1 / corners.sum(0)</preformat>
  <p><bold>Choosing <inline-formula><alternatives>
  <tex-math><![CDATA[\nu_0]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:msub><mml:mi>ν</mml:mi><mml:mn>0</mml:mn></mml:msub></mml:math></alternatives></inline-formula>.</bold>
  Any <inline-formula><alternatives>
  <tex-math><![CDATA[\nu_0]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:msub><mml:mi>ν</mml:mi><mml:mn>0</mml:mn></mml:msub></mml:math></alternatives></inline-formula>
  below the last corner works, and the last corner is known in advance.
  Beyond it the portfolio holds the minimum-variance support
  <inline-formula><alternatives>
  <tex-math><![CDATA[S]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi>S</mml:mi></mml:math></alternatives></inline-formula>,
  which is the support of <inline-formula><alternatives>
  <tex-math><![CDATA[\arg\min_{u\ge0}\lVert Xu-d\rVert _2]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mrow><mml:mi mathvariant="normal">arg</mml:mi><mml:mo>&#8289;</mml:mo></mml:mrow><mml:msub><mml:mrow><mml:mi mathvariant="normal">min</mml:mi><mml:mo>&#8289;</mml:mo></mml:mrow><mml:mrow><mml:mi>u</mml:mi><mml:mo>≥</mml:mo><mml:mn>0</mml:mn></mml:mrow></mml:msub><mml:msub><mml:mrow><mml:mo stretchy="true" form="prefix">‖</mml:mo><mml:mi>X</mml:mi><mml:mi>u</mml:mi><mml:mo>−</mml:mo><mml:mi>d</mml:mi><mml:mo stretchy="true" form="postfix">‖</mml:mo></mml:mrow><mml:mn>2</mml:mn></mml:msub></mml:mrow></mml:math></alternatives></inline-formula>
  (<xref alt="Lawson &amp; Hanson, 1974" rid="ref-lawson1974" ref-type="bibr">Lawson
  &amp; Hanson, 1974</xref>). There <inline-formula><alternatives>
  <tex-math><![CDATA[v_S=a-\nu b]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:msub><mml:mi>v</mml:mi><mml:mi>S</mml:mi></mml:msub><mml:mo>=</mml:mo><mml:mi>a</mml:mi><mml:mo>−</mml:mo><mml:mi>ν</mml:mi><mml:mi>b</mml:mi></mml:mrow></mml:math></alternatives></inline-formula>
  with <inline-formula><alternatives>
  <tex-math><![CDATA[a=\Sigma_{SS}^{-1}\mu_S]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>a</mml:mi><mml:mo>=</mml:mo><mml:msubsup><mml:mi mathvariant="normal">Σ</mml:mi><mml:mrow><mml:mi>S</mml:mi><mml:mi>S</mml:mi></mml:mrow><mml:mrow><mml:mi>−</mml:mi><mml:mn>1</mml:mn></mml:mrow></mml:msubsup><mml:msub><mml:mi>μ</mml:mi><mml:mi>S</mml:mi></mml:msub></mml:mrow></mml:math></alternatives></inline-formula>
  and <inline-formula><alternatives>
  <tex-math><![CDATA[b=\Sigma_{SS}^{-1}\mathbf 1]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>b</mml:mi><mml:mo>=</mml:mo><mml:msubsup><mml:mi mathvariant="normal">Σ</mml:mi><mml:mrow><mml:mi>S</mml:mi><mml:mi>S</mml:mi></mml:mrow><mml:mrow><mml:mi>−</mml:mi><mml:mn>1</mml:mn></mml:mrow></mml:msubsup><mml:mn mathvariant="bold">𝟏</mml:mn></mml:mrow></mml:math></alternatives></inline-formula>,
  and the segment stays optimal while <inline-formula><alternatives>
  <tex-math><![CDATA[\nu<a_i/b_i]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>ν</mml:mi><mml:mo>&lt;</mml:mo><mml:msub><mml:mi>a</mml:mi><mml:mi>i</mml:mi></mml:msub><mml:mi>/</mml:mi><mml:msub><mml:mi>b</mml:mi><mml:mi>i</mml:mi></mml:msub></mml:mrow></mml:math></alternatives></inline-formula>
  for <inline-formula><alternatives>
  <tex-math><![CDATA[b_i>0]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:msub><mml:mi>b</mml:mi><mml:mi>i</mml:mi></mml:msub><mml:mo>&gt;</mml:mo><mml:mn>0</mml:mn></mml:mrow></mml:math></alternatives></inline-formula>
  and, for <inline-formula><alternatives>
  <tex-math><![CDATA[j\notin S]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>j</mml:mi><mml:mo>∉</mml:mo><mml:mi>S</mml:mi></mml:mrow></mml:math></alternatives></inline-formula>
  with <inline-formula><alternatives>
  <tex-math><![CDATA[\Sigma_{jS}b>1]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:msub><mml:mi mathvariant="normal">Σ</mml:mi><mml:mrow><mml:mi>j</mml:mi><mml:mi>S</mml:mi></mml:mrow></mml:msub><mml:mi>b</mml:mi><mml:mo>&gt;</mml:mo><mml:mn>1</mml:mn></mml:mrow></mml:math></alternatives></inline-formula>,
  while <inline-formula><alternatives>
  <tex-math><![CDATA[\nu\le(\mu_j-\Sigma_{jS}a)/(1-\Sigma_{jS}b)]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>ν</mml:mi><mml:mo>≤</mml:mo><mml:mo stretchy="false" form="prefix">(</mml:mo><mml:msub><mml:mi>μ</mml:mi><mml:mi>j</mml:mi></mml:msub><mml:mo>−</mml:mo><mml:msub><mml:mi mathvariant="normal">Σ</mml:mi><mml:mrow><mml:mi>j</mml:mi><mml:mi>S</mml:mi></mml:mrow></mml:msub><mml:mi>a</mml:mi><mml:mo stretchy="false" form="postfix">)</mml:mo><mml:mi>/</mml:mi><mml:mo stretchy="false" form="prefix">(</mml:mo><mml:mn>1</mml:mn><mml:mo>−</mml:mo><mml:msub><mml:mi mathvariant="normal">Σ</mml:mi><mml:mrow><mml:mi>j</mml:mi><mml:mi>S</mml:mi></mml:mrow></mml:msub><mml:mi>b</mml:mi><mml:mo stretchy="false" form="postfix">)</mml:mo></mml:mrow></mml:math></alternatives></inline-formula>.
  The smallest bound is the last corner <inline-formula><alternatives>
  <tex-math><![CDATA[\nu_{\mathrm{last}}]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:msub><mml:mi>ν</mml:mi><mml:mrow><mml:mi mathvariant="normal">l</mml:mi><mml:mi mathvariant="normal">a</mml:mi><mml:mi mathvariant="normal">s</mml:mi><mml:mi mathvariant="normal">t</mml:mi></mml:mrow></mml:msub></mml:math></alternatives></inline-formula>:</p>
  <preformat>S = nnls(X, d)[0] &gt; 1e-9                         # minimum-variance support
a = np.linalg.solve(Sigma[np.ix_(S, S)], mu[S])
b = np.linalg.solve(Sigma[np.ix_(S, S)], np.ones(S.sum()))
h = 1 - Sigma[np.ix_(~S, S)] @ b
g = mu[~S] - Sigma[np.ix_(~S, S)] @ a
nu_last = min((a[b &gt; 0] / b[b &gt; 0]).min(),
              (g[h &lt; 0] / h[h &lt; 0]).min(initial=np.inf))
nu0 = nu_last - max(abs(nu_last), np.abs(mu).max())</preformat>
  <p>A fixed <inline-formula><alternatives>
  <tex-math><![CDATA[\nu_0]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:msub><mml:mi>ν</mml:mi><mml:mn>0</mml:mn></mml:msub></mml:math></alternatives></inline-formula>
  would not work, because <inline-formula><alternatives>
  <tex-math><![CDATA[\nu_{\mathrm{last}}]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:msub><mml:mi>ν</mml:mi><mml:mrow><mml:mi mathvariant="normal">l</mml:mi><mml:mi mathvariant="normal">a</mml:mi><mml:mi mathvariant="normal">s</mml:mi><mml:mi mathvariant="normal">t</mml:mi></mml:mrow></mml:msub></mml:math></alternatives></inline-formula>
  varies widely: it is <inline-formula><alternatives>
  <tex-math><![CDATA[-4.95]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>−</mml:mi><mml:mn>4.95</mml:mn></mml:mrow></mml:math></alternatives></inline-formula>
  on the test problem, <inline-formula><alternatives>
  <tex-math><![CDATA[-11.9]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>−</mml:mi><mml:mn>11.9</mml:mn></mml:mrow></mml:math></alternatives></inline-formula>
  on one of the models of
  Table <xref alt="1" rid="tabU003Arobust">1</xref>,
  <inline-formula><alternatives>
  <tex-math><![CDATA[-0.190]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>−</mml:mi><mml:mn>0.190</mml:mn></mml:mrow></mml:math></alternatives></inline-formula>
  on the stock data and <inline-formula><alternatives>
  <tex-math><![CDATA[-0.0118]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>−</mml:mi><mml:mn>0.0118</mml:mn></mml:mrow></mml:math></alternatives></inline-formula>
  on the portfolio data of
  Section <xref alt="8" rid="secU003Aevidence">8</xref>, where
  <inline-formula><alternatives>
  <tex-math><![CDATA[\mu]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi>μ</mml:mi></mml:math></alternatives></inline-formula>
  is small. The margin <inline-formula><alternatives>
  <tex-math><![CDATA[\delta]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi>δ</mml:mi></mml:math></alternatives></inline-formula>
  in <inline-formula><alternatives>
  <tex-math><![CDATA[\nu_0=\nu_{\mathrm{last}}-\delta
  \max(|\nu_{\mathrm{last}}|,\lVert \mu\rVert _\infty)]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:msub><mml:mi>ν</mml:mi><mml:mn>0</mml:mn></mml:msub><mml:mo>=</mml:mo><mml:msub><mml:mi>ν</mml:mi><mml:mrow><mml:mi mathvariant="normal">l</mml:mi><mml:mi mathvariant="normal">a</mml:mi><mml:mi mathvariant="normal">s</mml:mi><mml:mi mathvariant="normal">t</mml:mi></mml:mrow></mml:msub><mml:mo>−</mml:mo><mml:mi>δ</mml:mi><mml:mrow><mml:mi mathvariant="normal">max</mml:mi><mml:mo>&#8289;</mml:mo></mml:mrow><mml:mo stretchy="false" form="prefix">(</mml:mo><mml:mo stretchy="false" form="prefix">|</mml:mo><mml:msub><mml:mi>ν</mml:mi><mml:mrow><mml:mi mathvariant="normal">l</mml:mi><mml:mi mathvariant="normal">a</mml:mi><mml:mi mathvariant="normal">s</mml:mi><mml:mi mathvariant="normal">t</mml:mi></mml:mrow></mml:msub><mml:mo stretchy="false" form="prefix">|</mml:mo><mml:mo>,</mml:mo><mml:msub><mml:mrow><mml:mo stretchy="true" form="prefix">‖</mml:mo><mml:mi>μ</mml:mi><mml:mo stretchy="true" form="postfix">‖</mml:mo></mml:mrow><mml:mi>∞</mml:mi></mml:msub><mml:mo stretchy="false" form="postfix">)</mml:mo></mml:mrow></mml:math></alternatives></inline-formula>
  has to be large enough that the end of the path does not merge with
  the last corner, and small enough not to cost accuracy, which falls
  roughly in proportion to <inline-formula><alternatives>
  <tex-math><![CDATA[|\nu_0|]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mo stretchy="false" form="prefix">|</mml:mo><mml:msub><mml:mi>ν</mml:mi><mml:mn>0</mml:mn></mml:msub><mml:mo stretchy="false" form="prefix">|</mml:mo></mml:mrow></mml:math></alternatives></inline-formula>.
  On the stock data <inline-formula><alternatives>
  <tex-math><![CDATA[\delta=10^{-4}]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>δ</mml:mi><mml:mo>=</mml:mo><mml:msup><mml:mn>10</mml:mn><mml:mrow><mml:mi>−</mml:mi><mml:mn>4</mml:mn></mml:mrow></mml:msup></mml:mrow></mml:math></alternatives></inline-formula>
  loses the last corner; from <inline-formula><alternatives>
  <tex-math><![CDATA[\delta=10^{-2}]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>δ</mml:mi><mml:mo>=</mml:mo><mml:msup><mml:mn>10</mml:mn><mml:mrow><mml:mi>−</mml:mi><mml:mn>2</mml:mn></mml:mrow></mml:msup></mml:mrow></mml:math></alternatives></inline-formula>
  to <inline-formula><alternatives>
  <tex-math><![CDATA[1]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mn>1</mml:mn></mml:math></alternatives></inline-formula>
  all 116 are found with KKT residuals below
  <inline-formula><alternatives>
  <tex-math><![CDATA[5\times10^{-13}]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mn>5</mml:mn><mml:mo>×</mml:mo><mml:msup><mml:mn>10</mml:mn><mml:mrow><mml:mi>−</mml:mi><mml:mn>13</mml:mn></mml:mrow></mml:msup></mml:mrow></mml:math></alternatives></inline-formula>,
  and at <inline-formula><alternatives>
  <tex-math><![CDATA[\delta=100]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>δ</mml:mi><mml:mo>=</mml:mo><mml:mn>100</mml:mn></mml:mrow></mml:math></alternatives></inline-formula>
  the residual has grown to <inline-formula><alternatives>
  <tex-math><![CDATA[3\times10^{-11}]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mn>3</mml:mn><mml:mo>×</mml:mo><mml:msup><mml:mn>10</mml:mn><mml:mrow><mml:mi>−</mml:mi><mml:mn>11</mml:mn></mml:mrow></mml:msup></mml:mrow></mml:math></alternatives></inline-formula>.
  On the portfolio data even <inline-formula><alternatives>
  <tex-math><![CDATA[\delta=10^{-2}]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>δ</mml:mi><mml:mo>=</mml:mo><mml:msup><mml:mn>10</mml:mn><mml:mrow><mml:mi>−</mml:mi><mml:mn>2</mml:mn></mml:mrow></mml:msup></mml:mrow></mml:math></alternatives></inline-formula>
  loses the last corner, and <inline-formula><alternatives>
  <tex-math><![CDATA[\delta=1]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>δ</mml:mi><mml:mo>=</mml:mo><mml:mn>1</mml:mn></mml:mrow></mml:math></alternatives></inline-formula>
  finds all 12. The code takes <inline-formula><alternatives>
  <tex-math><![CDATA[\delta=1]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>δ</mml:mi><mml:mo>=</mml:mo><mml:mn>1</mml:mn></mml:mrow></mml:math></alternatives></inline-formula>.
  The minimum-variance portfolio itself is the limit
  <inline-formula><alternatives>
  <tex-math><![CDATA[\nu\to-\infty]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>ν</mml:mi><mml:mo>→</mml:mo><mml:mi>−</mml:mi><mml:mi>∞</mml:mi></mml:mrow></mml:math></alternatives></inline-formula>;
  on the final segment it is <inline-formula><alternatives>
  <tex-math><![CDATA[w_S\propto\Sigma_{SS}^{-1}\mathbf 1]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:msub><mml:mi>w</mml:mi><mml:mi>S</mml:mi></mml:msub><mml:mo>∝</mml:mo><mml:msubsup><mml:mi mathvariant="normal">Σ</mml:mi><mml:mrow><mml:mi>S</mml:mi><mml:mi>S</mml:mi></mml:mrow><mml:mrow><mml:mi>−</mml:mi><mml:mn>1</mml:mn></mml:mrow></mml:msubsup><mml:mn mathvariant="bold">𝟏</mml:mn></mml:mrow></mml:math></alternatives></inline-formula>.</p>
  <p><bold>What <inline-formula><alternatives>
  <tex-math><![CDATA[\nu]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi>ν</mml:mi></mml:math></alternatives></inline-formula>
  means.</bold> By <xref alt="(4)" rid="eqU003Ashift">(4)</xref> the
  point with multiplier <inline-formula><alternatives>
  <tex-math><![CDATA[\nu]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi>ν</mml:mi></mml:math></alternatives></inline-formula>
  solves the same problem with <inline-formula><alternatives>
  <tex-math><![CDATA[\mu]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi>μ</mml:mi></mml:math></alternatives></inline-formula>
  replaced by <inline-formula><alternatives>
  <tex-math><![CDATA[\mu-\nu\mathbf 1]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>μ</mml:mi><mml:mo>−</mml:mo><mml:mi>ν</mml:mi><mml:mn mathvariant="bold">𝟏</mml:mn></mml:mrow></mml:math></alternatives></inline-formula>,
  so it is the long-only maximum-Sharpe portfolio at risk-free rate
  <inline-formula><alternatives>
  <tex-math><![CDATA[r=\nu]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>r</mml:mi><mml:mo>=</mml:mo><mml:mi>ν</mml:mi></mml:mrow></mml:math></alternatives></inline-formula>,
  Black’s zero-beta rate
  (<xref alt="Black, 1972" rid="ref-black1972" ref-type="bibr">Black,
  1972</xref>), a classical result. What the LASSO adds is that the rate
  is the path’s own parameter, so for <inline-formula><alternatives>
  <tex-math><![CDATA[\nu_0<r<\max_j\mu_j]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:msub><mml:mi>ν</mml:mi><mml:mn>0</mml:mn></mml:msub><mml:mo>&lt;</mml:mo><mml:mi>r</mml:mi><mml:mo>&lt;</mml:mo><mml:msub><mml:mrow><mml:mi mathvariant="normal">max</mml:mi><mml:mo>&#8289;</mml:mo></mml:mrow><mml:mi>j</mml:mi></mml:msub><mml:msub><mml:mi>μ</mml:mi><mml:mi>j</mml:mi></mml:msub></mml:mrow></mml:math></alternatives></inline-formula>
  the maximum-Sharpe portfolio is an interpolation between the two
  columns that bracket <inline-formula><alternatives>
  <tex-math><![CDATA[r]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi>r</mml:mi></mml:math></alternatives></inline-formula>:</p>
  <preformat>assert nu[-1] &lt; r &lt; nu[0]                        # the path covers the rate r
k = np.argmax(nu &lt; r)                            # first column past r
s = (nu[k - 1] - r) / (nu[k - 1] - nu[k])
w_r = V[:, k - 1] + s * (V[:, k] - V[:, k - 1])
w_r /= w_r.sum()                                 # max-Sharpe portfolio at r</preformat>
  <p><bold>Weights versus frontier.</bold> Between corners the weights
  are linear in the tilt <inline-formula><alternatives>
  <tex-math><![CDATA[\lambda]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi>λ</mml:mi></mml:math></alternatives></inline-formula>
  (or, in Section <xref alt="5" rid="secU003Alongshort">5</xref>, in the
  cap <inline-formula><alternatives>
  <tex-math><![CDATA[c]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi>c</mml:mi></mml:math></alternatives></inline-formula>)
  and the variance is quadratic, so each piece of the frontier is an
  arc. Traced by the tilt <inline-formula><alternatives>
  <tex-math><![CDATA[\lambda]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi>λ</mml:mi></mml:math></alternatives></inline-formula>
  at fixed constraints
  (Sections <xref alt="6" rid="secU003Aleverage">6</xref>
  and <xref alt="7" rid="secU003Alongonly">7</xref>), the frontier has
  no kinks, since its slope <inline-formula><alternatives>
  <tex-math><![CDATA[\mathrm dE/\mathrm dV=1/(2\lambda)]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi mathvariant="normal">d</mml:mi><mml:mi>E</mml:mi><mml:mi>/</mml:mi><mml:mi mathvariant="normal">d</mml:mi><mml:mi>V</mml:mi><mml:mo>=</mml:mo><mml:mn>1</mml:mn><mml:mi>/</mml:mi><mml:mo stretchy="false" form="prefix">(</mml:mo><mml:mn>2</mml:mn><mml:mi>λ</mml:mi><mml:mo stretchy="false" form="postfix">)</mml:mo></mml:mrow></mml:math></alternatives></inline-formula>
  varies continuously. The corners then show only in the weights
  (Figure <xref alt="2" rid="figU003Aweights-lo">2</xref>). The
  long–short path of
  Section <xref alt="5" rid="secU003Alongshort">5</xref> is traced by
  the cap instead and does kink
  (Figure <xref alt="1" rid="figU003Afrontier">1</xref>(a)).</p>
  <p><bold>Algorithm 1: the long-only frontier from
  <monospace>lars_path</monospace>.</bold></p>
  <list list-type="order">
    <list-item>
      <p>Build <inline-formula><alternatives>
      <tex-math><![CDATA[X,y]]></tex-math>
      <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>X</mml:mi><mml:mo>,</mml:mo><mml:mi>y</mml:mi></mml:mrow></mml:math></alternatives></inline-formula>
      with <inline-formula><alternatives>
      <tex-math><![CDATA[X^{\top}X=\Sigma]]></tex-math>
      <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:msup><mml:mi>X</mml:mi><mml:mi>⊤</mml:mi></mml:msup><mml:mi>X</mml:mi><mml:mo>=</mml:mo><mml:mi mathvariant="normal">Σ</mml:mi></mml:mrow></mml:math></alternatives></inline-formula>,
      <inline-formula><alternatives>
      <tex-math><![CDATA[X^{\top}y=\mu]]></tex-math>
      <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:msup><mml:mi>X</mml:mi><mml:mi>⊤</mml:mi></mml:msup><mml:mi>y</mml:mi><mml:mo>=</mml:mo><mml:mi>μ</mml:mi></mml:mrow></mml:math></alternatives></inline-formula>,
      or use <monospace>lars_path_gram</monospace> with
      <monospace>Xy=mu - nu0</monospace>.</p>
    </list-item>
    <list-item>
      <p>Solve <inline-formula><alternatives>
      <tex-math><![CDATA[X^{\top}d=\mathbf 1]]></tex-math>
      <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:msup><mml:mi>X</mml:mi><mml:mi>⊤</mml:mi></mml:msup><mml:mi>d</mml:mi><mml:mo>=</mml:mo><mml:mn mathvariant="bold">𝟏</mml:mn></mml:mrow></mml:math></alternatives></inline-formula>,
      compute <inline-formula><alternatives>
      <tex-math><![CDATA[\nu_{\mathrm{last}}]]></tex-math>
      <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:msub><mml:mi>ν</mml:mi><mml:mrow><mml:mi mathvariant="normal">l</mml:mi><mml:mi mathvariant="normal">a</mml:mi><mml:mi mathvariant="normal">s</mml:mi><mml:mi mathvariant="normal">t</mml:mi></mml:mrow></mml:msub></mml:math></alternatives></inline-formula>
      and set <inline-formula><alternatives>
      <tex-math><![CDATA[\nu_0]]></tex-math>
      <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:msub><mml:mi>ν</mml:mi><mml:mn>0</mml:mn></mml:msub></mml:math></alternatives></inline-formula>
      as above.</p>
    </list-item>
    <list-item>
      <p>Run the positive LASSO on <inline-formula><alternatives>
      <tex-math><![CDATA[y-\nu_0d]]></tex-math>
      <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>y</mml:mi><mml:mo>−</mml:mo><mml:msub><mml:mi>ν</mml:mi><mml:mn>0</mml:mn></mml:msub><mml:mi>d</mml:mi></mml:mrow></mml:math></alternatives></inline-formula>
      with <monospace>max_iter</monospace> well above
      <inline-formula><alternatives>
      <tex-math><![CDATA[n]]></tex-math>
      <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi>n</mml:mi></mml:math></alternatives></inline-formula>,
      and recover <inline-formula><alternatives>
      <tex-math><![CDATA[\nu=\nu_0+n_{\mathrm{rows}}\alpha]]></tex-math>
      <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>ν</mml:mi><mml:mo>=</mml:mo><mml:msub><mml:mi>ν</mml:mi><mml:mn>0</mml:mn></mml:msub><mml:mo>+</mml:mo><mml:msub><mml:mi>n</mml:mi><mml:mrow><mml:mi mathvariant="normal">r</mml:mi><mml:mi mathvariant="normal">o</mml:mi><mml:mi mathvariant="normal">w</mml:mi><mml:mi mathvariant="normal">s</mml:mi></mml:mrow></mml:msub><mml:mi>α</mml:mi></mml:mrow></mml:math></alternatives></inline-formula>.</p>
    </list-item>
    <list-item>
      <p>Drop the first and last columns; each remaining
      <inline-formula><alternatives>
      <tex-math><![CDATA[v/\mathbf 1^{\top}v]]></tex-math>
      <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>v</mml:mi><mml:mi>/</mml:mi><mml:msup><mml:mn mathvariant="bold">𝟏</mml:mn><mml:mi>⊤</mml:mi></mml:msup><mml:mi>v</mml:mi></mml:mrow></mml:math></alternatives></inline-formula>
      is a corner, at tilt <inline-formula><alternatives>
      <tex-math><![CDATA[1/\mathbf 1^{\top}v]]></tex-math>
      <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mn>1</mml:mn><mml:mi>/</mml:mi><mml:msup><mml:mn mathvariant="bold">𝟏</mml:mn><mml:mi>⊤</mml:mi></mml:msup><mml:mi>v</mml:mi></mml:mrow></mml:math></alternatives></inline-formula>.</p>
    </list-item>
    <list-item>
      <p>Take the minimum-variance end as <inline-formula><alternatives>
      <tex-math><![CDATA[w_S\propto\Sigma_{SS}^{-1}\mathbf 1]]></tex-math>
      <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:msub><mml:mi>w</mml:mi><mml:mi>S</mml:mi></mml:msub><mml:mo>∝</mml:mo><mml:msubsup><mml:mi mathvariant="normal">Σ</mml:mi><mml:mrow><mml:mi>S</mml:mi><mml:mi>S</mml:mi></mml:mrow><mml:mrow><mml:mi>−</mml:mi><mml:mn>1</mml:mn></mml:mrow></mml:msubsup><mml:mn mathvariant="bold">𝟏</mml:mn></mml:mrow></mml:math></alternatives></inline-formula>,
      and any other point by interpolation, in
      <inline-formula><alternatives>
      <tex-math><![CDATA[1/\lambda]]></tex-math>
      <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mn>1</mml:mn><mml:mi>/</mml:mi><mml:mi>λ</mml:mi></mml:mrow></mml:math></alternatives></inline-formula>
      for a tilt or in <inline-formula><alternatives>
      <tex-math><![CDATA[\nu]]></tex-math>
      <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi>ν</mml:mi></mml:math></alternatives></inline-formula>
      for a rate.</p>
    </list-item>
  </list>
</sec>
<sec id="secU003Aevidence">
  <title>Numerical evidence</title>
  <p>Two kinds of evidence are reported. The first needs no second
  solver: each portfolio the path returns is checked against its own
  optimality conditions. For the cap with multiplier
  <inline-formula><alternatives>
  <tex-math><![CDATA[\kappa]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi>κ</mml:mi></mml:math></alternatives></inline-formula>
  these are <inline-formula><alternatives>
  <tex-math><![CDATA[(\mu-\Sigma w)_j=\kappa\,\mathrm{sign}(w_j)]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mo stretchy="false" form="prefix">(</mml:mo><mml:mi>μ</mml:mi><mml:mo>−</mml:mo><mml:mi mathvariant="normal">Σ</mml:mi><mml:mi>w</mml:mi><mml:msub><mml:mo stretchy="false" form="postfix">)</mml:mo><mml:mi>j</mml:mi></mml:msub><mml:mo>=</mml:mo><mml:mi>κ</mml:mi><mml:mspace width="0.167em"></mml:mspace><mml:mrow><mml:mi mathvariant="normal">s</mml:mi><mml:mi mathvariant="normal">i</mml:mi><mml:mi mathvariant="normal">g</mml:mi><mml:mi mathvariant="normal">n</mml:mi></mml:mrow><mml:mo stretchy="false" form="prefix">(</mml:mo><mml:msub><mml:mi>w</mml:mi><mml:mi>j</mml:mi></mml:msub><mml:mo stretchy="false" form="postfix">)</mml:mo></mml:mrow></mml:math></alternatives></inline-formula>
  on the support and <inline-formula><alternatives>
  <tex-math><![CDATA[|(\mu-\Sigma w)_j|\le\kappa]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mo stretchy="false" form="prefix">|</mml:mo><mml:mo stretchy="false" form="prefix">(</mml:mo><mml:mi>μ</mml:mi><mml:mo>−</mml:mo><mml:mi mathvariant="normal">Σ</mml:mi><mml:mi>w</mml:mi><mml:msub><mml:mo stretchy="false" form="postfix">)</mml:mo><mml:mi>j</mml:mi></mml:msub><mml:mo stretchy="false" form="prefix">|</mml:mo><mml:mo>≤</mml:mo><mml:mi>κ</mml:mi></mml:mrow></mml:math></alternatives></inline-formula>
  off it; for the long-only problem at tilt
  <inline-formula><alternatives>
  <tex-math><![CDATA[\lambda]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi>λ</mml:mi></mml:math></alternatives></inline-formula>
  they are <inline-formula><alternatives>
  <tex-math><![CDATA[(\Sigma w-\lambda\mu)_j=\gamma]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mo stretchy="false" form="prefix">(</mml:mo><mml:mi mathvariant="normal">Σ</mml:mi><mml:mi>w</mml:mi><mml:mo>−</mml:mo><mml:mi>λ</mml:mi><mml:mi>μ</mml:mi><mml:msub><mml:mo stretchy="false" form="postfix">)</mml:mo><mml:mi>j</mml:mi></mml:msub><mml:mo>=</mml:mo><mml:mi>γ</mml:mi></mml:mrow></mml:math></alternatives></inline-formula>
  on the support and <inline-formula><alternatives>
  <tex-math><![CDATA[\ge\gamma]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mo>≥</mml:mo><mml:mi>γ</mml:mi></mml:mrow></mml:math></alternatives></inline-formula>
  off it, with <inline-formula><alternatives>
  <tex-math><![CDATA[\mathbf 1^{\top}w=1]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:msup><mml:mn mathvariant="bold">𝟏</mml:mn><mml:mi>⊤</mml:mi></mml:msup><mml:mi>w</mml:mi><mml:mo>=</mml:mo><mml:mn>1</mml:mn></mml:mrow></mml:math></alternatives></inline-formula>
  and <inline-formula><alternatives>
  <tex-math><![CDATA[w\ge0]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>w</mml:mi><mml:mo>≥</mml:mo><mml:mn>0</mml:mn></mml:mrow></mml:math></alternatives></inline-formula>.
  The KKT residual is the worst violation, divided by
  <inline-formula><alternatives>
  <tex-math><![CDATA[\lVert \mu\rVert _\infty]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:msub><mml:mrow><mml:mo stretchy="true" form="prefix">‖</mml:mo><mml:mi>μ</mml:mi><mml:mo stretchy="true" form="postfix">‖</mml:mo></mml:mrow><mml:mi>∞</mml:mi></mml:msub></mml:math></alternatives></inline-formula>
  or by the size of the gradient. The second compares with baselines
  that are independent of the path. The long–short problems go to
  Clarabel, an interior-point solver, through
  <monospace>cvxpy</monospace>; the long-only problem goes to
  <monospace>quadprog</monospace>, the active-set method of Goldfarb and
  Idnani
  (<xref alt="1983" rid="ref-goldfarb1983" ref-type="bibr">1983</xref>).</p>
  <p><italic>Long–short.</italic> Every column has a KKT residual below
  <inline-formula><alternatives>
  <tex-math><![CDATA[2.6\times10^{-15}]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mn>2.6</mml:mn><mml:mo>×</mml:mo><mml:msup><mml:mn>10</mml:mn><mml:mrow><mml:mi>−</mml:mi><mml:mn>15</mml:mn></mml:mrow></mml:msup></mml:mrow></mml:math></alternatives></inline-formula>,
  and below <inline-formula><alternatives>
  <tex-math><![CDATA[2.9\times10^{-15}]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mn>2.9</mml:mn><mml:mo>×</mml:mo><mml:msup><mml:mn>10</mml:mn><mml:mrow><mml:mi>−</mml:mi><mml:mn>15</mml:mn></mml:mrow></mml:msup></mml:mrow></mml:math></alternatives></inline-formula>
  once rescaled to fixed leverage. At each column’s cap Clarabel matches
  the path to <inline-formula><alternatives>
  <tex-math><![CDATA[3.0\times10^{-7}]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mn>3.0</mml:mn><mml:mo>×</mml:mo><mml:msup><mml:mn>10</mml:mn><mml:mrow><mml:mi>−</mml:mi><mml:mn>7</mml:mn></mml:mrow></mml:msup></mml:mrow></mml:math></alternatives></inline-formula>
  at the corners and <inline-formula><alternatives>
  <tex-math><![CDATA[1.4\times10^{-11}]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mn>1.4</mml:mn><mml:mo>×</mml:mo><mml:msup><mml:mn>10</mml:mn><mml:mrow><mml:mi>−</mml:mi><mml:mn>11</mml:mn></mml:mrow></mml:msup></mml:mrow></mml:math></alternatives></inline-formula>
  inside segments. The gap at the corners is the baseline’s, since
  interior-point methods are least accurate where the holdings change.
  At fixed leverage the figures are <inline-formula><alternatives>
  <tex-math><![CDATA[6.2\times10^{-6}]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mn>6.2</mml:mn><mml:mo>×</mml:mo><mml:msup><mml:mn>10</mml:mn><mml:mrow><mml:mi>−</mml:mi><mml:mn>6</mml:mn></mml:mrow></mml:msup></mml:mrow></mml:math></alternatives></inline-formula>
  and <inline-formula><alternatives>
  <tex-math><![CDATA[1.9\times10^{-11}]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mn>1.9</mml:mn><mml:mo>×</mml:mo><mml:msup><mml:mn>10</mml:mn><mml:mrow><mml:mi>−</mml:mi><mml:mn>11</mml:mn></mml:mrow></mml:msup></mml:mrow></mml:math></alternatives></inline-formula>.</p>
  <p><italic>Long only.</italic> The shifted path finds 19 corners on
  the test problem, the 17 of a plain call and two more at tilts
  <inline-formula><alternatives>
  <tex-math><![CDATA[0.1158]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mn>0.1158</mml:mn></mml:math></alternatives></inline-formula>
  and <inline-formula><alternatives>
  <tex-math><![CDATA[0.0128]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mn>0.0128</mml:mn></mml:math></alternatives></inline-formula>.
  They match the QP to <inline-formula><alternatives>
  <tex-math><![CDATA[6.0\times10^{-13}]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mn>6.0</mml:mn><mml:mo>×</mml:mo><mml:msup><mml:mn>10</mml:mn><mml:mrow><mml:mi>−</mml:mi><mml:mn>13</mml:mn></mml:mrow></mml:msup></mml:mrow></mml:math></alternatives></inline-formula>,
  points inside segments to <inline-formula><alternatives>
  <tex-math><![CDATA[7.9\times10^{-14}]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mn>7.9</mml:mn><mml:mo>×</mml:mo><mml:msup><mml:mn>10</mml:mn><mml:mrow><mml:mi>−</mml:mi><mml:mn>14</mml:mn></mml:mrow></mml:msup></mml:mrow></mml:math></alternatives></inline-formula>,
  the minimum-variance end to <inline-formula><alternatives>
  <tex-math><![CDATA[1.0\times10^{-16}]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mn>1.0</mml:mn><mml:mo>×</mml:mo><mml:msup><mml:mn>10</mml:mn><mml:mrow><mml:mi>−</mml:mi><mml:mn>16</mml:mn></mml:mrow></mml:msup></mml:mrow></mml:math></alternatives></inline-formula>,
  and the maximum-Sharpe portfolio at <inline-formula><alternatives>
  <tex-math><![CDATA[r=0]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>r</mml:mi><mml:mo>=</mml:mo><mml:mn>0</mml:mn></mml:mrow></mml:math></alternatives></inline-formula>
  to <inline-formula><alternatives>
  <tex-math><![CDATA[3.4\times10^{-15}]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mn>3.4</mml:mn><mml:mo>×</mml:mo><mml:msup><mml:mn>10</mml:mn><mml:mrow><mml:mi>−</mml:mi><mml:mn>15</mml:mn></mml:mrow></mml:msup></mml:mrow></mml:math></alternatives></inline-formula>.
  The corners and the minimum-variance end have KKT residuals below
  <inline-formula><alternatives>
  <tex-math><![CDATA[3.6\times10^{-14}]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mn>3.6</mml:mn><mml:mo>×</mml:mo><mml:msup><mml:mn>10</mml:mn><mml:mrow><mml:mi>−</mml:mi><mml:mn>14</mml:mn></mml:mrow></mml:msup></mml:mrow></mml:math></alternatives></inline-formula>.
  Table <xref alt="1" rid="tabU003Arobust">1</xref> repeats both checks
  on other sizes and seeds. Where the two disagree, at
  <inline-formula><alternatives>
  <tex-math><![CDATA[n=500]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>n</mml:mi><mml:mo>=</mml:mo><mml:mn>500</mml:mn></mml:mrow></mml:math></alternatives></inline-formula>,
  the residual shows that the gap of <inline-formula><alternatives>
  <tex-math><![CDATA[6.7\times10^{-11}]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mn>6.7</mml:mn><mml:mo>×</mml:mo><mml:msup><mml:mn>10</mml:mn><mml:mrow><mml:mi>−</mml:mi><mml:mn>11</mml:mn></mml:mrow></mml:msup></mml:mrow></mml:math></alternatives></inline-formula>
  is the QP’s. The number of corners need not equal the number of
  assets, because some assets leave and re-enter.</p>
  <table-wrap>
    <caption>
      <p>Algorithm 1 on five-factor models, three seeds each: the worst
      KKT residual over the corners and the minimum-variance end, the
      largest <inline-formula><alternatives>
      <tex-math><![CDATA[\ell_\infty]]></tex-math>
      <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:msub><mml:mi>ℓ</mml:mi><mml:mi>∞</mml:mi></mml:msub></mml:math></alternatives></inline-formula>
      weight discrepancy against an independent active-set QP at the
      same tilt, and the same discrepancy at the minimum-variance
      end.</p>
    </caption>
    <table id="tabU003Arobust">
      <thead>
        <tr>
          <th align="right"><inline-formula><alternatives>
          <tex-math><![CDATA[n]]></tex-math>
          <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi>n</mml:mi></mml:math></alternatives></inline-formula></th>
          <th align="center">seeds</th>
          <th align="center">corners</th>
          <th align="center"><inline-formula><alternatives>
          <tex-math><![CDATA[\nu_{\mathrm{last}}]]></tex-math>
          <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:msub><mml:mi>ν</mml:mi><mml:mrow><mml:mi mathvariant="normal">l</mml:mi><mml:mi mathvariant="normal">a</mml:mi><mml:mi mathvariant="normal">s</mml:mi><mml:mi mathvariant="normal">t</mml:mi></mml:mrow></mml:msub></mml:math></alternatives></inline-formula></th>
          <th align="center">KKT residual</th>
          <th align="center">worst corner</th>
          <th align="center">min.-variance end</th>
        </tr>
      </thead>
      <tbody>
        <tr>
          <td align="right">20</td>
          <td align="center">3</td>
          <td align="center">19</td>
          <td align="center"><inline-formula><alternatives>
          <tex-math><![CDATA[-0.57]]></tex-math>
          <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>−</mml:mi><mml:mn>0.57</mml:mn></mml:mrow></mml:math></alternatives></inline-formula>
          to <inline-formula><alternatives>
          <tex-math><![CDATA[0.12]]></tex-math>
          <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mn>0.12</mml:mn></mml:math></alternatives></inline-formula></td>
          <td align="center"><inline-formula><alternatives>
          <tex-math><![CDATA[1.1\times10^{-14}]]></tex-math>
          <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mn>1.1</mml:mn><mml:mo>×</mml:mo><mml:msup><mml:mn>10</mml:mn><mml:mrow><mml:mi>−</mml:mi><mml:mn>14</mml:mn></mml:mrow></mml:msup></mml:mrow></mml:math></alternatives></inline-formula></td>
          <td align="center"><inline-formula><alternatives>
          <tex-math><![CDATA[8.6\times10^{-14}]]></tex-math>
          <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mn>8.6</mml:mn><mml:mo>×</mml:mo><mml:msup><mml:mn>10</mml:mn><mml:mrow><mml:mi>−</mml:mi><mml:mn>14</mml:mn></mml:mrow></mml:msup></mml:mrow></mml:math></alternatives></inline-formula></td>
          <td align="center"><inline-formula><alternatives>
          <tex-math><![CDATA[2.4\times10^{-16}]]></tex-math>
          <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mn>2.4</mml:mn><mml:mo>×</mml:mo><mml:msup><mml:mn>10</mml:mn><mml:mrow><mml:mi>−</mml:mi><mml:mn>16</mml:mn></mml:mrow></mml:msup></mml:mrow></mml:math></alternatives></inline-formula></td>
        </tr>
        <tr>
          <td align="right">50</td>
          <td align="center">3</td>
          <td align="center">49</td>
          <td align="center"><inline-formula><alternatives>
          <tex-math><![CDATA[-11.9]]></tex-math>
          <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>−</mml:mi><mml:mn>11.9</mml:mn></mml:mrow></mml:math></alternatives></inline-formula>
          to <inline-formula><alternatives>
          <tex-math><![CDATA[-0.74]]></tex-math>
          <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>−</mml:mi><mml:mn>0.74</mml:mn></mml:mrow></mml:math></alternatives></inline-formula></td>
          <td align="center"><inline-formula><alternatives>
          <tex-math><![CDATA[1.0\times10^{-13}]]></tex-math>
          <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mn>1.0</mml:mn><mml:mo>×</mml:mo><mml:msup><mml:mn>10</mml:mn><mml:mrow><mml:mi>−</mml:mi><mml:mn>13</mml:mn></mml:mrow></mml:msup></mml:mrow></mml:math></alternatives></inline-formula></td>
          <td align="center"><inline-formula><alternatives>
          <tex-math><![CDATA[1.5\times10^{-13}]]></tex-math>
          <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mn>1.5</mml:mn><mml:mo>×</mml:mo><mml:msup><mml:mn>10</mml:mn><mml:mrow><mml:mi>−</mml:mi><mml:mn>13</mml:mn></mml:mrow></mml:msup></mml:mrow></mml:math></alternatives></inline-formula></td>
          <td align="center"><inline-formula><alternatives>
          <tex-math><![CDATA[1.7\times10^{-16}]]></tex-math>
          <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mn>1.7</mml:mn><mml:mo>×</mml:mo><mml:msup><mml:mn>10</mml:mn><mml:mrow><mml:mi>−</mml:mi><mml:mn>16</mml:mn></mml:mrow></mml:msup></mml:mrow></mml:math></alternatives></inline-formula></td>
        </tr>
        <tr>
          <td align="right">100</td>
          <td align="center">3</td>
          <td align="center">99–103</td>
          <td align="center"><inline-formula><alternatives>
          <tex-math><![CDATA[-0.56]]></tex-math>
          <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>−</mml:mi><mml:mn>0.56</mml:mn></mml:mrow></mml:math></alternatives></inline-formula>
          to <inline-formula><alternatives>
          <tex-math><![CDATA[-0.38]]></tex-math>
          <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>−</mml:mi><mml:mn>0.38</mml:mn></mml:mrow></mml:math></alternatives></inline-formula></td>
          <td align="center"><inline-formula><alternatives>
          <tex-math><![CDATA[2.5\times10^{-14}]]></tex-math>
          <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mn>2.5</mml:mn><mml:mo>×</mml:mo><mml:msup><mml:mn>10</mml:mn><mml:mrow><mml:mi>−</mml:mi><mml:mn>14</mml:mn></mml:mrow></mml:msup></mml:mrow></mml:math></alternatives></inline-formula></td>
          <td align="center"><inline-formula><alternatives>
          <tex-math><![CDATA[1.1\times10^{-11}]]></tex-math>
          <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mn>1.1</mml:mn><mml:mo>×</mml:mo><mml:msup><mml:mn>10</mml:mn><mml:mrow><mml:mi>−</mml:mi><mml:mn>11</mml:mn></mml:mrow></mml:msup></mml:mrow></mml:math></alternatives></inline-formula></td>
          <td align="center"><inline-formula><alternatives>
          <tex-math><![CDATA[3.3\times10^{-16}]]></tex-math>
          <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mn>3.3</mml:mn><mml:mo>×</mml:mo><mml:msup><mml:mn>10</mml:mn><mml:mrow><mml:mi>−</mml:mi><mml:mn>16</mml:mn></mml:mrow></mml:msup></mml:mrow></mml:math></alternatives></inline-formula></td>
        </tr>
        <tr>
          <td align="right">500</td>
          <td align="center">3</td>
          <td align="center">503</td>
          <td align="center"><inline-formula><alternatives>
          <tex-math><![CDATA[-0.45]]></tex-math>
          <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>−</mml:mi><mml:mn>0.45</mml:mn></mml:mrow></mml:math></alternatives></inline-formula>
          to <inline-formula><alternatives>
          <tex-math><![CDATA[-0.26]]></tex-math>
          <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>−</mml:mi><mml:mn>0.26</mml:mn></mml:mrow></mml:math></alternatives></inline-formula></td>
          <td align="center"><inline-formula><alternatives>
          <tex-math><![CDATA[2.1\times10^{-13}]]></tex-math>
          <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mn>2.1</mml:mn><mml:mo>×</mml:mo><mml:msup><mml:mn>10</mml:mn><mml:mrow><mml:mi>−</mml:mi><mml:mn>13</mml:mn></mml:mrow></mml:msup></mml:mrow></mml:math></alternatives></inline-formula></td>
          <td align="center"><inline-formula><alternatives>
          <tex-math><![CDATA[6.7\times10^{-11}]]></tex-math>
          <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mn>6.7</mml:mn><mml:mo>×</mml:mo><mml:msup><mml:mn>10</mml:mn><mml:mrow><mml:mi>−</mml:mi><mml:mn>11</mml:mn></mml:mrow></mml:msup></mml:mrow></mml:math></alternatives></inline-formula></td>
          <td align="center"><inline-formula><alternatives>
          <tex-math><![CDATA[4.3\times10^{-16}]]></tex-math>
          <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mn>4.3</mml:mn><mml:mo>×</mml:mo><mml:msup><mml:mn>10</mml:mn><mml:mrow><mml:mi>−</mml:mi><mml:mn>16</mml:mn></mml:mrow></mml:msup></mml:mrow></mml:math></alternatives></inline-formula></td>
        </tr>
      </tbody>
    </table>
  </table-wrap>
  <p><italic>Portfolio returns.</italic> The daily value-weighted
  returns of the 100 portfolios that Fama and French form on size and
  book-to-market
  (<xref alt="French, n.d." rid="ref-french" ref-type="bibr">French,
  n.d.</xref>), from January 2016 to December 2025, are free to download
  from their Data Library, and a script published with the code fetches
  them. One portfolio misses 250 days and is dropped, which leaves 99
  portfolios over 2514 days. With the centred returns as
  <inline-formula><alternatives>
  <tex-math><![CDATA[X]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi>X</mml:mi></mml:math></alternatives></inline-formula>
  the last corner sits at <inline-formula><alternatives>
  <tex-math><![CDATA[\nu_{\mathrm{last}}=-0.0118]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:msub><mml:mi>ν</mml:mi><mml:mrow><mml:mi mathvariant="normal">l</mml:mi><mml:mi mathvariant="normal">a</mml:mi><mml:mi mathvariant="normal">s</mml:mi><mml:mi mathvariant="normal">t</mml:mi></mml:mrow></mml:msub><mml:mo>=</mml:mo><mml:mi>−</mml:mi><mml:mn>0.0118</mml:mn></mml:mrow></mml:math></alternatives></inline-formula>,
  eleven times <inline-formula><alternatives>
  <tex-math><![CDATA[\max_j|\mu_j|]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:msub><mml:mrow><mml:mi mathvariant="normal">max</mml:mi><mml:mo>&#8289;</mml:mo></mml:mrow><mml:mi>j</mml:mi></mml:msub><mml:mo stretchy="false" form="prefix">|</mml:mo><mml:msub><mml:mi>μ</mml:mi><mml:mi>j</mml:mi></mml:msub><mml:mo stretchy="false" form="prefix">|</mml:mo></mml:mrow></mml:math></alternatives></inline-formula>
  below zero. Algorithm 1 returns all 12 corners. They match the QP to
  <inline-formula><alternatives>
  <tex-math><![CDATA[2.1\times10^{-13}]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mn>2.1</mml:mn><mml:mo>×</mml:mo><mml:msup><mml:mn>10</mml:mn><mml:mrow><mml:mi>−</mml:mi><mml:mn>13</mml:mn></mml:mrow></mml:msup></mml:mrow></mml:math></alternatives></inline-formula>
  and have KKT residuals below <inline-formula><alternatives>
  <tex-math><![CDATA[3.9\times10^{-14}]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mn>3.9</mml:mn><mml:mo>×</mml:mo><mml:msup><mml:mn>10</mml:mn><mml:mrow><mml:mi>−</mml:mi><mml:mn>14</mml:mn></mml:mrow></mml:msup></mml:mrow></mml:math></alternatives></inline-formula>,
  and the minimum-variance portfolio, which holds 7 of the portfolios,
  matches to <inline-formula><alternatives>
  <tex-math><![CDATA[1.6\times10^{-15}]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mn>1.6</mml:mn><mml:mo>×</mml:mo><mml:msup><mml:mn>10</mml:mn><mml:mrow><mml:mi>−</mml:mi><mml:mn>15</mml:mn></mml:mrow></mml:msup></mml:mrow></mml:math></alternatives></inline-formula>.
  Diversified portfolios are highly correlated, so the frontier turns
  only 12 times and a grid of QPs is cheap here.</p>
  <p><italic>Stock returns.</italic> The second data set tests the
  method at scale. It is simulated, so it needs no download and every
  rerun reproduces it: daily returns of 500 stocks over 1250 days, about
  five years, from a five-factor model with a market factor of 1% daily
  volatility, four style factors of 0.5%, idiosyncratic volatility
  between 1% and 3%, and expected returns around five basis points a
  day. Unlike the test problem, <inline-formula><alternatives>
  <tex-math><![CDATA[\mu]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi>μ</mml:mi></mml:math></alternatives></inline-formula>
  and <inline-formula><alternatives>
  <tex-math><![CDATA[\Sigma]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi mathvariant="normal">Σ</mml:mi></mml:math></alternatives></inline-formula>
  are both estimated from the returns. With the centred returns as
  <inline-formula><alternatives>
  <tex-math><![CDATA[X]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi>X</mml:mi></mml:math></alternatives></inline-formula>
  the last corner sits at <inline-formula><alternatives>
  <tex-math><![CDATA[\nu_{\mathrm{last}}=-0.190]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:msub><mml:mi>ν</mml:mi><mml:mrow><mml:mi mathvariant="normal">l</mml:mi><mml:mi mathvariant="normal">a</mml:mi><mml:mi mathvariant="normal">s</mml:mi><mml:mi mathvariant="normal">t</mml:mi></mml:mrow></mml:msub><mml:mo>=</mml:mo><mml:mi>−</mml:mi><mml:mn>0.190</mml:mn></mml:mrow></mml:math></alternatives></inline-formula>,
  about sixty times <inline-formula><alternatives>
  <tex-math><![CDATA[\max_j|\mu_j|]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:msub><mml:mrow><mml:mi mathvariant="normal">max</mml:mi><mml:mo>&#8289;</mml:mo></mml:mrow><mml:mi>j</mml:mi></mml:msub><mml:mo stretchy="false" form="prefix">|</mml:mo><mml:msub><mml:mi>μ</mml:mi><mml:mi>j</mml:mi></mml:msub><mml:mo stretchy="false" form="prefix">|</mml:mo></mml:mrow></mml:math></alternatives></inline-formula>
  below zero. Algorithm 1 returns all 116 corners in the time of about
  one QP solve, so a 100-point grid of QPs costs 75 to 95 times as much
  as the path and still misses the corners. Warm-starting narrows the
  gap without closing it: OSQP
  (<xref alt="Stellato et al., 2020" rid="ref-stellato2020" ref-type="bibr">Stellato
  et al., 2020</xref>), set up once so that its factorisation is reused,
  with each tilt changing only the linear term and each solve starting
  from the last, needs a sixth to a third of the cold grid’s time at
  tolerance <inline-formula><alternatives>
  <tex-math><![CDATA[10^{-6}]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:msup><mml:mn>10</mml:mn><mml:mrow><mml:mi>−</mml:mi><mml:mn>6</mml:mn></mml:mrow></mml:msup></mml:math></alternatives></inline-formula>
  and agrees with the cold QP to <inline-formula><alternatives>
  <tex-math><![CDATA[3.7\times10^{-12}]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mn>3.7</mml:mn><mml:mo>×</mml:mo><mml:msup><mml:mn>10</mml:mn><mml:mrow><mml:mi>−</mml:mi><mml:mn>12</mml:mn></mml:mrow></mml:msup></mml:mrow></mml:math></alternatives></inline-formula>
  at every grid point. Absolute times depend on the machine and are not
  reported. Every corner has a KKT residual below
  <inline-formula><alternatives>
  <tex-math><![CDATA[4.7\times10^{-13}]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mn>4.7</mml:mn><mml:mo>×</mml:mo><mml:msup><mml:mn>10</mml:mn><mml:mrow><mml:mi>−</mml:mi><mml:mn>13</mml:mn></mml:mrow></mml:msup></mml:mrow></mml:math></alternatives></inline-formula>
  and matches its QP to <inline-formula><alternatives>
  <tex-math><![CDATA[8.6\times10^{-13}]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mn>8.6</mml:mn><mml:mo>×</mml:mo><mml:msup><mml:mn>10</mml:mn><mml:mrow><mml:mi>−</mml:mi><mml:mn>13</mml:mn></mml:mrow></mml:msup></mml:mrow></mml:math></alternatives></inline-formula>,
  and the minimum-variance portfolio, which holds 63 stocks, matches to
  <inline-formula><alternatives>
  <tex-math><![CDATA[5.8\times10^{-16}]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mn>5.8</mml:mn><mml:mo>×</mml:mo><mml:msup><mml:mn>10</mml:mn><mml:mrow><mml:mi>−</mml:mi><mml:mn>16</mml:mn></mml:mrow></mml:msup></mml:mrow></mml:math></alternatives></inline-formula>.</p>
</sec>
<sec id="secU003Ascope">
  <title>When to use it</title>
  <p>The path beats a grid of QP solves, cold- or warm-started, on
  accuracy, since it finds the corners exactly. On speed it wins at
  scale, on the 500 simulated stocks; on a problem as small as the
  Fama–French portfolios its lead shrinks to a factor of three or four.
  LARS is in R and <monospace>scikit-learn</monospace>, the positive
  LASSO only in <monospace>scikit-learn</monospace>, so corner
  portfolios need no portfolio software, and one call shows that the
  knots of a LASSO path and the turning points of a frontier are the
  same points. It is the wrong tool when <inline-formula><alternatives>
  <tex-math><![CDATA[\Sigma]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi mathvariant="normal">Σ</mml:mi></mml:math></alternatives></inline-formula>
  is singular, where the identity is not known to survive
  (<xref alt="Schmelzer &amp; Hastie, 2026, Section 7" rid="ref-perspective" ref-type="bibr">Schmelzer
  &amp; Hastie, 2026, Section 7</xref>), or when the portfolio needs
  more than one linear constraint. The LASSO that
  <monospace>scikit-learn</monospace> solves has exactly one besides the
  signs, <inline-formula><alternatives>
  <tex-math><![CDATA[\lVert \beta\rVert _1\le t]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:msub><mml:mrow><mml:mo stretchy="true" form="prefix">‖</mml:mo><mml:mi>β</mml:mi><mml:mo stretchy="true" form="postfix">‖</mml:mo></mml:mrow><mml:mn>1</mml:mn></mml:msub><mml:mo>≤</mml:mo><mml:mi>t</mml:mi></mml:mrow></mml:math></alternatives></inline-formula>:
  the gross-exposure cap of
  Sections <xref alt="5" rid="secU003Alongshort">5</xref>
  and <xref alt="6" rid="secU003Aleverage">6</xref>, or, with
  <monospace>positive=True</monospace>, the budget
  <inline-formula><alternatives>
  <tex-math><![CDATA[\mathbf 1^{\top}w=1]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:msup><mml:mn mathvariant="bold">𝟏</mml:mn><mml:mi>⊤</mml:mi></mml:msup><mml:mi>w</mml:mi><mml:mo>=</mml:mo><mml:mn>1</mml:mn></mml:mrow></mml:math></alternatives></inline-formula>
  of Section <xref alt="7" rid="secU003Alongonly">7</xref>. The signs
  are either all free or all nonnegative. A dollar-neutral book adds the
  equality <inline-formula><alternatives>
  <tex-math><![CDATA[\mathbf 1^{\top}\beta=0]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:msup><mml:mn mathvariant="bold">𝟏</mml:mn><mml:mi>⊤</mml:mi></mml:msup><mml:mi>β</mml:mi><mml:mo>=</mml:mo><mml:mn>0</mml:mn></mml:mrow></mml:math></alternatives></inline-formula>,
  and a <inline-formula><alternatives>
  <tex-math><![CDATA[130/30]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mn>130</mml:mn><mml:mi>/</mml:mi><mml:mn>30</mml:mn></mml:mrow></mml:math></alternatives></inline-formula>
  book needs the budget and the gross cap at once. Path algorithms for a
  LASSO with general linear constraints exist
  (<xref alt="Gaines et al., 2018" rid="ref-gaines2018" ref-type="bibr">Gaines
  et al., 2018</xref>;
  <xref alt="James et al., 2020" rid="ref-james2020" ref-type="bibr">James
  et al., 2020</xref>), but not in <monospace>scikit-learn</monospace>.
  The CLA takes such constraints and bounds on the weights directly, and
  <monospace>cvxcla</monospace>
  (<xref alt="Schmelzer, 2026" rid="ref-cvxcla" ref-type="bibr">Schmelzer,
  2026</xref>) implements it. A risk budget
  <inline-formula><alternatives>
  <tex-math><![CDATA[w^{\top}\Sigma w\le\sigma^2]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:msup><mml:mi>w</mml:mi><mml:mi>⊤</mml:mi></mml:msup><mml:mi mathvariant="normal">Σ</mml:mi><mml:mi>w</mml:mi><mml:mo>≤</mml:mo><mml:msup><mml:mi>σ</mml:mi><mml:mn>2</mml:mn></mml:msup></mml:mrow></mml:math></alternatives></inline-formula>
  has no path of its own, but along each segment the variance is
  quadratic in the parameter, so the portfolio at a given
  <inline-formula><alternatives>
  <tex-math><![CDATA[\sigma]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi>σ</mml:mi></mml:math></alternatives></inline-formula>
  comes from one scalar equation.</p>
  <p>The numbers above are evidence for Theorem 1 and Proposition 3 of
  Schmelzer &amp; Hastie
  (<xref alt="2026" rid="ref-perspective" ref-type="bibr">2026</xref>);
  the proofs are in that paper. Each check tests a prediction of one of
  the two results. Theorem 1 says the LASSO path is the frontier under a
  gross-exposure cap: every column meets the optimality conditions of
  its cap and matches Clarabel there. Proposition 3 says the nonnegative
  LASSO is the long-only frontier: every corner, and every point between
  corners, matches an active-set QP at the same tilt. Both make the
  frontier piecewise linear in its parameter, so a path finds its
  corners exactly where a grid of QP solves, cold- or warm-started,
  misses them. The checks were written by an author of Schmelzer &amp;
  Hastie
  (<xref alt="2026" rid="ref-perspective" ref-type="bibr">2026</xref>),
  so they are not independent in the usual sense. The baseline solvers
  are, and the script and its tolerances are published so that anyone
  can rerun them. For practical use the note adds three details: the
  shift, a <inline-formula><alternatives>
  <tex-math><![CDATA[\nu_0]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:msub><mml:mi>ν</mml:mi><mml:mn>0</mml:mn></mml:msub></mml:math></alternatives></inline-formula>
  computed in advance, and a <monospace>max_iter</monospace> large
  enough for big problems.</p>
</sec>
<sec id="secU003Aavailability" sec-type="data-availability">
  <title>Data and Code Availability</title>
  <p>The software is in the directory
  <monospace>preprints/lasso/</monospace> of
  <ext-link ext-link-type="uri" xlink:href="https://github.com/Jebel-Quant/lasso">https://github.com/Jebel-Quant/lasso</ext-link>,
  under the MIT licence. <monospace>python/make_figures.py</monospace>
  regenerates every figure and number in the note;
  <monospace>uv run python/make_figures.py test</monospace> runs its
  checks. It is a single Python script that declares its own pinned
  dependencies, and <monospace>python/make_figures.py.lock</monospace>
  next to it fixes Python 3.12 and every package it pulls in, to the
  exact version and hash. The R snippet of
  Section <xref alt="5" rid="secU003Alongshort">5</xref> is
  <monospace>R/long_short.R</monospace>, with a check against
  <monospace>lars_path</monospace>.</p>
  <p>The lockfile fixes the software, not the hardware. Residuals and
  gaps near <inline-formula><alternatives>
  <tex-math><![CDATA[10^{-13}]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:msup><mml:mn>10</mml:mn><mml:mrow><mml:mi>−</mml:mi><mml:mn>13</mml:mn></mml:mrow></mml:msup></mml:math></alternatives></inline-formula>
  come out with different last digits on another CPU or BLAS build, so a
  rerun will not match the printed values digit for digit. The tests
  therefore check them against tolerances between
  <inline-formula><alternatives>
  <tex-math><![CDATA[10^{-12}]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:msup><mml:mn>10</mml:mn><mml:mrow><mml:mi>−</mml:mi><mml:mn>12</mml:mn></mml:mrow></mml:msup></mml:math></alternatives></inline-formula>
  and <inline-formula><alternatives>
  <tex-math><![CDATA[10^{-9}]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:msup><mml:mn>10</mml:mn><mml:mrow><mml:mi>−</mml:mi><mml:mn>9</mml:mn></mml:mrow></mml:msup></mml:math></alternatives></inline-formula>.
  Costs are given only as ratios, which vary far less between machines
  than absolute times;
  <monospace>uv run python/make_figures.py timings</monospace> measures
  them.</p>
  <p>The test problem, the factor models of
  Table <xref alt="1" rid="tabU003Arobust">1</xref> and the stock
  returns of Section <xref alt="8" rid="secU003Aevidence">8</xref> are
  simulated inside the script from fixed seeds, so they need no data.
  The portfolio returns of
  Section <xref alt="8" rid="secU003Aevidence">8</xref> come from
  Kenneth French’s Data Library
  (<xref alt="French, n.d." rid="ref-french" ref-type="bibr">French,
  n.d.</xref>) and, being copyrighted, are not redistributed.
  <monospace>python/fetch_french.py</monospace> downloads them and
  writes <monospace>data/french100_daily.csv</monospace>. The note used
  the CRSP vintage of August 2026, SHA-256
  <monospace>98298ef6…3c43</monospace>. The library rebuilds its history
  each month from CRSP, so a later download can differ where CRSP
  revises a return.</p>
</sec>
<sec id="competing-interests">
  <title>Competing interests</title>
  <p>The author works at Jebel Quant Research, which hosts the code of
  this note, and maintains <monospace>cvxcla</monospace>, an open-source
  Python implementation of the Critical Line Algorithm. The note’s
  method needs neither: it runs on <monospace>scikit-learn</monospace>
  or R alone. Section <xref alt="9" rid="secU003Ascope">9</xref> points
  to <monospace>cvxcla</monospace> for portfolios with more constraints,
  and the companion script checks its corners against it. The author
  declares no other competing interests.</p>
</sec>
<sec id="acknowledgements">
  <title>Acknowledgements</title>
  <p>I thank Trevor Hastie for many helpful discussions.</p>
</sec>
</body>
<back><ref-list><ref id="ref1"><mixed-citation>Black, F. (1972). Capital market equilibrium with restricted borrowing. The Journal of Business, 45(3), 444–455. https://doi.org/10.1086/295472</mixed-citation></ref><ref id="ref2"><element-citation publication-type="journal"><person-group person-group-type="author"><name><surname>Brodie</surname><given-names>Joshua</given-names></name><name><surname>Daubechies</surname><given-names>Ingrid</given-names></name><name><surname>De Mol</surname><given-names>Christine</given-names></name><name><surname>Giannone</surname><given-names>Domenico</given-names></name><name><surname>Loris</surname><given-names>Ignace</given-names></name></person-group><article-title>Sparse and stable Markowitz portfolios</article-title><source>Proceedings of the National Academy of Sciences</source><year>2009</year><volume>106</volume><issue>30</issue><fpage>12267</fpage><lpage>12272</lpage><publisher-name>National Academy of Sciences</publisher-name><pub-id pub-id-type="doi">10.1073/pnas.0904287106</pub-id></element-citation></ref><ref id="ref3"><element-citation publication-type="journal"><person-group person-group-type="author"><name><surname>Efron</surname><given-names>Bradley</given-names></name><name><surname>Hastie</surname><given-names>Trevor</given-names></name><name><surname>Johnstone</surname><given-names>Iain</given-names></name><name><surname>Tibshirani</surname><given-names>Robert</given-names></name></person-group><article-title>Least angle regression</article-title><source>The Annals of Statistics</source><year>2004</year><volume>32</volume><issue>2</issue><fpage>407</fpage><lpage>499</lpage><publisher-name>Institute of Mathematical Statistics</publisher-name><pub-id pub-id-type="doi">10.1214/009053604000000067</pub-id></element-citation></ref><ref id="ref4"><element-citation publication-type="journal"><person-group person-group-type="author"><name><surname>Fan</surname><given-names>Jianqing</given-names></name><name><surname>Zhang</surname><given-names>Jingjin</given-names></name><name><surname>Yu</surname><given-names>Ke</given-names></name></person-group><article-title>Vast Portfolio Selection With Gross-Exposure Constraints</article-title><source>Journal of the American Statistical Association</source><year>2012</year><volume>107</volume><issue>498</issue><fpage>592</fpage><lpage>606</lpage><publisher-name>Informa UK Limited</publisher-name><pub-id pub-id-type="doi">10.1080/01621459.2012.682825</pub-id></element-citation></ref><ref id="ref5"><mixed-citation>French, K. R. (n.d.). Data library: 100 portfolios formed on size and book-to-market, daily. Retrieved October 2026, from https://mba.tuck.dartmouth.edu/pages/faculty/ken.french/data_library.html</mixed-citation></ref><ref id="ref6"><mixed-citation>Friedman, J., Hastie, T., &amp; Tibshirani, R. (2010). Regularization paths for generalized linear models via coordinate descent. Journal of Statistical Software, 33(1), 1–22. https://doi.org/10.18637/jss.v033.i01</mixed-citation></ref><ref id="ref7"><element-citation publication-type="journal"><person-group person-group-type="author"><name><surname>Gaines</surname><given-names>Brian R.</given-names></name><name><surname>Kim</surname><given-names>Juhyun</given-names></name><name><surname>Zhou</surname><given-names>Hua</given-names></name></person-group><article-title>Algorithms for Fitting the Constrained Lasso</article-title><source>Journal of Computational and Graphical Statistics</source><year>2018</year><volume>27</volume><issue>4</issue><fpage>861</fpage><lpage>871</lpage><publisher-name>Informa UK Limited</publisher-name><pub-id pub-id-type="doi">10.1080/10618600.2018.1473777</pub-id></element-citation></ref><ref id="ref8"><element-citation publication-type="journal"><person-group person-group-type="author"><name><surname>Goldfarb</surname><given-names>D.</given-names></name><name><surname>Idnani</surname><given-names>A.</given-names></name></person-group><article-title>A numerically stable dual method for solving strictly convex quadratic programs</article-title><source>Mathematical Programming</source><year>1983</year><volume>27</volume><issue>1</issue><fpage>1</fpage><lpage>33</lpage><publisher-name>Springer Science and Business Media LLC</publisher-name><pub-id pub-id-type="doi">10.1007/BF02591962</pub-id></element-citation></ref><ref id="ref9"><mixed-citation>Hastie, T., &amp; Efron, B. (2022). lars: Least angle regression, lasso and forward stagewise [R package version 1.3]. https://doi.org/10.32614/CRAN.package.lars</mixed-citation></ref><ref id="ref10"><element-citation publication-type="journal"><person-group person-group-type="author"><name><surname>James</surname><given-names>Gareth M.</given-names></name><name><surname>Paulson</surname><given-names>Courtney</given-names></name><name><surname>Rusmevichientong</surname><given-names>Paat</given-names></name></person-group><article-title>Penalized and Constrained Optimization: An Application to High-Dimensional Website Advertising</article-title><source>Journal of the American Statistical Association</source><year>2020</year><volume>115</volume><issue>529</issue><fpage>107</fpage><lpage>122</lpage><publisher-name>Informa UK Limited</publisher-name><pub-id pub-id-type="doi">10.1080/01621459.2019.1609970</pub-id></element-citation></ref><ref id="ref11"><element-citation publication-type="journal"><person-group person-group-type="author"><name><surname>Kelly</surname><given-names>J. L.</given-names></name></person-group><article-title>A New Interpretation of Information Rate</article-title><source>Bell System Technical Journal</source><year>1956</year><volume>35</volume><issue>4</issue><fpage>917</fpage><lpage>926</lpage><publisher-name>Institute of Electrical and Electronics Engineers (IEEE)</publisher-name><pub-id pub-id-type="doi">10.1002/j.1538-7305.1956.tb03809.x</pub-id></element-citation></ref><ref id="ref12"><mixed-citation>Lawson, C. L., &amp; Hanson, R. J. (1974). Solving least squares problems. Prentice-Hall.</mixed-citation></ref><ref id="ref13"><mixed-citation>Markowitz, H. M. (1952). Portfolio selection. The Journal of Finance, 7(1), 77–91. https://doi.org/10.1111/j.1540-6261.1952.tb01525.x</mixed-citation></ref><ref id="ref14"><mixed-citation>Markowitz, H. M. (1956). The optimization of a quadratic function subject to linear constraints. Naval Research Logistics Quarterly, 3(1–2), 111–133. https://doi.org/10.1002/nav.3800030110</mixed-citation></ref><ref id="ref15"><mixed-citation>Osborne, M. R., Presnell, B., &amp; Turlach, B. A. (2000). A new approach to variable selection in least squares problems. IMA Journal of Numerical Analysis, 20(3), 389–403. https://doi.org/10.1093/imanum/20.3.389</mixed-citation></ref><ref id="ref16"><mixed-citation>Pedregosa, F. et al. (2011). Scikit-learn: Machine learning in python. Journal of Machine Learning Research, 12, 2825–2830.</mixed-citation></ref><ref id="ref17"><mixed-citation>Schmelzer, T. (2026). Cvxcla: The critical line algorithm with an operator interface in python. SSRN preprint 7583179. https://doi.org/10.2139/ssrn.7583179</mixed-citation></ref><ref id="ref18"><element-citation publication-type="journal"><person-group person-group-type="author"><name><surname>Schmelzer</surname><given-names>Thomas</given-names></name><name><surname>Hastie</surname><given-names>Trevor</given-names></name></person-group><article-title>The Critical Line Algorithm and the Constrained LASSO: One Curve, Two Literatures</article-title><year>2026</year><publisher-name>arXiv</publisher-name><pub-id pub-id-type="doi">10.48550/arXiv.2609.25704</pub-id></element-citation></ref><ref id="ref19"><mixed-citation>Sharpe, W. F. (1964). Capital asset prices: A theory of market equilibrium under conditions of risk. The Journal of Finance, 19(3), 425–442. https://doi.org/10.2307/2977928</mixed-citation></ref><ref id="ref20"><element-citation publication-type="journal"><person-group person-group-type="author"><name><surname>Stellato</surname><given-names>Bartolomeo</given-names></name><name><surname>Banjac</surname><given-names>Goran</given-names></name><name><surname>Goulart</surname><given-names>Paul</given-names></name><name><surname>Bemporad</surname><given-names>Alberto</given-names></name><name><surname>Boyd</surname><given-names>Stephen</given-names></name></person-group><article-title>OSQP: an operator splitting solver for quadratic programs</article-title><source>Mathematical Programming Computation</source><year>2020</year><volume>12</volume><issue>4</issue><fpage>637</fpage><lpage>672</lpage><publisher-name>Springer Science and Business Media LLC</publisher-name><pub-id pub-id-type="doi">10.1007/s12532-020-00179-2</pub-id></element-citation></ref><ref id="ref21"><element-citation publication-type="journal"><person-group person-group-type="author"><name><surname>Tibshirani</surname><given-names>Robert</given-names></name></person-group><article-title>Regression Shrinkage and Selection Via the Lasso</article-title><source>Journal of the Royal Statistical Society Series B: Statistical Methodology</source><year>1996</year><volume>58</volume><issue>1</issue><fpage>267</fpage><lpage>288</lpage><publisher-name>Oxford University Press (OUP)</publisher-name><pub-id pub-id-type="doi">10.1111/j.2517-6161.1996.tb02080.x</pub-id></element-citation></ref><ref id="ref22"><mixed-citation>Tobin, J. (1958). Liquidity preference as behavior towards risk. The Review of Economic Studies, 25(2), 65–86. https://doi.org/10.2307/2296205</mixed-citation></ref></ref-list>
<ref-list>
  <title>References</title>
  <ref id="ref-black1972">
    <mixed-citation>Black, F. (1972). Capital market equilibrium with
    restricted borrowing. <italic>The Journal of Business</italic>,
    <italic>45</italic>(3), 444–455.
    <ext-link ext-link-type="uri" xlink:href="https://doi.org/10.1086/295472">https://doi.org/10.1086/295472</ext-link></mixed-citation>
  </ref>
  <ref id="ref-brodie2009">
    <mixed-citation>Brodie, J., Daubechies, I., De Mol, C., Giannone,
    D., &amp; Loris, I. (2009). Sparse and stable Markowitz portfolios.
    <italic>Proceedings of the National Academy of Sciences</italic>,
    <italic>106</italic>(30), 12267–12272.
    <ext-link ext-link-type="uri" xlink:href="https://doi.org/10.1073/pnas.0904287106">https://doi.org/10.1073/pnas.0904287106</ext-link></mixed-citation>
  </ref>
  <ref id="ref-efron2004">
    <mixed-citation>Efron, B., Hastie, T., Johnstone, I., &amp;
    Tibshirani, R. (2004). Least angle regression. <italic>The Annals of
    Statistics</italic>, <italic>32</italic>(2), 407–499.
    <ext-link ext-link-type="uri" xlink:href="https://doi.org/10.1214/009053604000000067">https://doi.org/10.1214/009053604000000067</ext-link></mixed-citation>
  </ref>
  <ref id="ref-fan2012">
    <mixed-citation>Fan, J., Zhang, J., &amp; Yu, K. (2012). Vast
    portfolio selection with gross-exposure constraints. <italic>Journal
    of the American Statistical Association</italic>,
    <italic>107</italic>(498), 592–606.
    <ext-link ext-link-type="uri" xlink:href="https://doi.org/10.1080/01621459.2012.682825">https://doi.org/10.1080/01621459.2012.682825</ext-link></mixed-citation>
  </ref>
  <ref id="ref-french">
    <mixed-citation>French, K. R. (n.d.). <italic>Data library: 100
    portfolios formed on size and book-to-market, daily</italic>.
    Retrieved October 2026, from
    <ext-link ext-link-type="uri" xlink:href="https://mba.tuck.dartmouth.edu/pages/faculty/ken.french/data_library.html">https://mba.tuck.dartmouth.edu/pages/faculty/ken.french/data_library.html</ext-link></mixed-citation>
  </ref>
  <ref id="ref-friedman2010">
    <mixed-citation>Friedman, J., Hastie, T., &amp; Tibshirani, R.
    (2010). Regularization paths for generalized linear models via
    coordinate descent. <italic>Journal of Statistical
    Software</italic>, <italic>33</italic>(1), 1–22.
    <ext-link ext-link-type="uri" xlink:href="https://doi.org/10.18637/jss.v033.i01">https://doi.org/10.18637/jss.v033.i01</ext-link></mixed-citation>
  </ref>
  <ref id="ref-gaines2018">
    <mixed-citation>Gaines, B. R., Kim, J., &amp; Zhou, H. (2018).
    Algorithms for fitting the constrained lasso. <italic>Journal of
    Computational and Graphical Statistics</italic>,
    <italic>27</italic>(4), 861–871.
    <ext-link ext-link-type="uri" xlink:href="https://doi.org/10.1080/10618600.2018.1473777">https://doi.org/10.1080/10618600.2018.1473777</ext-link></mixed-citation>
  </ref>
  <ref id="ref-goldfarb1983">
    <mixed-citation>Goldfarb, D., &amp; Idnani, A. (1983). A numerically
    stable dual method for solving strictly convex quadratic programs.
    <italic>Mathematical Programming</italic>, <italic>27</italic>(1),
    1–33.
    <ext-link ext-link-type="uri" xlink:href="https://doi.org/10.1007/BF02591962">https://doi.org/10.1007/BF02591962</ext-link></mixed-citation>
  </ref>
  <ref id="ref-lars">
    <mixed-citation>Hastie, T., &amp; Efron, B. (2022).
    <italic><monospace>lars</monospace>: Least angle regression, lasso
    and forward stagewise</italic> [R package version 1.3].
    <ext-link ext-link-type="uri" xlink:href="https://doi.org/10.32614/CRAN.package.lars">https://doi.org/10.32614/CRAN.package.lars</ext-link></mixed-citation>
  </ref>
  <ref id="ref-james2020">
    <mixed-citation>James, G. M., Paulson, C., &amp; Rusmevichientong,
    P. (2020). Penalized and constrained optimization: An application to
    high-dimensional website advertising. <italic>Journal of the
    American Statistical Association</italic>,
    <italic>115</italic>(529), 107–122.
    <ext-link ext-link-type="uri" xlink:href="https://doi.org/10.1080/01621459.2019.1609970">https://doi.org/10.1080/01621459.2019.1609970</ext-link></mixed-citation>
  </ref>
  <ref id="ref-kelly1956">
    <mixed-citation>Kelly, J. L., Jr. (1956). A new interpretation of
    information rate. <italic>Bell System Technical Journal</italic>,
    <italic>35</italic>(4), 917–926.
    <ext-link ext-link-type="uri" xlink:href="https://doi.org/10.1002/j.1538-7305.1956.tb03809.x">https://doi.org/10.1002/j.1538-7305.1956.tb03809.x</ext-link></mixed-citation>
  </ref>
  <ref id="ref-lawson1974">
    <mixed-citation>Lawson, C. L., &amp; Hanson, R. J. (1974).
    <italic>Solving least squares problems</italic>.
    Prentice-Hall.</mixed-citation>
  </ref>
  <ref id="ref-markowitz1952">
    <mixed-citation>Markowitz, H. M. (1952). Portfolio selection.
    <italic>The Journal of Finance</italic>, <italic>7</italic>(1),
    77–91.
    <ext-link ext-link-type="uri" xlink:href="https://doi.org/10.1111/j.1540-6261.1952.tb01525.x">https://doi.org/10.1111/j.1540-6261.1952.tb01525.x</ext-link></mixed-citation>
  </ref>
  <ref id="ref-markowitz1956">
    <mixed-citation>Markowitz, H. M. (1956). The optimization of a
    quadratic function subject to linear constraints. <italic>Naval
    Research Logistics Quarterly</italic>, <italic>3</italic>(1–2),
    111–133.
    <ext-link ext-link-type="uri" xlink:href="https://doi.org/10.1002/nav.3800030110">https://doi.org/10.1002/nav.3800030110</ext-link></mixed-citation>
  </ref>
  <ref id="ref-osborne2000">
    <mixed-citation>Osborne, M. R., Presnell, B., &amp; Turlach, B. A.
    (2000). A new approach to variable selection in least squares
    problems. <italic>IMA Journal of Numerical Analysis</italic>,
    <italic>20</italic>(3), 389–403.
    <ext-link ext-link-type="uri" xlink:href="https://doi.org/10.1093/imanum/20.3.389">https://doi.org/10.1093/imanum/20.3.389</ext-link></mixed-citation>
  </ref>
  <ref id="ref-sklearn">
    <mixed-citation><named-content content-type="nocase">Pedregosa, F.
    et al.</named-content> (2011). Scikit-learn: Machine learning in
    python. <italic>Journal of Machine Learning Research</italic>,
    <italic>12</italic>, 2825–2830.</mixed-citation>
  </ref>
  <ref id="ref-cvxcla">
    <mixed-citation>Schmelzer, T. (2026). <italic>Cvxcla: The critical
    line algorithm with an operator interface in python</italic>. SSRN
    preprint 7583179.
    <ext-link ext-link-type="uri" xlink:href="https://doi.org/10.2139/ssrn.7583179">https://doi.org/10.2139/ssrn.7583179</ext-link></mixed-citation>
  </ref>
  <ref id="ref-perspective">
    <mixed-citation>Schmelzer, T., &amp; Hastie, T. (2026). <italic>The
    critical line algorithm and the constrained LASSO: One curve, two
    literatures</italic>. arXiv preprint arXiv:2609.25704.
    <ext-link ext-link-type="uri" xlink:href="https://doi.org/10.48550/arXiv.2609.25704">https://doi.org/10.48550/arXiv.2609.25704</ext-link></mixed-citation>
  </ref>
  <ref id="ref-sharpe1964">
    <mixed-citation>Sharpe, W. F. (1964). Capital asset prices: A theory
    of market equilibrium under conditions of risk. <italic>The Journal
    of Finance</italic>, <italic>19</italic>(3), 425–442.
    <ext-link ext-link-type="uri" xlink:href="https://doi.org/10.2307/2977928">https://doi.org/10.2307/2977928</ext-link></mixed-citation>
  </ref>
  <ref id="ref-stellato2020">
    <mixed-citation>Stellato, B., Banjac, G., Goulart, P., Bemporad, A.,
    &amp; Boyd, S. (2020). OSQP: An operator splitting solver for
    quadratic programs. <italic>Mathematical Programming
    Computation</italic>, <italic>12</italic>(4), 637–672.
    <ext-link ext-link-type="uri" xlink:href="https://doi.org/10.1007/s12532-020-00179-2">https://doi.org/10.1007/s12532-020-00179-2</ext-link></mixed-citation>
  </ref>
  <ref id="ref-tibshirani1996">
    <mixed-citation>Tibshirani, R. (1996). Regression shrinkage and
    selection via the lasso. <italic>Journal of the Royal Statistical
    Society, Series B</italic>, <italic>58</italic>(1), 267–288.
    <ext-link ext-link-type="uri" xlink:href="https://doi.org/10.1111/j.2517-6161.1996.tb02080.x">https://doi.org/10.1111/j.2517-6161.1996.tb02080.x</ext-link></mixed-citation>
  </ref>
  <ref id="ref-tobin1958">
    <mixed-citation>Tobin, J. (1958). Liquidity preference as behavior
    towards risk. <italic>The Review of Economic Studies</italic>,
    <italic>25</italic>(2), 65–86.
    <ext-link ext-link-type="uri" xlink:href="https://doi.org/10.2307/2296205">https://doi.org/10.2307/2296205</ext-link></mixed-citation>
  </ref>
</ref-list>
</back>
</article>
