Hybrid classical/quantum portfolio optimization with QAOA, KKT-informed penalties, and practical noise-mitigation technique, this is a work in progress.
- Data Preparation: Fetches and cleans historical price data from the S&P 500, calculates annualized returns and covariance matrices.
- Classical Benchmark: Solves the continuous Markowitz problem using CVXPY, providing a performance baseline and extracting KKT multipliers to inform the quantum model.
- Quantum Formulation: Maps the portfolio problem to a QUBO and constructs the corresponding QAOA circuits.
- Noise Mitigation: Implements a suite of techniques—including Zero-Noise Extrapolation (ZNE) and measurement error mitigation—to improve results on real hardware.
- Experiments: Runs simulations with noise-free statevector simulators and prepares for execution on IBM Quantum systems.
Research questions
- How do QAOA-derived portfolios compare to the classical optimum (objective, Sharpe)?
- Which mitigation strategies deliver the largest practical gains on NISQ hardware?
- How do classical duals (KKT multipliers) guide quantum penalty selection?
├── analysis/ # Post-processing: performance tables, plots, LaTeX
│ ├── results_analysis.py
│ └── visualization.py
├── data/ # Raw price data & downloader script
├── docs/diagrams/ # Mermaid diagrams (professional & simplified)
├── experiments/ # Simulation & hardware experiment drivers
│ ├── simulation_runs.py
│ └── hardware_runs.py
├── outputs/ # Generated results/figures
├── src/
│ ├── data_loader.py # CSV cleaning, universe selection, stats
│ ├── classical_optimizer.py
│ ├── quantum_circuits.py
│ └── error_mitigation.py
├── requirements.txt
└── README.md
%%{init: {"theme": "neutral"}}%%
graph TD
subgraph Data_Preparation
A1[load_price_history] --> A2[Clean index & gaps]
A2 --> A3[select_universe]
A3 --> A4[compute_return_statistics → μ, Σ]
end
subgraph Classical_Benchmark
A4 --> B1[build_quadratic_program]
B1 --> B2[solve_relaxed_problem]
B2 --> B3[export_results JSON]
B2 --> B4[calibrate_penalties]
end
subgraph Quantum_Pipeline
A4 --> C1[build_qubo_hamiltonians]
B4 --> C1
C1 --> C2[construct_qaoa_circuit]
end
subgraph Mitigation
C2 --> D1[build_mitigation_pipeline]
D1 --> D2[Zero-noise extrapolation]
D1 --> D3[Measurement mitigation]
D1 --> D4[Dynamical decoupling]
end
subgraph Experiments
C2 --> E1[run_simulation_sweep]
D1 --> E1
C2 --> E2[execute_hardware_campaign]
D1 --> E2
end
E1 --> F1[Compare vs classical objective / Sharpe]
E2 --> F1
Additional subsystem diagrams (docs/diagrams/) break down data prep, classical benchmark, quantum stack, mitigation, and experiment orchestration in professional & simplified variants.
- Install Python 3.11 (Qiskit requires ≤3.11 as of October 2025):
brew install python@3.11 # or use python.org installer python3.11 -m venv venv source venv/bin/activate
- Install dependencies:
python -m pip install --upgrade pip python -m pip install -r requirements.txt
- IBM Quantum credentials (for hardware execution):
python - <<'PY' from qiskit_ibm_runtime import QiskitRuntimeService QiskitRuntimeService.save_account( channel="ibm_quantum", token="YOUR_API_TOKEN", instance="hub/group/project" ) PY