strategynet.ai
strategynet.ai — Insights
Combining Short- and Long-Horizon Risk Models · Published 2026-07-20
researchDeep dive

Combining Short- and Long-Horizon Risk Models

Short- and long-horizon risk models over the same holdings can be combined by putting them in a common asset order, aligning their return and annualization conventions, and estimating a weight from information available before each portfolio decision. The weight still has to earn its place. In this walk-forward study, neither a calibration-selected fixed weight nor a slowly changing weight improved realized portfolio risk relative to a simple equal covariance blend.

Separate limits under both covariance matrices produced the strongest risk control in the sample. Realized volatility was 10.30% with separate limits, compared with 10.93% for the equal blend and 10.97% for the changing weight; maximum drawdown fell to 19.98% from 22.29% and 22.80%, respectively. These are gross results from one eight-factor panel and sixteen reporting rebalances, so they support a measured conclusion: model disagreement was more useful as a constraint in this period than as an estimated averaging weight.

The common-universe combination

Let \(\Sigma_{S,t}\) be a short-window covariance and \(\Sigma_{L,t}\) a long-window covariance available at rebalance \(t\). Both matrices describe the same \(N\) factor returns in the same order and daily units. A convex combination is

\[\Sigma_t(\lambda_t) = (1-\lambda_t)\Sigma_{S,t} + \lambda_t\Sigma_{L,t}, \qquad 0\leq\lambda_t\leq1.\]

The parameter \(\lambda_t\) is the weight on the 126-observation model in this article. Zero uses only the 42-observation covariance, one uses only the longer history, and \(\lambda_t=0.5\) gives both matrices equal weight. Positive semidefiniteness is preserved because the weights are non-negative and sum to one.

For any fixed portfolio \(w\), the predicted variance is linear in the model weight:

\[w^{\mathsf T}\Sigma_t(\lambda_t)w = (1-\lambda_t)w^{\mathsf T}\Sigma_{S,t}w + \lambda_t w^{\mathsf T}\Sigma_{L,t}w.\]

Volatility follows after taking the square root. A 50% covariance blend does not imply the arithmetic average of the two volatility forecasts.

A two-asset calculation

Suppose the short and long models estimate annual covariance as

\[\Sigma_S= \begin{bmatrix} 0.0400 & 0.0180\\ 0.0180 & 0.0225 \end{bmatrix}, \qquad \Sigma_L= \begin{bmatrix} 0.0225 & 0.0090\\ 0.0090 & 0.0169 \end{bmatrix}.\]

With 35% on the long model,

\[\Sigma(0.35) =0.65\Sigma_S+0.35\Sigma_L = \begin{bmatrix} 0.033875 & 0.014850\\ 0.014850 & 0.020540 \end{bmatrix}.\]

For \(w=(0.5,0.5)^{\mathsf T}\), the short and long models forecast 15.69% and 11.98% volatility. The combined variance is

\[w^{\mathsf T}\Sigma(0.35)w =0.65(0.024625)+0.35(0.014350) =0.02102875,\]

which gives 14.50% volatility. Directly averaging the two volatility figures would give 14.39%, a different quantity.

import numpy as np

def combine_covariances(short_cov, long_cov, long_weight):
    if not 0.0 <= long_weight <= 1.0:
        raise ValueError("long_weight must lie in [0, 1]")
    combined = (
        (1.0 - long_weight) * short_cov
        + long_weight * long_cov
    )
    return 0.5 * (combined + combined.T)

def predicted_volatility(weight, covariance):
    variance = weight @ covariance @ weight
    return np.sqrt(max(float(variance), 0.0))

A constructive allocation example

To see the portfolio effect without tying the calculation to one historical period, consider three investable factors with annual expected returns of 12%, 9%, and 7%. Suppose their short-window covariance is

\[\Sigma_S= \begin{bmatrix} 0.0400 & 0.0120 & 0.0060\\ 0.0120 & 0.0225 & 0.0045\\ 0.0060 & 0.0045 & 0.0144 \end{bmatrix},\]

while the longer estimate is

\[\Sigma_L= \begin{bmatrix} 0.0256 & 0.0080 & 0.0040\\ 0.0080 & 0.0196 & 0.0035\\ 0.0040 & 0.0035 & 0.0121 \end{bmatrix}.\]

For a fully invested minimum-variance allocation, with short sales allowed in the formula but unnecessary in this example,

\[w^*(\Sigma) = \frac{\Sigma^{-1}\mathbf 1} {\mathbf 1^{\mathsf T}\Sigma^{-1}\mathbf 1}.\]

