{"id":31727246,"url":"https://github.com/andrecamatta/pq_mincvar","last_synced_at":"2025-10-09T06:19:41.197Z","repository":{"id":317613093,"uuid":"1068133451","full_name":"andrecamatta/pq_mincvar","owner":"andrecamatta","description":"Min-CVaR Portfolio Optimization with Robust Estimators (LW, Huber, Tyler) - Backtest de 36 estratégias em 16 ETFs (15 anos)","archived":false,"fork":false,"pushed_at":"2025-10-01T23:06:40.000Z","size":932,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2025-10-02T01:09:58.183Z","etag":null,"topics":["backtesting","cvar","julia","min-variance","portfolio-optimization","quantitative-finance","risk-management","robust-statistics"],"latest_commit_sha":null,"homepage":null,"language":"Julia","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/andrecamatta.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-10-01T22:54:26.000Z","updated_at":"2025-10-01T23:06:44.000Z","dependencies_parsed_at":"2025-10-02T01:10:00.097Z","dependency_job_id":"7c08543a-5fc9-4970-bc3c-60e09e939b86","html_url":"https://github.com/andrecamatta/pq_mincvar","commit_stats":null,"previous_names":["andrecamatta/pq_mincvar"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/andrecamatta/pq_mincvar","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/andrecamatta%2Fpq_mincvar","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/andrecamatta%2Fpq_mincvar/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/andrecamatta%2Fpq_mincvar/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/andrecamatta%2Fpq_mincvar/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/andrecamatta","download_url":"https://codeload.github.com/andrecamatta/pq_mincvar/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/andrecamatta%2Fpq_mincvar/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":279000852,"owners_count":26082950,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-10-09T02:00:07.460Z","response_time":59,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["backtesting","cvar","julia","min-variance","portfolio-optimization","quantitative-finance","risk-management","robust-statistics"],"created_at":"2025-10-09T06:19:39.463Z","updated_at":"2025-10-09T06:19:41.191Z","avatar_url":"https://github.com/andrecamatta.png","language":"Julia","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Min-CVaR with Robust Estimators\n\n## Summary\n\nThis project implements and backtests portfolio optimization strategies comparing:\n- **Min-CVaR** (Conditional Value-at-Risk) optimization using Rockafellar-Uryasev formulation\n- **Min-Var** (Minimum Variance) optimization\n\nWith three robust covariance estimators:\n- **:LW** - Ledoit-Wolf / Oracle Approximating Shrinkage (OAS)\n- **:HUBER** - Huber M-estimator for mean + OAS covariance\n- **:TYLER** - Tyler M-estimator for scatter + shrinkage\n\n## Universe\n\n**Final Assets (16):** [\"SPY\", \"IWD\", \"IWF\", \"IWM\", \"EFA\", \"EEM\", \"VWO\", \"TLT\", \"IEF\", \"LQD\", \"HYG\", \"GLD\", \"SLV\", \"VNQ\", \"DBC\", \"USO\"]\n\n**Period:** 2007-04-12 to 2025-10-03\n\n**Filter:** ETFs with ≥ 15 years of history\n\n## Parameters\n\n- **Estimation window:** 756 days (~3 years)\n- **Rebalance policies:** Monthly, Bands (2%, 5%, 10%)\n- **Transaction costs:** 6.0 bps per side\n- **Position limit:** 30% per asset\n- **CVaR confidence levels:** α = [0.95, 0.99]\n- **Lambda (turnover penalty):** [0.0, 0.0003, 0.001] - Grid search hyperparameter\n\n## Hiperparâmetros Testados\n\nO grid search avaliou 60 configurações estratégicas testando três valores de penalização de turnover (lambda: 0,0, 0,0003, 0,001) combinados com dois métodos de otimização (MINVAR e MINCVAR), três estimadores robustos de covariância (Ledoit-Wolf, Huber, Tyler), dois níveis de confiança para CVaR (α=95%, 99%), e quatro políticas de rebalanceamento (mensal e bandas de 2%, 5%, 10%). MINCVAR, sendo não-paramétrico, utilizou apenas o estimador Ledoit-Wolf, resultando em 24 backtests. MINVAR, paramétrico e dependente da matriz de covariância, testou os três estimadores em 36 backtests, totalizando 60 estratégias avaliadas contra benchmark equal-weight.\n\n## Resultados\n\n### Tail Diagnostics (Multivariate t-distribution)\n- LW: ν = 15\n- TYLER: ν = 15\n- HUBER: ν = 15\n\n### Performance Metrics\n\nSee `results/metrics.csv` for detailed metrics including:\n- Annualized return and volatility\n- Sharpe and Sortino ratios\n- VaR and CVaR at 95% and 99% confidence levels\n- Maximum drawdown and Ulcer index\n- Annualized turnover and number of rebalances\n- Lambda (turnover penalty) hyperparameter\n\n### Best Strategies\n\n**Melhor Sharpe Ratio:**\n- **TYLER-MINVAR** (BANDS 10%, λ=0.0003)\n- Sharpe: 0.576 | Retorno: 5.92% a.a. | Volatilidade: 7.11%\n- Max Drawdown: 23.79% | Turnover: 7.26% a.a.\n- Rebalanceamentos: 1 em 18.5 anos\n\n**Melhor Drawdown (menor):**\n- **LW-MINVAR** (BANDS 5%, λ=0.0)\n- Sharpe: 0.523 | Retorno: 4.96% a.a. | Volatilidade: 6.01%\n- Max Drawdown: 15.74% | Turnover: 25.88% a.a.\n- Rebalanceamentos: 16\n\n**Benchmark (Equal-Weight):**\n- Sharpe: 0.218 | Max Drawdown: 44.60%\n\n### Análise dos Resultados\n\nO backtest com grid search de lambda demonstrou a superioridade das estratégias otimizadas sobre o benchmark passivo. A estratégia TYLER-MINVAR com política BANDS-2% e lambda 0,0003 dominou em termos de retorno ajustado ao risco, alcançando Sharpe de 0,576 (2,6× superior ao benchmark de 0,218). Esta configuração entregou retorno anualizado de 5,92% com volatilidade de apenas 7,11% e turnover extremamente baixo de 7,26% anual.\n\nO sucesso do estimador Tyler decorre de sua robustez a outliers, capturando melhor a estrutura de covariância durante crises. A penalização de turnover (lambda) revelou-se hiperparâmetro crucial: MINVAR maximizou performance com lambda 0,0003 (equilíbrio entre adaptação e custos), enquanto MINCVAR preferiu lambda 0,001 (maior penalização). Sem penalização (lambda 0), estratégias sofreram overtrading severo com turnover de 25-57% anual, degradando Sharpe médio de 0,50 para 0,44-0,48.\n\nPara investidores avessos a perdas extremas, a LW-MINVAR com política BANDS-5% e lambda 0,0 ofereceu proteção superior, limitando o drawdown máximo a apenas 15,74%, substancialmente inferior aos 23,79% da melhor estratégia Sharpe e drasticamente abaixo dos 44,60% do benchmark. Esta estratégia manteve Sharpe competitivo de 0,523 com CVaR-95% de apenas 0,91%, demonstrando que banda intermediária (5%) e livre adaptação (lambda 0) equilibram proteção e desempenho.\n\nO benchmark equal-weight buy-and-hold foi sistematicamente superado: sofreu 2× mais volatilidade (13,3% vs 6-7%), produziu Sharpe 2,6× inferior, e experimentou drawdowns superiores a 44%. As políticas de rebalanceamento por bands (2-10%) provaram-se cruciais, reduzindo drasticamente turnover enquanto preservavam performance. A estratégia vencedora realizou apenas 1 rebalanceamento em 18,5 anos, evidência de que otimização robusta com penalização adequada maximiza eficiência.\n\n### Comparação das Melhores Estratégias\n\nAs duas estratégias líderes (uma em Sharpe Ratio e outra em menor max drawdown) revelam filosofias distintas de gestão de risco.\n\nA TYLER-MINVAR BANDS-2% (Sharpe 0,576, lambda 0,0003) demonstrou estabilidade excepcional com apenas um rebalanceamento em 18,5 anos, mantendo alocação constante de 78% em renda fixa (principalmente IEF 30%, LQD 22%, HYG 18%), 13% em ações (IWF, SPY) e 9% em diversificadores (ouro e commodities). Esta configuração quasi-estática atravessou três crises sem ajustes, beneficiando-se da penalização de turnover que impediu movimentações desnecessárias.\n\nJá a LW-MINVAR BANDS-5% (drawdown 15,74%, lambda 0,0) adotou postura defensiva com livre adaptação, realizando 16 rebalanceamentos ao longo do período. Com lambda zero, a estratégia adaptou-se dinamicamente aos regimes de mercado, mantendo turnover de 25,88% anual. Reduziu drawdown em 34% comparado à melhor Sharpe (15,74% vs 23,79%), sacrificando 0,96 pontos de Sharpe (0,523 vs 0,576).\n\nSurpreendentemente, MINCVAR não liderou em drawdown apesar de otimizar diretamente perdas extremas na cauda. A explicação reside na natureza retrospectiva do CVaR: MINCVAR usa cenários históricos da janela de estimação (756 dias), mas drawdowns máximos ocorrem em eventos extremos fora-da-amostra não capturados nessa janela. MINVAR, ao minimizar variância global com estimadores robustos, produz alocações mais conservadoras e estáveis que acidentalmente protegem melhor contra drawdowns futuros.\n\n| Métrica | Melhor Sharpe (TYLER-MINVAR) | Melhor Drawdown (LW-MINVAR) |\n|---------|------------------------------|------------------------------|\n| **Sharpe** | **0.576** | 0.523 |\n| **Lambda** | 0.0003 | 0.0 |\n| **MDD** | 23.79% | **15.74%** |\n| **Retorno** | **5.92%** | 4.96% |\n| **Volatilidade** | 7.11% | **6.01%** |\n| **CVaR 95%** | 1.09% | **0.91%** |\n| **Turnover** | **7.26%** | 25.88% |\n| **Drag (custos)** | **0.44%** | 1.55% |\n| **Rebalanceamentos** | **1** | 16 |\n\n## Interpretation\n\n- **Lambda como hiperparâmetro** é crucial: MINVAR ótimo com λ=0.0003, MINCVAR com λ=0.001\n- **Tyler estimator** domina em Sharpe Ratio, capturando melhor estrutura de covariância robusta\n- **Band policies** eliminam overtrading: BANDS-2/5/10% \u003e\u003e MONTHLY\n- **Grid search validou** que penalização diferenciada por estratégia maximiza performance\n- **Trade-off Sharpe vs Drawdown**: Proteção adicional (15.74% vs 23.79%) custa 1.11% a.a. em drag\n- **MINVAR surpreendentemente** lidera em drawdown (não MINCVAR), devido a generalização out-of-sample\n- **Transaction costs** materialmente impactam: turnover 3.6× maior degrada performance mesmo com Sharpe similar\n\n## Files\n\n- `results/metrics.csv` - Comprehensive performance metrics\n- `results/weights_*.csv` - Portfolio weights over time\n- `fig/` - Visualizations (wealth curves, frontiers, allocation, tail losses)\n\n## Reproducibility\n\n**Julia version:** 1.11.7\n\n**Packages:** See `Project.toml`\n\n**Random seed:** Not used (deterministic optimization)\n\n**Execution:** `julia main.jl`\n\n---\n\nGenerated on 2025-10-06T08:51:30.192\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fandrecamatta%2Fpq_mincvar","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fandrecamatta%2Fpq_mincvar","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fandrecamatta%2Fpq_mincvar/lists"}