Skip to content

Latest commit

 

History

History
70 lines (53 loc) · 3.25 KB

File metadata and controls

70 lines (53 loc) · 3.25 KB

Portfolio construction and risk module

Goal

Convert noisy stock rankings into a diversified, low-turnover portfolio. The validated v4 policy uses the model for stock selection and equal weights for sizing; raw model scores are not treated as expected returns.

How it works

  • sparse_rank.py selects a limited number of highly ranked securities with sector constraints.
  • hold_zone.py retains existing names until they cross a wider exit boundary, protecting young positions for a minimum holding period.
  • active_tilts.py supports bounded tilts but these are disabled in frozen v4 because they added little value in development.
  • factor_covariance.py and risk_model.py estimate shrunk covariance and factor risk.
  • optimizer.py contains the legacy CVaR-aware optimizer.
  • sleeve_allocator.py combines directional, pair, and cash sleeves when their activation rules permit it. The pair sleeve currently has zero weight.

Frozen v4 policy

  • 40 holdings.
  • 70% invested, 30% cash.
  • Equal weight among selected names.
  • Rank-200 exit boundary.
  • 26-week minimum holding period.
  • 1% minimum optional trade size.
  • Maximum 25% of selected names per sector.
  • No bounded active tilts and no pair sleeve.

Current achievement and performance

The frozen transparent 120-name universe test was fully invested and beat sector-matched random subsets, but it trailed the full eligible equal-weight universe by 6.57 annualized percentage points and raised weekly turnover to 28.11%. It failed four of five gates and remains inactive.

Result CAGR Sharpe Volatility Max drawdown Weekly turnover
V4 development 12.19% 0.71 18.67% -27.40% 4.94%
V4 public confirmation 11.34% 1.11 10.19% -5.73% 5.43%

Development turnover fell from 96.9% in sparse v3 to 4.94% in v4. Equal weighting beat inverse volatility and factor-minimum-variance sizing by net Sharpe on the same development selections. However, the public confirmation portfolio did not statistically distinguish itself from the exposure-matched SPY benchmark.

Sharpe-ratio interpretation

Sharpe is an evaluation metric, not the sole optimization objective. A higher historical Sharpe can result from cash exposure, volatility suppression, or overfitting. Every Sharpe comparison must therefore report exposure, costs, drawdown, benchmark, sample dates, and shuffled controls.

Limitations and next work

  • Equal weight is robust but ignores forecast confidence and heterogeneous risk.
  • The 26-week protection rule can retain deteriorating names.
  • Current factor risk uses sector proxies rather than a full commercial factor model.
  • Medium-term universe characteristics were negatively aligned with the five-session target. A future selector needs a slower target and monthly or quarterly entry/exit bands.
  • Test volatility targeting and crisis defenses only under a newly frozen contract.
  • Do not alter v4 based on the observed 2024 through 2025 Q1 confirmation period.

Related documentation