Illustrative minimum-variance allocations

Covariance usedFactor weightsExpected returnPredicted volatility
Short model8.3%, 30.8%, 61.0%8.03%10.32%
Long model16.0%, 26.7%, 57.4%8.33%9.23%
def minimum_variance(covariance):
    one = np.ones(covariance.shape[0])
    precision_times_one = np.linalg.solve(covariance, one)
    return precision_times_one / (one @ precision_times_one)

pooled = combine_covariances(short_cov, long_cov, 0.35)
weight = minimum_variance(pooled)
expected_return = weight @ np.array([0.12, 0.09, 0.07])

The positive expected returns make the example resemble a portfolio a user might consider deploying, and they are assumptions supplied solely for this calculation. The pooled covariance changes the risk estimate and, through that estimate, the allocation. This distinction matters when a historical factor panel has a poor return period: covariance quality can still be evaluated, but a risk model should receive neither credit nor blame for an expected-return forecast supplied elsewhere in the process.

How the weight was learned

Every candidate covariance was scored on returns observed after the covariance date. If \(r_{u}\) is an \(N\)-factor return vector in the next holding interval, the zero-mean Gaussian negative log predictive density is

\[\ell_u(\lambda) = \frac{1}{2} \left[ N\log(2\pi) +\log|\Sigma_t(\lambda)| +r_u^{\mathsf T}\Sigma_t(\lambda)^{-1}r_u \right].\]

Lower values indicate a better density forecast. The static weight was chosen once from a grid \(\{0,0.05,\ldots,1\}\) using only the six completed calibration intervals:

\[\widehat\lambda_{\mathrm{static}} = \arg\min_{\lambda} \frac{\sum_{j=1}^{6}n_j\overline\ell_j(\lambda)} {\sum_{j=1}^{6}n_j},\]

where \(n_j\) is the number of daily observations in interval \(j\). This selected \(\widehat\lambda_{\mathrm{static}}=0.35\) under the Gaussian score.

A Student-\(t\) density with five degrees of freedom was retained as a heavy-tailed diagnostic. It selected \(\lambda=0.70\) from exactly the same calibration observations. That 35-percentage-point difference is important: an estimated model weight inherits the assumptions of the scoring distribution and should not be presented as though the data identified one unambiguous number.

The changing weight

At each reporting rebalance, the dynamic method rescored the grid using only holding intervals that had already ended. Older intervals received an exponentially declining weight with a six-rebalance half-life, and a quadratic penalty discouraged movement away from the previous model weight:

\[\widehat\lambda_t = \arg\min_{\lambda} \left\{ \widetilde L_t(\lambda) + \gamma(\lambda-\widehat\lambda_{t-1})^2 \right\}, \qquad \gamma=1.\]

Here \(\widetilde L_t\) is the discounted mean Gaussian score, normalized by its cross-grid standard deviation at that decision date. A move across the full 0–1 weight range therefore costs one cross-grid score standard deviation. The penalty regulates changes in the risk-model weight; it is distinct from a portfolio turnover penalty on the factor holdings.

def choose_dynamic_weight(score_history, previous, grid, gamma=1.0):
    # score_history contains completed holding intervals only
    ages = np.arange(len(score_history) - 1, -1, -1)
    discount = 0.5 ** (ages / 6.0)
    score = np.average(score_history, axis=0, weights=discount)
    scale = max(float(np.std(score)), 1e-12)
    normalized = (score - score.min()) / scale
    objective = normalized + gamma * (grid - previous) ** 2
    return float(grid[np.argmin(objective)])

The reporting weight averaged 0.344, close to the static estimate, but its path ranged from 0.05 to 0.60. Its mean absolute change was 0.08 per rebalance.

The long-window covariance weight changes from 0.30 in April 2025 to a low of 0.05 in September 2025 and rises to 0.60 by July 2026. Horizontal lines show the static weight of 0.35 and equal weight of 0.50.The long-window covariance weight changes from 0.30 in April 2025 to a low of 0.05 in September 2025 and rises to 0.60 by July 2026. Horizontal lines show the static weight of 0.35 and equal weight of 0.50.
The changing rule favored the responsive covariance in late 2025, then moved progressively toward the longer model during 2026.

The portfolio experiment

The factor panel is the same predefined panel used in the preceding multiple-risk-model study: eight registered long-short factor spreads covering momentum, reversal, volatility, intraday price relationships, and a technical composite. The common history runs from 3 April 2024 through 16 July 2026, with average daily security coverage between about 1,310 and 1,342 names.

