| """ |
| api_config_patch.py — drop-in replacements for the /api/config/* endpoints. |
| |
| Replace the existing /api/config/objectives and /api/config/presets route |
| handlers in api.py with these functions. |
| """ |
|
|
| |
| OBJECTIVES_CONFIG = { |
| "equal_weight": { |
| "label": "Equal Weight", |
| "description": "1/N — equal allocation across all assets", |
| "paper": "Benchmark baseline", |
| "family": "classical", |
| "fast": True, |
| "papers": [ |
| {"citation": "Benchmark baseline (no single canonical paper)"}, |
| ], |
| "notebooks": [], |
| "code_refs": [ |
| {"path": "methods/equal_weight.py", "label": "equal_weight"}, |
| {"path": "core/optimizers/equal_weight.py", "label": "optimizer wrapper"}, |
| ], |
| }, |
| "markowitz": { |
| "label": "Markowitz Max-Sharpe", |
| "description": "Maximum Sharpe Ratio via SLSQP with multi-start", |
| "paper": "Markowitz (1952)", |
| "family": "classical", |
| "fast": True, |
| "papers": [ |
| { |
| "title": "Portfolio Selection", |
| "citation": "Markowitz (1952)", |
| "url": "https://www.jstor.org/stable/2975974", |
| }, |
| ], |
| "notebooks": [], |
| "code_refs": [ |
| {"path": "methods/markowitz.py", "label": "markowitz_max_sharpe"}, |
| {"path": "core/optimizers/markowitz.py", "label": "optimizer wrapper"}, |
| ], |
| }, |
| "min_variance": { |
| "label": "Minimum Variance", |
| "description": "Global minimum-variance portfolio", |
| "paper": "Markowitz (1952)", |
| "family": "classical", |
| "fast": True, |
| "papers": [ |
| { |
| "title": "Portfolio Selection", |
| "citation": "Markowitz (1952)", |
| "url": "https://www.jstor.org/stable/2975974", |
| }, |
| ], |
| "notebooks": [], |
| "code_refs": [ |
| {"path": "methods/markowitz.py", "label": "min_variance"}, |
| {"path": "core/optimizers/markowitz.py", "label": "optimizer wrapper"}, |
| ], |
| }, |
| "hrp": { |
| "label": "HRP", |
| "description": "Hierarchical Risk Parity via recursive bisection", |
| "paper": "López de Prado (2016)", |
| "family": "classical", |
| "fast": True, |
| "papers": [ |
| { |
| "title": "Building diversified portfolios that outperform out of sample", |
| "citation": "López de Prado (2016)", |
| "url": "https://papers.ssrn.com/sol3/papers.cfm?abstract_id=2708678", |
| }, |
| ], |
| "notebooks": [], |
| "code_refs": [ |
| {"path": "methods/hrp.py", "label": "hrp_weights"}, |
| {"path": "core/optimizers/hrp.py", "label": "optimizer wrapper"}, |
| ], |
| }, |
| "target_return": { |
| "label": "Target Return", |
| "description": "Minimum-variance portfolio achieving a specified return", |
| "paper": "Markowitz (1952)", |
| "family": "classical", |
| "fast": True, |
| "papers": [ |
| { |
| "title": "Portfolio Selection", |
| "citation": "Markowitz (1952)", |
| "url": "https://www.jstor.org/stable/2975974", |
| }, |
| ], |
| "notebooks": [], |
| "code_refs": [ |
| {"path": "methods/markowitz.py", "label": "target_return_frontier"}, |
| {"path": "core/optimizers/markowitz.py", "label": "optimizer wrapper"}, |
| ], |
| }, |
| "hybrid": { |
| "label": "Hybrid Pipeline", |
| "description": "3-stage: IC screening → QUBO-SA selection → Markowitz allocation", |
| "paper": "Buonaiuto/Springer 2025, Herman/arXiv 2025", |
| "family": "hybrid", |
| "fast": False, |
| "papers": [ |
| { |
| "citation": "Buonaiuto et al., Springer (2025); Herman et al. arXiv (2025)", |
| }, |
| ], |
| "notebooks": [ |
| { |
| "path": "notebooks/05_hybrid_pipeline_grand_comparison.ipynb", |
| "title": "Hybrid pipeline — grand comparison", |
| }, |
| ], |
| "code_refs": [ |
| {"path": "methods/hybrid_pipeline.py", "label": "hybrid_pipeline_weights"}, |
| {"path": "core/optimizers/hybrid_pipeline.py", "label": "optimizer wrapper"}, |
| ], |
| }, |
| "qubo_sa": { |
| "label": "QUBO + Simulated Annealing", |
| "description": "Binary asset selection via QUBO solved with SA (D-Wave proxy)", |
| "paper": "Orús et al. (2019) arXiv:1811.03975", |
| "family": "quantum", |
| "fast": False, |
| "papers": [ |
| { |
| "title": "Quantum computing for finance: Overview and prospects", |
| "citation": "Orús et al. (2019)", |
| "url": "https://arxiv.org/abs/1811.03975", |
| }, |
| ], |
| "notebooks": [ |
| { |
| "path": "notebooks/04_qubo_vqe_portfolio.ipynb", |
| "title": "QUBO & VQE portfolio", |
| }, |
| ], |
| "code_refs": [ |
| {"path": "methods/qubo_sa.py", "label": "qubo_sa_weights"}, |
| {"path": "core/optimizers/qubo_sa.py", "label": "optimizer wrapper"}, |
| ], |
| }, |
| "vqe": { |
| "label": "VQE (PauliTwoDesign)", |
| "description": "Variational Quantum Eigensolver with noise-robust ansatz", |
| "paper": "Scientific Reports (2023)", |
| "family": "quantum", |
| "fast": False, |
| "papers": [ |
| {"citation": "See implementation notes in methods/vqe.py"}, |
| ], |
| "notebooks": [ |
| { |
| "path": "notebooks/04_qubo_vqe_portfolio.ipynb", |
| "title": "QUBO & VQE portfolio", |
| }, |
| { |
| "path": "notebooks/03_quantum_risk_option_pricing.ipynb", |
| "title": "Quantum risk / option pricing (related)", |
| }, |
| ], |
| "code_refs": [ |
| {"path": "methods/vqe.py", "label": "vqe_weights"}, |
| {"path": "core/optimizers/vqe.py", "label": "optimizer wrapper"}, |
| ], |
| }, |
| } |
|
|
| PRESETS_CONFIG = { |
| "default": { |
| "label": "Balanced · Hybrid", |
| "description": "3-stage hybrid (screen → QUBO select → allocate). Good default for exploration.", |
| "objective": "hybrid", |
| "weight_min": 0.005, |
| "weight_max": 0.30, |
| "K_screen": None, |
| "K_select": None, |
| }, |
| "classical": { |
| "label": "Classical · Max Sharpe", |
| "description": "Markowitz max-Sharpe (SLSQP). Stable when covariance is well behaved.", |
| "objective": "markowitz", |
| "weight_min": 0.005, |
| "weight_max": 0.30, |
| }, |
| "conservative": { |
| "label": "Defensive · Min variance", |
| "description": "Global minimum-variance; prioritize capital preservation over return.", |
| "objective": "min_variance", |
| "weight_min": 0.005, |
| "weight_max": 0.20, |
| }, |
| "diversified": { |
| "label": "Diversified · HRP", |
| "description": "Hierarchical risk parity — balances clusters without full-matrix inversion.", |
| "objective": "hrp", |
| "weight_min": 0.005, |
| "weight_max": 0.25, |
| }, |
| "quantum_select": { |
| "label": "Quantum · QUBO select", |
| "description": "Binary asset selection via QUBO + simulated annealing; wide cap on chosen names.", |
| "objective": "qubo_sa", |
| "weight_min": 0.0, |
| "weight_max": 1.0, |
| "K": None, |
| }, |
| |
| "sim_crash_day": { |
| "label": "Stress · Crash day", |
| "description": "For single-day crash narrative (cf. Simulations: Black Monday 1987): min-var, tight 10% cap.", |
| "objective": "min_variance", |
| "weight_min": 0.02, |
| "weight_max": 0.10, |
| }, |
| "sim_gfc_drawdown": { |
| "label": "Stress · Credit drawdown", |
| "description": "For prolonged credit crisis narrative (cf. Simulations: 2008 GFC, COVID): HRP, 18% cap.", |
| "objective": "hrp", |
| "weight_min": 0.005, |
| "weight_max": 0.18, |
| }, |
| "sim_relief_rally": { |
| "label": "Stress · Relief rally", |
| "description": "For relief / momentum day narrative (cf. Simulations: Vaccine Monday, stimulus): max-Sharpe, 35% cap.", |
| "objective": "markowitz", |
| "weight_min": 0.005, |
| "weight_max": 0.35, |
| }, |
| } |
|
|