YQuantum 2026 | The Hartford & Capgemini Quantum Lab | QuEra
A quantum-classical hybrid approach to insurance portfolio optimisation using QUBO/Ising formulations and QAOA executed on Bloqade's neutral atom simulator.
Insurance companies must invest large premium volumes under strict solvency and liquidity constraints. Constructing a portfolio that maximises return while minimising correlated risk across asset classes is a highly non-trivial combinatorial problem. We model it as a Markowitz mean-variance optimisation, reformulate it as a QUBO, and solve it using quantum approaches.
- 8 assets selected from 50 (one per sector): Gov Bonds, IG Credit, HY Credit, Equities US, Equities Intl, Infrastructure, Real Estate, Cash
- Expected returns
muand covariance matrixcovextracted frominvestment_dataset_covariance.csv
The Markowitz objective with budget constraint becomes: min x^T Q x
where the Q matrix encodes:
- Return reward:
-mu[i]on the diagonal - Risk penalty:
q_risk * cov[i,j]on off-diagonals - Budget penalty:
lambda * (sum(x_i) - B)^2expanded into the matrix
Parameters: q_risk = 1, lambda = 5, B = 4 (pick 4 of 8 assets)
QUBO binary variables x_i ∈ {0,1} are mapped to Ising spins s_i ∈ {-1,+1} via x_i = (1 + s_i) / 2, giving:
H = sum_i h_i * Z_i + sum_{i<j} J_ij * Z_i * Z_j
- 8 qubits in a 2×4 neutral atom grid, spacing 5μm, Rydberg blockade radius 15μm
- Fully connected graph — matches the dense QUBO structure of the portfolio problem
- QAOA circuit with p=1 and p=2 layers built using
@qasm2.main - Angles optimised via grid search + refinement
- Executed via Bloqade's PyQrack simulator (
state_vector+multi_run)
- Simulated Annealing (
01_simulated_annealing.py) — classical combinatorial solver - Markowitz MVO (
03_bloqade_circuit.py) — continuous mean-variance optimisation via scipy SLSQP - Quantum Annealing — adiabatic interpolation H(s) = (1-s)H_M + s*H_C for D-Wave comparison
Depolarising noise swept from 0% to 5% per-qubit per-layer using a proper density matrix channel:
rho_noisy = (1 - p) * U rho U† + p * I/dim
Results show energy remains stable up to ~1% gate error, consistent with current Rydberg hardware capabilities.
Portfolio performance evaluated under real market stress scenarios from investment_dataset_scenarios.csv.
CVaR (worst-5 average) computed for QAOA and brute-force portfolios to assess insurance solvency risk.
| File | Description |
|---|---|
01_simulated_annealing.py |
Classical SA baseline — QUBO/Ising build + simulated annealing solver |
02_qaoa_numpy_simulation.py |
Exact state-vector QAOA simulation (numpy/scipy), noise sweep, 9-panel plots |
03_bloqade_circuit.py |
Real Bloqade @qasm2.main circuit, PyQrack execution, shot sampling, MVO baseline, stress test |
investment_dataset_full.xlsx |
Full 50-asset return history |
investment_dataset_covariance.csv |
Full 50×50 covariance matrix |
investment_dataset_correlation.csv |
Full 50×50 correlation matrix |
investment_dataset_assets.csv |
Asset metadata (sector, expected return, etc.) |
investment_dataset_scenarios.csv |
Stress scenario data (used for CVaR analysis) |
- Python 3.10 or 3.11 (recommended — PyQrack wheels are not available for all platforms on 3.12+)
- All dependencies in
requirements.txt
pip install -r requirements.txt
⚠️ Bloqade note:bloqade-pyqrack[pyqrack-cpu]is the simulator backend required by03_bloqade_circuit.py. If installation fails (e.g. no wheel for your platform/Python version), scripts01and02still run fully. Script03will automatically fall back to an exact numpy simulation producing identical results — you will see a clear message at startup.
python -c "from bloqade import qasm2; from bloqade.pyqrack import PyQrack; print('Bloqade OK')"Run scripts in sequence — each builds on the previous:
# 1. Classical baseline (no quantum dependencies)
python 01_simulated_annealing.py
# 2. Exact QAOA simulation + plots (no Bloqade needed)
python 02_qaoa_numpy_simulation.py
# → saves outputs/qaoa_numpy_results.png
# 3. Full Bloqade circuit + four-way comparison + stress test
python 03_bloqade_circuit.py
# → saves bloqade_qaoa_results.png| Parameter | Value | Meaning |
|---|---|---|
| N | 8 | Number of qubits / assets |
| B | 4 | Portfolio size (assets to select) |
| q_risk | 1 | Risk aversion |
| λ | 5 | Budget penalty strength |
| p | 2 | QAOA circuit depth |
(Run python 03_bloqade_circuit.py to generate final numbers — outputs saved to bloqade_qaoa_results.png)
- Noise tolerance: stable up to ~1% gate error
- Connectivity: fully connected via Rydberg blockade — ideal for dense QUBO graphs
QuBots - YQuantum 2026
Core quantum circuit architecture, QUBO formulation, and Bloqade integration developed collaboratively by the QuBots team at YQuantum 2026. See commit history for individual contributions including noise analysis, CVaR stress testing, and dataset pipeline.