Covariances used 25% diagonal shrinkage. Expected factor returns came from the previous 63 observations, portfolios were recomputed every 21 common observations, weights were non-negative and fully invested, and no factor could exceed 35%. A pooled covariance limit was set at 110% of contemporaneous equal-weight risk under that covariance. The separate-limit control applied the same relative calculation independently to the short and long matrices.

Six rebalances from October 2024 through March 2025 formed the calibration period. The reporting sample begins on 7 April 2025 and contains 320 daily observations across sixteen rebalances. Every forecast, covariance, model weight, and portfolio weight stops before the return it is evaluated against.

Historical risk outcomes

Walk-forward risk results, gross of transaction costs

Risk-model constructionAnnualized volatilityMaximum drawdownMean one-way turnover
42-observation covariance11.01%22.42%41.64%
126-observation covariance10.93%21.89%39.95%
Equal covariance blend10.93%22.29%40.31%
Gaussian calibration weight, 0.35 long10.97%22.51%40.83%
Changing Gaussian score weight10.97%22.80%40.88%

The pooled methods formed a tight cluster. Their annualized volatility ranged from 10.93% to 11.01%, while mean one-way turnover ranged from 39.95% to 41.64%. Learning a covariance weight did not produce a lower-risk portfolio: the fixed 0.35 rule and the changing rule both recorded 10.97% volatility, and the latter had the largest drawdown among the six constructions.

The predictive scores tell a compatible story. During the reporting period, the Gaussian score reached its minimum at \(\lambda=0.50\); the weight chosen from calibration, \(0.35\), produced a slightly worse mean score of -24.141 against -24.154 for the equal blend. The dynamic path scored -24.109. The numbers are negative because return covariances in daily units create densities greater than one. Their relative values carry the interpretation.

The calibration Gaussian score is minimized near a long-model weight of 0.35, while the reporting score is minimized at 0.50. A second panel shows similar turnover and volatility among pooled methods, with separate limits clearly below them in realized volatility.The calibration Gaussian score is minimized near a long-model weight of 0.35, while the reporting score is minimized at 0.50. A second panel shows similar turnover and volatility among pooled methods, with separate limits clearly below them in realized volatility.
The calibration optimum moved out of sample, and small predictive-score differences did not translate into a lower-risk learned-weight portfolio.

Forecast calibration and the separate-limit result

For each holding interval, the study compared squared realized portfolio returns with the variance forecast available at the preceding rebalance. A volatility-calibration ratio of one means that aggregate realized root-mean- square return matched predicted volatility; values above one indicate underprediction.

The short model's ratio was 1.044, the equal blend's 1.067, and the long model's 1.105. Recent covariance therefore tracked the scale better in this sample, even though using it alone did not produce the portfolio with the lowest realized volatility. The selected holdings and the covariance's density fit are related, but they are not the same evaluation object.

The dual construction has no single pooled covariance, so assigning it a Gaussian density score would invent a model that the optimizer never used. Its calibration diagnostic instead takes the greater of the short- and long-model variance forecasts for the chosen portfolio; the resulting volatility ratio was 0.982. Both named limits remained available to explain why a holding was accepted or rejected.

This approach reduced realized volatility by 0.63 percentage point relative to the long model and the equal blend, with essentially unchanged turnover. The trailing expected-return rule used by the historical experiment failed during the reporting period: annualized gross returns ranged from -17.91% to -15.66% across the six methods. That adverse outcome is retained in the record because removing it would overstate the evidence, although it is secondary to the risk question tested here. The result supports a risk-control comparison and no positive expected-return claim.

Why the learned weight failed to improve this portfolio

Only six calibration rebalances were available, and the disagreement between Gaussian and Student-\(t\) selection shows that the apparent optimum was not stable across plausible predictive distributions. The Gaussian surface was also fairly shallow near its minimum; small changes in score moved the selected grid point without supplying a correspondingly large change in portfolio risk.

Portfolio constraints further weaken the connection between matrix fit and realized risk. Position caps, the expected-return vector, and the relative risk limit determine which covariance directions the optimizer actually uses. A matrix can improve average density fit while making little difference along the directions carried by the selected portfolio. Recent decision-focused covariance research addresses this problem directly by training or validating estimators against the portfolio decision, although that extra flexibility requires a larger, carefully nested sample.

The dynamic penalty sensitivity did not reverse the result. Penalties of 0.25, 1, and 4 produced annualized volatility of 10.94%, 10.97%, and 10.96%; their maximum drawdowns were 22.41%, 22.80%, and 23.03%. In this sample, a smoother or more responsive model-weight path could not match the protection supplied by two explicit limits.

Common implementation mistakes

Selecting the weight on the reporting period

The reporting-period Gaussian optimum was 0.50, but it is an oracle diagnostic. Using it as though it had been known on 7 April 2025 would leak future returns into every subsequent portfolio.

Combining different units or asset orders

Daily covariance cannot be averaged with an annualized matrix, and columns must be reconciled by stable factor or security identifiers. Matching row numbers or display labels is insufficient.

Treating the scoring rule as a neutral detail

Gaussian and five-degree-of-freedom Student-\(t\) scores selected 0.35 and 0.70 from the same calibration sample. Distributional assumptions belong in the reported method and sensitivity analysis.

Letting the dynamic rule chase the latest interval

Short performance histories can generate sharp weight changes from noise. A forgetting schedule, change penalty, weight bounds, minimum history, and a fixed control should be declared before the reporting results are examined.

Assuming a pooled limit preserves both component limits

Low modeled risk under one covariance can offset high risk under the other. When each model represents a limit that must be honored, apply both constraints and record their slack separately.

Ranking matrices without evaluating the downstream portfolio

Predictive density, covariance-element loss, condition number, variance calibration, realized portfolio volatility, drawdown, concentration, and turnover answer different questions. The validation set should include the ones that match the model's intended use.

Relationship to adjacent methods

This experiment uses arithmetic covariance pooling, which preserves positive semidefiniteness and gives a transparent interpretation to \(\lambda\). Precision pooling averages inverse covariances, while log-Euclidean and Bures–Wasserstein means use different geometry on positive-definite matrices. Those constructions can be tested later, but a mathematically elegant average still needs a portfolio-aligned validation loss.

Covariance shrinkageCovariance shrinkageThe combination of a responsive covariance estimate with a more stable target to reduce estimation error and improve numerical conditioning.Open glossary entry → is closely related. The short model can be read as a responsive estimate and the long model as a target, although both covariances here already receive diagonal shrinkage before they are combined. Multiple-target shrinkage extends the same idea to several matrices.

Separate limits retain disagreement instead of reducing it to one matrix. That can be valuable when a recent statistical estimate, a long-run model, and a fundamental or stress model express risks that the mandate wants to monitor individually. It also makes the cost visible: every added constraint can reduce forecast exposure or render the feasible set too restrictive.

How this enters portfolio evaluation

A deployable risk-model combination should store the short and long covariance versions, the selected weight, every completed score used in selection, the previous weight, the change penalty, and the resulting portfolio-risk forecast. The portfolio record should retain the fixed-weight and separate-limit controls alongside realized variance, drawdown, concentration, and holdings turnover.

The present evidence does not justify replacing the separate-limit control with learned covariance weights. A larger nested study can add multiple factor panels and market regimes, tune the score and change penalty inside an inner validation loop, then test the frozen rule in an untouched outer period. Transaction costs remain outside this experiment and must be included before a method with materially different holdings turnover is considered operational.

Frequently asked questions

Should short- and long-window covariances always receive equal weight?

No. Equal weighting is a strong control because it uses no estimated model weight, and it performed well on predictive score in this sample. A different weight may be supported by a longer nested history or by a model designed for a specific decision.

Why not update the weight every day?

The covariance and portfolio were evaluated on 21-observation holding intervals. Daily weight updates would create a different experiment with more overlapping feedback, greater estimation noise, and potentially much more trading.

Is the Student-\(t\) selection preferable because financial returns have heavy tails?

It is a plausible diagnostic, but its degrees of freedom, scale convention, and portfolio consequence still require out-of-sample validation. Here it revealed that the calibration weight was sensitive to the assumed density.

Can the models use different factors or symbols?

A direct matrix average requires a common ordered universe. Partial overlap needs an explicit transfer calibration with held-out shared symbols, while disjoint universes require synchronized bridge factors or another identified source of cross-block covariance.

Did the changing weight reduce portfolio turnover?

No. Mean one-way holdings turnover was 40.88%, compared with 40.31% for the equal blend and 39.95% for the long model. The rule penalized changes in the covariance weight; it did not place transaction costs in the allocation objective.

Continue reading

Sources

This walkthrough is for research and educational purposes. It illustrates how strategynet.ai organizes signal evidence into factors and scenarios. It provides no recommendation, investment advice, or instruction to trade any security.

Back to Insights