Skip to content

Instantly share code, notes, and snippets.

@CY0xZ
Created May 20, 2024 18:01
Show Gist options
  • Save CY0xZ/5e93abad6e01eccf82dbeab286dc758f to your computer and use it in GitHub Desktop.
Save CY0xZ/5e93abad6e01eccf82dbeab286dc758f to your computer and use it in GitHub Desktop.
credit_risk_analysis.ipynb
Display the source blob
Display the rendered blob
Raw
{
"nbformat": 4,
"nbformat_minor": 0,
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.7.6"
},
"varInspector": {
"cols": {
"lenName": 16,
"lenType": 16,
"lenVar": 40
},
"kernels_config": {
"python": {
"delete_cmd_postfix": "",
"delete_cmd_prefix": "del ",
"library": "var_list.py",
"varRefreshCmd": "print(var_dic_list())"
},
"r": {
"delete_cmd_postfix": ") ",
"delete_cmd_prefix": "rm(",
"library": "var_list.r",
"varRefreshCmd": "cat(var_dic_list()) "
}
},
"types_to_exclude": [
"module",
"function",
"builtin_function_or_method",
"instance",
"_Feature"
],
"window_display": false
},
"colab": {
"provenance": [],
"include_colab_link": true
}
},
"cells": [
{
"cell_type": "markdown",
"metadata": {
"id": "view-in-github",
"colab_type": "text"
},
"source": [
"<a href=\"https://colab.research.google.com/gist/CY0xZ/5e93abad6e01eccf82dbeab286dc758f/credit_risk_analysis.ipynb\" target=\"_parent\"><img src=\"https://colab.research.google.com/assets/colab-badge.svg\" alt=\"Open In Colab\"/></a>"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "oFmMKT4HJp3w"
},
"source": [
"# _*Qiskit Finance: Credit Risk Analysis*_\n",
"\n",
"The latest version of this notebook is available on https://github.com/Qiskit/qiskit-iqx-tutorials.\n",
"\n",
"***\n",
"### Contributors\n",
"Stefan Woerner<sup>[1]</sup>, Daniel Egger<sup>[1]</sup>\n",
"\n",
"### Affiliation\n",
"- <sup>[1]</sup>IBMQ"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "AV81pY_mJp3x"
},
"source": [
"### Introduction\n",
"This tutorial shows how quantum algorithms can be used for credit risk analysis.\n",
"More precisely, how Quantum Amplitude Estimation (QAE) can be used to estimate risk measures with a quadratic speed-up over classical Monte Carlo simulation.\n",
"The tutorial is based on the following papers:\n",
"- <a href=\"https://www.nature.com/articles/s41534-019-0130-6\">Quantum Risk Analysis. Stefan Woerner, Daniel J. Egger.</a> [Woerner2019]\n",
"- <a href=\"https://arxiv.org/abs/1907.03044\">Credit Risk Analysis using Quantum Computers. Egger et al. (2019)</a> [Egger2019]\n",
"\n",
"A general introduction to QAE can be found in the following paper and tutorial:\n",
"- <a href=\"http://arxiv.org/abs/quant-ph/0005055\">Quantum Amplitude Amplification and Estimation. Gilles Brassard et al.</a>\n",
"- <a href=\"https://github.com/Qiskit/qiskit-iqx-tutorials/blob/master/qiskit/aqua/general/amplitude_estimation.ipynb\">Qiskit Tutorial on Quantum Amplitude Estimation</a>\n",
"\n",
"The structure of the tutorial is as follows:\n",
"1. [Problem Definition](#Problem-Definition)\n",
"2. [Uncertainty Model](#Uncertainty-Model)\n",
"3. [Expected Loss](#Expected-Loss)\n",
"4. [Cumulative Distribution Function](#Cumulative-Distribution-Function)\n",
"5. [Value at Risk](#Value-at-Risk)\n",
"6. [Conditional Value at Risk](#Conditional-Value-at-Risk)"
]
},
{
"cell_type": "code",
"metadata": {
"id": "Xh4C7qcRJp4i"
},
"source": [
"from qiskit import QuantumRegister, QuantumCircuit, BasicAer, execute\n",
"\n",
"from qiskit.aqua.components.uncertainty_models import GaussianConditionalIndependenceModel as GCI\n",
"from qiskit.aqua.components.uncertainty_problems import UnivariatePiecewiseLinearObjective as PwlObjective\n",
"from qiskit.aqua.components.uncertainty_problems import MultivariateProblem\n",
"from qiskit.aqua.circuits import WeightedSumOperator\n",
"from qiskit.aqua.circuits import FixedValueComparator as Comparator\n",
"from qiskit.aqua.algorithms import AmplitudeEstimation\n",
"\n",
"import numpy as np\n",
"import matplotlib.pyplot as plt"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "BpZMR4b0Jp4j"
},
"source": [
"# define backend to be used\n",
"backend = BasicAer.get_backend('statevector_simulator')"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "1ZlcSIifJp4k"
},
"source": [
"### Problem Definition\n",
"\n",
"In this tutorial we want to analyze the credit risk of a portfolio of $K$ assets.\n",
"The default probability of every asset $k$ follows a *Gaussian Conditional Independence* model, i.e., given a value $z$ sampled from a latent random variable $Z$ following a standard normal distribution, the default probability of asset $k$ is given by\n",
"\n",
"$$p_k(z) = F\\left( \\frac{F^{-1}(p_k^0) - \\sqrt{\\rho_k}z}{\\sqrt{1 - \\rho_k}} \\right) $$\n",
"\n",
"where $F$ denotes the cumulative distribution function of $Z$, $p_k^0$ is the default probability of asset $k$ for $z=0$ and $\\rho_k$ is the sensitivity of the default probability of asset $k$ with respect to $Z$. Thus, given a concrete realization of $Z$ the individual default events are assumed to be independent from each other.\n",
"\n",
"We are interested in analyzing risk measures of the total loss\n",
"\n",
"$$ L = \\sum_{k=1}^K \\lambda_k X_k(Z) $$\n",
"\n",
"where $\\lambda_k$ denotes the _loss given default_ of asset $k$, and given $Z$, $X_k(Z)$ denotes a Bernoulli variable representing the default event of asset $k$. More precisely, we are interested in the expected value $\\mathbb{E}[L]$, the Value at Risk (VaR) of $L$ and the Conditional Value at Risk of $L$ (also called Expected Shortfall). Where VaR and CVaR are defined as\n",
"\n",
"$$ \\text{VaR}_{\\alpha}(L) = \\inf \\{ x \\mid \\mathbb{P}[L <= x] \\geq 1 - \\alpha \\}$$\n",
"\n",
"with confidence level $\\alpha \\in [0, 1]$, and\n",
"\n",
"$$ \\text{CVaR}_{\\alpha}(L) = \\mathbb{E}[ L \\mid L \\geq \\text{VaR}_{\\alpha}(L) ].$$\n",
"\n",
"For more details on the considered model, see, e.g.,<br>\n",
"<a href=\"https://arxiv.org/abs/1412.1183\">Regulatory Capital Modeling for Credit Risk. Marek Rutkowski, Silvio Tarca</a>\n",
"\n",
"\n",
"\n",
"The problem is defined by the following parameters:\n",
"- number of qubits used to represent $Z$, denoted by $n_z$\n",
"- truncation value for $Z$, denoted by $z_{\\text{max}}$, i.e., Z is assumed to take $2^{n_z}$ equidistant values in $\\{-z_{max}, ..., +z_{max}\\}$\n",
"- the base default probabilities for each asset $p_0^k \\in (0, 1)$, $k=1, ..., K$\n",
"- sensitivities of the default probabilities with respect to $Z$, denoted by $\\rho_k \\in [0, 1)$\n",
"- loss given default for asset $k$, denoted by $\\lambda_k$\n",
"- confidence level for VaR / CVaR $\\alpha \\in [0, 1]$."
]
},
{
"cell_type": "code",
"metadata": {
"id": "SmZeKfD1Jp4k"
},
"source": [
"# set problem parameters\n",
"n_z = 2\n",
"z_max = 2\n",
"z_values = np.linspace(-z_max, z_max, 2**n_z)\n",
"p_zeros = [0.15, 0.25]\n",
"rhos = [0.1, 0.05]\n",
"lgd = [1, 2]\n",
"K = len(p_zeros)\n",
"alpha = 0.05"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "x9HtydWYJp4l"
},
"source": [
"### Uncertainty Model\n",
"\n",
"We now construct a circuit that loads the uncertainty model. This can be achieved by creating a quantum state in a register of $n_z$ qubits that represents $Z$ following a standard normal distribution. This state is then used to control single qubit Y-rotations on a second qubit register of $K$ qubits, where a $|1\\rangle$ state of qubit $k$ represents the default event of asset $k$. The resulting quantum state can be written as\n",
"\n",
"$$ |\\Psi\\rangle = \\sum_{i=0}^{2^{n_z}-1} \\sqrt{p_z^i} |z_i \\rangle \\bigotimes_{k=1}^K\n",
"\\left( \\sqrt{1 - p_k(z_i)}|0\\rangle + \\sqrt{p_k(z_i)}|1\\rangle\\right),$$\n",
"\n",
"where we denote by $z_i$ the $i$-th value of the discretized and truncated $Z$ [Egger2019]."
]
},
{
"cell_type": "code",
"metadata": {
"id": "0volDKfZJp43"
},
"source": [
"# construct circuit factory for uncertainty model (Gaussian Conditional Independence model)\n",
"u = GCI(n_z, z_max, p_zeros, rhos)"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "BJChfwS_Jp44"
},
"source": [
"# determine the number of qubits required to represent the uncertainty model\n",
"num_qubits = u.num_target_qubits\n",
"\n",
"# initialize quantum register and circuit\n",
"q = QuantumRegister(num_qubits, name='q')\n",
"qc = QuantumCircuit(q)\n",
"\n",
"# construct circuit\n",
"u.build(qc, q)"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "057L3PdoJp44"
},
"source": [
"We now use the simulator to validate the circuit that constructs $|\\Psi\\rangle$ and compute the corresponding exact values for\n",
"- expected loss $\\mathbb{E}[L]$\n",
"- PDF and CDF of $L$\n",
"- value at risk $VaR(L)$ and corresponding probability\n",
"- conditional value at risk $CVaR(L)$"
]
},
{
"cell_type": "code",
"metadata": {
"id": "HebvZn5jJp45"
},
"source": [
"# run the circuit and analyze the results\n",
"job = execute(qc, backend=BasicAer.get_backend('statevector_simulator'))"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "Sq7UBtMfJp46"
},
"source": [
"# analyze uncertainty circuit and determine exact solutions\n",
"p_z = np.zeros(2**n_z)\n",
"p_default = np.zeros(K)\n",
"values = []\n",
"probabilities = []\n",
"for i, a in enumerate(job.result().get_statevector()):\n",
"\n",
" # get binary representation\n",
" b = ('{0:0%sb}' % num_qubits).format(i)\n",
" prob = np.abs(a)**2\n",
"\n",
" # extract value of Z and corresponding probability\n",
" i_normal = int(b[-n_z:], 2)\n",
" p_z[i_normal] += prob\n",
"\n",
" # determine overall default probability for k\n",
" loss = 0\n",
" for k in range(K):\n",
" if b[K - k - 1] == '1':\n",
" p_default[k] += prob\n",
" loss += lgd[k]\n",
" values += [loss]\n",
" probabilities += [prob]\n",
"\n",
"values = np.array(values)\n",
"probabilities = np.array(probabilities)\n",
"\n",
"expected_loss = np.dot(values, probabilities)\n",
"\n",
"losses = np.sort(np.unique(values))\n",
"pdf = np.zeros(len(losses))\n",
"for i, v in enumerate(losses):\n",
" pdf[i] += sum(probabilities[values == v])\n",
"cdf = np.cumsum(pdf)\n",
"\n",
"i_var = np.argmax(cdf >= 1-alpha)\n",
"exact_var = losses[i_var]\n",
"exact_cvar = np.dot(pdf[(i_var+1):], losses[(i_var+1):])/sum(pdf[(i_var+1):])"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "mAZcU-m0Jp5B",
"outputId": "af261315-806d-4c07-c1b8-23842404ef6a"
},
"source": [
"print('Expected Loss E[L]: %.4f' % expected_loss)\n",
"print('Value at Risk VaR[L]: %.4f' % exact_var)\n",
"print('P[L <= VaR[L]]: %.4f' % cdf[exact_var])\n",
"print('Conditional Value at Risk CVaR[L]: %.4f' % exact_cvar)\n",
"\n",
"# plot loss PDF, expected loss, var, and cvar\n",
"plt.bar(losses, pdf)\n",
"plt.axvline(expected_loss, color='green', linestyle='--', label='E[L]')\n",
"plt.axvline(exact_var, color='orange', linestyle='--', label='VaR(L)')\n",
"plt.axvline(exact_cvar, color='red', linestyle='--', label='CVaR(L)')\n",
"plt.legend(fontsize=15)\n",
"plt.xlabel('Loss L ($)', size=15)\n",
"plt.ylabel('probability (%)', size=15)\n",
"plt.title('Loss Distribution', size=20)\n",
"plt.xticks(size=15)\n",
"plt.yticks(size=15)\n",
"plt.show()\n",
"\n",
"# plot results for Z\n",
"plt.plot(z_values, p_z, 'o-', linewidth=3, markersize=8)\n",
"plt.grid()\n",
"plt.xlabel('Z value', size=15)\n",
"plt.ylabel('probability (%)', size=15)\n",
"plt.title('Z Distribution', size=20)\n",
"plt.xticks(size=15)\n",
"plt.yticks(size=15)\n",
"plt.show()\n",
"\n",
"# plot results for default probabilities\n",
"plt.bar(range(K), p_default)\n",
"plt.xlabel('Asset', size=15)\n",
"plt.ylabel('probability (%)', size=15)\n",
"plt.title('Individual Default Probabilities', size=20)\n",
"plt.xticks(range(K), size=15)\n",
"plt.yticks(size=15)\n",
"plt.grid()\n",
"plt.show()"
],
"execution_count": null,
"outputs": [
{
"output_type": "stream",
"text": [
"Expected Loss E[L]: 0.6409\n",
"Value at Risk VaR[L]: 2.0000\n",
"P[L <= VaR[L]]: 0.9591\n",
"Conditional Value at Risk CVaR[L]: 3.0000\n"
],
"name": "stdout"
},
{
"output_type": "display_data",
"data": {
"image/png": "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84AXgSdE5AIR+SXwErALeDjID2CMMaasQAsTVd0A9ALycI8Bj8Z1Rrw1atPq3jaRzgNeAO4DnsMVJD29fRpjjAlR4E9zqernuGFQ4m1TECNtC3CZtxhjjKlEbD4TY4wxabNBEk1gnj776bBDMMnqYtcsLa1bhx1BYKwwMYFpUT93JgqqMvaza5aWmjXDjiAwdpvLBGbyp5OZ/OnksMMwyfh2sltMar7/3i05wAoTE5hH5z3Ko/MeDTsMk4wvH3VLFdOvXz+OOuqoctdfccUVNGzYkJ07dybc1+7duxGR0qVOnTp06NCBe+65h90rV8Latftsv2XLFpo2bcrs2bNL0w455BBuuOGGco9xySWXcMkll/j4ZOGxwsQYk3OGDx/Op59+ymeffVZm3Z49e3juuecYMGAAtWrV8r3P6667jrlz5/Lqq69y2mmncd1113Hv3/5WZru//OUvtGvXjm7duiW176eeeiozUwlXECtMjDE558wzzyQ/P5/i4uIy6/71r3+xevVqhg8fntQ+W7duTefOnenZsyf3338/vXr14u8vvrjPNnv27OGRRx7hoosuSmrfhx56KJ07d+axxx5LKl+QrDAxxuScunXr0q9fPyZPLtseVFxczIEHHsgpp5zCihUruPDCC2ndujV16tShbdu23HrrrezatSvhMY455hiWRU3b+9Zbb7F69WrOPvvspGMeOHAgTz/9dMLRisNiT3MZYzJnRo+yaS2HQNvLYfc2mNm37Po2hW7ZsQ7+Pajs+sMug1ZDYesymHt+2fXtr05p7LDhw4czZcoU5s+fz3HHHQfArl27eP755zn33HPJy8tj7dq1NGnShPvvv58GDRqwaNEiRo8ezbp163j44fgjOS1dupTWhxyyT9rbb7/N4YcfToMGsQZPj69r166sXLmSzz//nCOOOCLp/BXNChMTmOeGPBd2CCZZv6i616xPnz40aNCA4uLi0sLkjTfe4Pvvvy+9xdWxY0c6duxYmqdbt27UqVOHSy+9lL/85S/7jCS8d+9edu/ezbZt23jppZd48cUXmfTUU9CmTek28+fP58gURxA+6qijEBE++OADK0xMbmuS3yTsEEyyaid5zXrPLH9d9fz462s3ib9+vxbx1yepVq1anH322UyZMoW7774bEWHy5Mm0atWKzp07A66AGDduHBMmTGDJkiX7TNG7fPly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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"tags": [],
"needs_background": "light"
}
},
{
"output_type": "display_data",
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"tags": [],
"needs_background": "light"
}
},
{
"output_type": "display_data",
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"tags": [],
"needs_background": "light"
}
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "Wag9BnYcJp5C"
},
"source": [
"### Expected Loss\n",
"\n",
"To estimate the expected loss, we first apply a weighted sum operator to sum up individual losses to total loss:\n",
"\n",
"$$ \\mathcal{S}: |x_1, ..., x_K \\rangle_K |0\\rangle_{n_S} \\mapsto |x_1, ..., x_K \\rangle_K |\\lambda_1x_1 + ... + \\lambda_K x_K\\rangle_{n_S}. $$\n",
"\n",
"The required number of qubits to represent the result is given by\n",
"\n",
"$$ n_s = \\lfloor \\log_2( \\lambda_1 + ... + \\lambda_K ) \\rfloor + 1. $$\n",
"\n",
"Once we have the total loss distribution in a quantum register, we can use the techniques described in [Woerner2019] to map a total loss $L \\in \\{0, ..., 2^{n_s}-1\\}$ to the amplitude of an objective qubit by an operator\n",
"\n",
"$$ | L \\rangle_{n_s}|0\\rangle \\mapsto\n",
"| L \\rangle_{n_s} \\left( \\sqrt{1 - L/(2^{n_s}-1)}|0\\rangle + \\sqrt{L/(2^{n_s}-1)}|1\\rangle \\right), $$\n",
"\n",
"which allows to run amplitude estimation to evaluate the expected loss."
]
},
{
"cell_type": "code",
"metadata": {
"id": "ic7c4mF3Jp5C"
},
"source": [
"# determine number of qubits required to represent total loss\n",
"n_s = WeightedSumOperator.get_required_sum_qubits(lgd)\n",
"\n",
"# create circuit factory (add Z qubits with weight/loss 0)\n",
"agg = WeightedSumOperator(n_z + K, [0]*n_z + lgd)"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "GVY6YLJYJp5C"
},
"source": [
"# define linear objective function\n",
"breakpoints = [0]\n",
"slopes = [1]\n",
"offsets = [0]\n",
"f_min = 0\n",
"f_max = sum(lgd)\n",
"c_approx = 0.25\n",
"\n",
"objective = PwlObjective(\n",
" agg.num_sum_qubits,\n",
" 0,\n",
" 2**agg.num_sum_qubits-1, # max value that can be reached by the qubit register (will not always be reached)\n",
" breakpoints,\n",
" slopes,\n",
" offsets,\n",
" f_min,\n",
" f_max,\n",
" c_approx\n",
")\n",
"\n",
"# define overall multivariate problem\n",
"multivariate = MultivariateProblem(u, agg, objective)"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "O0XXO-FbJp5K"
},
"source": [
"Before we use QAE to estimate the expected loss, we validate the quantum circuit representing the objective function by just simulating it directly and analyzing the probability of the objective qubit being in the $|1\\rangle$ state, i.e., the value QAE will eventually approximate."
]
},
{
"cell_type": "code",
"metadata": {
"id": "ic9CMjpfJp5K"
},
"source": [
"num_qubits = multivariate.num_target_qubits\n",
"num_ancillas = multivariate.required_ancillas()\n",
"\n",
"q = QuantumRegister(num_qubits, name='q')\n",
"q_a = QuantumRegister(num_ancillas, name='q_a')\n",
"qc = QuantumCircuit(q, q_a)\n",
"\n",
"multivariate.build(qc, q, q_a)"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"scrolled": true,
"id": "ai32FO59Jp5L",
"outputId": "dc5e72d9-8926-4851-dc90-fe356b50cb14"
},
"source": [
"qc.draw()"
],
"execution_count": null,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/html": [
"<pre style=\"word-wrap: normal;white-space: pre;background: #fff0;line-height: 1.1;font-family: &quot;Courier New&quot;,Courier,monospace\"> ┌───┐┌────────────────┐┌───┐»\n",
" q_0: |0>────────────────────────────────────┤ X ├┤ U3(0.7907,0,0) ├┤ X ├»\n",
" ┌──────────────┐ ┌───────┐ └─┬─┘└────────────────┘└─┬─┘»\n",
" q_1: |0>┤ U3(pi/2,0,0) ├─────┤ U1(0) ├────────■──────────────────────■──»\n",
" └┬────────────┬┘┌────┴───────┴─────┐ »\n",
" q_2: |0>─┤ Ry(1.1847) ├─┤ U3(-0.14182,0,0) ├────────────────────────────»\n",
" ├────────────┤ ├──────────────────┤ »\n",
" q_3: |0>─┤ Ry(1.3696) ├─┤ U3(-0.11174,0,0) ├────────────────────────────»\n",
" └────────────┘ └──────────────────┘ »\n",
" q_4: |0>────────────────────────────────────────────────────────────────»\n",
" »\n",
"q_a_0: |0>────────────────────────────────────────────────────────────────»\n",
" »\n",
"q_a_1: |0>────────────────────────────────────────────────────────────────»\n",
" »\n",
"q_a_2: |0>────────────────────────────────────────────────────────────────»\n",
" »\n",
"« ┌──────────────┐┌───┐┌───────┐┌───┐┌───────┐ »\n",
"« q_0: ┤ U3(pi/2,0,0) ├┤ X ├┤ U1(0) ├┤ X ├┤ U1(0) ├──■─────────────────────»\n",
"« └──────────────┘└─┬─┘└───────┘└─┬─┘└───────┘ │ »\n",
"« q_1: ──────────────────■─────────────■─────────────┼─────────────────────»\n",
"« ┌─┴─┐┌─────────────────┐»\n",
"« q_2: ────────────────────────────────────────────┤ X ├┤ U3(0.14182,0,0) ├»\n",
"« └───┘└─────────────────┘»\n",
"« q_3: ────────────────────────────────────────────────────────────────────»\n",
"« »\n",
"« q_4: ────────────────────────────────────────────────────────────────────»\n",
"« »\n",
"«q_a_0: ────────────────────────────────────────────────────────────────────»\n",
"« »\n",
"«q_a_1: ────────────────────────────────────────────────────────────────────»\n",
"« »\n",
"«q_a_2: ────────────────────────────────────────────────────────────────────»\n",
"« »\n",
"« »\n",
"« q_0: ──■────■───────────────────────────────────────────■──»\n",
"« │ │ │ »\n",
"« q_1: ──┼────┼───────────────────────────────■───────────┼──»\n",
"« ┌─┴─┐ │ ┌──────────────────┐ ┌─┴─┐ │ »\n",
"« q_2: ┤ X ├──┼──┤ U3(-0.28365,0,0) ├───────┤ X ├─────────┼──»\n",
"« └───┘┌─┴─┐└──────────────────┘┌──────┴───┴──────┐┌─┴─┐»\n",
"« q_3: ─────┤ X ├────────────────────┤ U3(0.11174,0,0) ├┤ X ├»\n",
"« └───┘ └─────────────────┘└───┘»\n",
"« q_4: ──────────────────────────────────────────────────────»\n",
"« »\n",
"«q_a_0: ──────────────────────────────────────────────────────»\n",
"« »\n",
"«q_a_1: ──────────────────────────────────────────────────────»\n",
"« »\n",
"«q_a_2: ──────────────────────────────────────────────────────»\n",
"« »\n",
"« ░ »\n",
"« q_0: ─────────────────────────────────────────────────────────────────────░─»\n",
"« ░ »\n",
"« q_1: ────────────────────────────■────────────■───────────────────────■───░─»\n",
"« ┌─────────────────┐ ┌─┴─┐ │ │ ░ »\n",
"« q_2: ┤ U3(0.28365,0,0) ├───────┤ X ├──────────┼───────────────────────┼───░─»\n",
"« └─────────────────┘┌──────┴───┴───────┐┌─┴─┐┌─────────────────┐┌─┴─┐ ░ »\n",
"« q_3: ───────────────────┤ U3(-0.22349,0,0) ├┤ X ├┤ U3(0.22349,0,0) ├┤ X ├─░─»\n",
"« └──────────────────┘└───┘└─────────────────┘└───┘ ░ »\n",
"« q_4: ─────────────────────────────────────────────────────────────────────░─»\n",
"« ░ »\n",
"«q_a_0: ─────────────────────────────────────────────────────────────────────░─»\n",
"« ░ »\n",
"«q_a_1: ─────────────────────────────────────────────────────────────────────░─»\n",
"« ░ »\n",
"«q_a_2: ─────────────────────────────────────────────────────────────────────░─»\n",
"« ░ »\n",
"« ░ »\n",
"« q_0: ─────────────────────────────────────────░──────────────»\n",
"« ░ »\n",
"« q_1: ─────────────────────────────────────────░──────────────»\n",
"« ░ »\n",
"« q_2: ──■────■────■─────────■──────────────────░──────────────»\n",
"« │ │ │ │ ░ »\n",
"« q_3: ──┼────┼────┼─────────┼────■────■────────░──────────────»\n",
"« │ │ │ │ │ │ ░ ┌───────────┐»\n",
"« q_4: ──┼────┼────┼─────────┼────┼────┼────────░─┤ Ry(3pi/8) ├»\n",
"« │ ┌─┴─┐ │ ┌───┐ │ │ │ ┌───┐ ░ └───────────┘»\n",
"«q_a_0: ──■──┤ X ├──┼──┤ X ├──■────┼────┼──┤ X ├─░──────────────»\n",
"« │ └───┘┌─┴─┐└───┘ │ ┌─┴─┐┌─┴─┐└───┘ ░ »\n",
"«q_a_1: ──┼───────┤ X ├───────┼──┤ X ├┤ X ├──────░──────────────»\n",
"« ┌─┴─┐ └─┬─┘ ┌─┴─┐└───┘└─┬─┘ ░ »\n",
"«q_a_2: ┤ X ├───────■───────┤ X ├───────■────────░──────────────»\n",
"« └───┘ └───┘ ░ »\n",
"« »\n",
"« q_0: ───────────────────────────────────────────────────────────────────»\n",
"« »\n",
"« q_1: ───────────────────────────────────────────────────────────────────»\n",
"« »\n",
"« q_2: ───────────────────────────────────────────────────────────────────»\n",
"« »\n",
"« q_3: ───────────────────────────────────────────────────────────────────»\n",
"« ┌───────────────┐┌───┐┌────────────────┐┌───┐┌───────────────┐┌───┐»\n",
"« q_4: ┤ U3(pi/24,0,0) ├┤ X ├┤ U3(-pi/24,0,0) ├┤ X ├┤ U3(pi/12,0,0) ├┤ X ├»\n",
"« └───────────────┘└─┬─┘└────────────────┘└─┬─┘└───────────────┘└─┬─┘»\n",
"«q_a_0: ───────────────────■──────────────────────■─────────────────────┼──»\n",
"« │ »\n",
"«q_a_1: ────────────────────────────────────────────────────────────────■──»\n",
"« »\n",
"«q_a_2: ───────────────────────────────────────────────────────────────────»\n",
"« »\n",
"« ░ ░ \n",
"« q_0: ────────────────────────░──────────────────────────────────────────░─\n",
"« ░ ░ \n",
"« q_1: ────────────────────────░──────────────────────────────────────────░─\n",
"« ░ ░ \n",
"« q_2: ────────────────────────░──────────────────■────■─────────■────■───░─\n",
"« ░ │ │ │ │ ░ \n",
"« q_3: ────────────────────────░───■─────────■────┼────┼─────────┼────┼───░─\n",
"« ┌────────────────┐┌───┐ ░ │ │ │ │ │ │ ░ \n",
"« q_4: ┤ U3(-pi/12,0,0) ├┤ X ├─░───┼─────────┼────┼────┼─────────┼────┼───░─\n",
"« └────────────────┘└─┬─┘ ░ │ ┌───┐ │ │ │ ┌───┐┌─┴─┐ │ ░ \n",
"«q_a_0: ────────────────────┼───░───┼──┤ X ├──┼────■────┼──┤ X ├┤ X ├──■───░─\n",
"« │ ░ ┌─┴─┐└───┘┌─┴─┐ │ ┌─┴─┐└───┘└───┘ │ ░ \n",
"«q_a_1: ────────────────────■───░─┤ X ├─────┤ X ├──┼──┤ X ├────────────┼───░─\n",
"« ░ └─┬─┘ └───┘┌─┴─┐└─┬─┘ ┌─┴─┐ ░ \n",
"«q_a_2: ────────────────────────░───■────────────┤ X ├──■────────────┤ X ├─░─\n",
"« ░ └───┘ └───┘ ░ </pre>"
],
"text/plain": [
"<qiskit.visualization.text.TextDrawing at 0x1d89ace47f0>"
]
},
"metadata": {
"tags": []
},
"execution_count": 12
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "OLmYVVMwJp5O"
},
"source": [
"job = execute(qc, backend=BasicAer.get_backend('statevector_simulator'))"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "P7qRe3JsJp5O",
"outputId": "3244c781-1ce4-4442-ea48-0810c7893003"
},
"source": [
"# evaluate resulting statevector\n",
"value = 0\n",
"for i, a in enumerate(job.result().get_statevector()):\n",
" b = ('{0:0%sb}' % multivariate.num_target_qubits).format(i)[-multivariate.num_target_qubits:]\n",
" am = np.round(np.real(a), decimals=4)\n",
" if np.abs(am) > 1e-6 and b[0] == '1':\n",
" value += am**2\n",
"\n",
"print('Exact Expected Loss: %.4f' % expected_loss)\n",
"print('Exact Operator Value: %.4f' % value)\n",
"print('Mapped Operator value: %.4f' % multivariate.value_to_estimation(value))"
],
"execution_count": null,
"outputs": [
{
"output_type": "stream",
"text": [
"Exact Expected Loss: 0.6409\n",
"Exact Operator Value: 0.3906\n",
"Mapped Operator value: 0.6640\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "juhbY4MbJp5P"
},
"source": [
"Next we run QAE to estimate the expected loss with a quadratic speed-up over classical Monte Carlo simulation."
]
},
{
"cell_type": "code",
"metadata": {
"scrolled": false,
"id": "rGX6ah0DJp5P",
"outputId": "1f29a862-b56b-445c-a973-264431dc66f8"
},
"source": [
"# run amplitude estimation\n",
"num_eval_qubits = 5\n",
"ae = AmplitudeEstimation(num_eval_qubits, multivariate)\n",
"# result = ae.run(quantum_instance=BasicAer.get_backend('qasm_simulator'), shots=100)\n",
"result = ae.run(quantum_instance=BasicAer.get_backend('statevector_simulator'))\n",
"\n",
"# print results\n",
"print('Exact value: \\t%.4f' % expected_loss)\n",
"print('Estimated value:\\t%.4f' % result['estimation'])\n",
"print('Probability: \\t%.4f' % result['max_probability'])"
],
"execution_count": null,
"outputs": [
{
"output_type": "stream",
"text": [
"Exact value: \t0.6409\n",
"Estimated value:\t0.7548\n",
"Probability: \t0.9507\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "o0vAcsZVJp5R",
"outputId": "8516573a-715e-4ad7-8d2f-47c6436c19f2"
},
"source": [
"# plot estimated values for \"a\"\n",
"plt.bar(result['values'], result['probabilities'], width=0.5/len(result['probabilities']))\n",
"plt.xticks([0, 0.25, 0.5, 0.75, 1], size=15)\n",
"plt.yticks([0, 0.25, 0.5, 0.75, 1], size=15)\n",
"plt.title('\"a\" Value', size=15)\n",
"plt.ylabel('Probability', size=15)\n",
"plt.ylim((0,1))\n",
"plt.grid()\n",
"plt.show()\n",
"\n",
"# plot estimated values for expected loss (after re-scaling and reversing the c_approx-transformation)\n",
"plt.bar(result['mapped_values'], result['probabilities'], width=1/len(result['probabilities']))\n",
"plt.axvline(expected_loss, color='red', linestyle='--', linewidth=2)\n",
"plt.xticks(size=15)\n",
"plt.yticks([0, 0.25, 0.5, 0.75, 1], size=15)\n",
"plt.title('Expected Loss', size=15)\n",
"plt.ylabel('Probability', size=15)\n",
"plt.ylim((0,1))\n",
"plt.grid()\n",
"plt.show()"
],
"execution_count": null,
"outputs": [
{
"output_type": "display_data",
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"tags": [],
"needs_background": "light"
}
},
{
"output_type": "display_data",
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"tags": [],
"needs_background": "light"
}
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "QhOB9EynJp5R"
},
"source": [
"### Cumulative Distribution Function\n",
"\n",
"Instead of the expected loss (which could also be estimated efficiently using classical techniques) we now estimate the cumulative distribution function (CDF) of the loss.\n",
"Classically, this either involves evaluating all the possible combinations of defaulting assets, or many classical samples in a Monte Carlo simulation. Algorithms based on QAE have the potential to significantly speed up this analysis in the future.\n",
"\n",
"To estimate the CDF, i.e., the probability $ \\mathbb{P}[L \\leq x] $, we again apply $\\mathcal{S}$ to compute the total loss, and then apply a comparator that for a given value $x$ acts as\n",
"\n",
"$$ \\mathcal{C}: |L\\rangle_n|0> \\mapsto\n",
"\\begin{cases}\n",
"|L\\rangle_n|1> & \\text{if}\\quad L \\leq x \\\\\n",
"|L\\rangle_n|0> & \\text{if}\\quad L > x.\n",
"\\end{cases} $$\n",
"\n",
"The resulting quantum state can be written as\n",
"\n",
"$$ \\sum_{L = 0}^{x} \\sqrt{p_{L}}|L\\rangle_{n_s}|1\\rangle +\n",
"\\sum_{L = x+1}^{2^{n_s}-1} \\sqrt{p_{L}}|L\\rangle_{n_s}|1\\rangle, $$\n",
"\n",
"where we directly assume the summed up loss values and corresponding probabilities instead of presenting the details of the uncertainty model.\n",
"\n",
"The CDF($x$) equals the probability of measuring $|1\\rangle$ in the objective qubit and QAE can be directly used to estimate it."
]
},
{
"cell_type": "code",
"metadata": {
"id": "QaB28ZqZJp5S"
},
"source": [
"# define value x to evaluate the CDF(x)\n",
"def get_cdf_operator_factory(x_eval):\n",
"\n",
" # comparator as objective\n",
" cdf_objective = Comparator(agg.num_sum_qubits, x_eval+1, geq=False)\n",
"\n",
" # define overall uncertainty problem\n",
" multivariate_cdf = MultivariateProblem(u, agg, cdf_objective)\n",
"\n",
" return multivariate_cdf"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "HtUtJp3NJp5S"
},
"source": [
"Again, we first use quantum simulation to validate the quantum circuit."
]
},
{
"cell_type": "code",
"metadata": {
"id": "zY2PMSAGJp5S"
},
"source": [
"# set x value to estimate the CDF\n",
"x_eval = 2"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "VUvyTqK_Jp5r"
},
"source": [
"# get operator\n",
"multivariate_cdf = get_cdf_operator_factory(x_eval)\n",
"\n",
"# get required number of qubits\n",
"num_qubits = multivariate_cdf.num_target_qubits\n",
"num_ancillas = multivariate_cdf.required_ancillas() # TODO: why do we need two more ancillas?\n",
"\n",
"# construct circuit\n",
"q = QuantumRegister(num_qubits, name='q')\n",
"q_a = QuantumRegister(num_ancillas, name='q_a')\n",
"qc = QuantumCircuit(q, q_a)\n",
"\n",
"multivariate_cdf.build(qc, q, q_a)"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "gUFNEArfJp5r"
},
"source": [
"job = execute(qc, backend=BasicAer.get_backend('statevector_simulator'))"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"scrolled": true,
"id": "O4rIsGOvJp5s",
"outputId": "99f0a11b-2539-48b1-994e-be114aafa771"
},
"source": [
"qc.draw()"
],
"execution_count": null,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/html": [
"<pre style=\"word-wrap: normal;white-space: pre;background: #fff0;line-height: 1.1;font-family: &quot;Courier New&quot;,Courier,monospace\"> ┌───┐┌────────────────┐┌───┐»\n",
" q_0: |0>────────────────────────────────────┤ X ├┤ U3(0.7907,0,0) ├┤ X ├»\n",
" ┌──────────────┐ ┌───────┐ └─┬─┘└────────────────┘└─┬─┘»\n",
" q_1: |0>┤ U3(pi/2,0,0) ├─────┤ U1(0) ├────────■──────────────────────■──»\n",
" └┬────────────┬┘┌────┴───────┴─────┐ »\n",
" q_2: |0>─┤ Ry(1.1847) ├─┤ U3(-0.14182,0,0) ├────────────────────────────»\n",
" ├────────────┤ ├──────────────────┤ »\n",
" q_3: |0>─┤ Ry(1.3696) ├─┤ U3(-0.11174,0,0) ├────────────────────────────»\n",
" └────────────┘ └──────────────────┘ »\n",
" q_4: |0>────────────────────────────────────────────────────────────────»\n",
" »\n",
"q_a_0: |0>────────────────────────────────────────────────────────────────»\n",
" »\n",
"q_a_1: |0>────────────────────────────────────────────────────────────────»\n",
" »\n",
"q_a_2: |0>────────────────────────────────────────────────────────────────»\n",
" »\n",
"« ┌──────────────┐┌───┐┌───────┐┌───┐┌───────┐ »\n",
"« q_0: ┤ U3(pi/2,0,0) ├┤ X ├┤ U1(0) ├┤ X ├┤ U1(0) ├──■─────────────────────»\n",
"« └──────────────┘└─┬─┘└───────┘└─┬─┘└───────┘ │ »\n",
"« q_1: ──────────────────■─────────────■─────────────┼─────────────────────»\n",
"« ┌─┴─┐┌─────────────────┐»\n",
"« q_2: ────────────────────────────────────────────┤ X ├┤ U3(0.14182,0,0) ├»\n",
"« └───┘└─────────────────┘»\n",
"« q_3: ────────────────────────────────────────────────────────────────────»\n",
"« »\n",
"« q_4: ────────────────────────────────────────────────────────────────────»\n",
"« »\n",
"«q_a_0: ────────────────────────────────────────────────────────────────────»\n",
"« »\n",
"«q_a_1: ────────────────────────────────────────────────────────────────────»\n",
"« »\n",
"«q_a_2: ────────────────────────────────────────────────────────────────────»\n",
"« »\n",
"« »\n",
"« q_0: ──■────■───────────────────────────────────────────■──»\n",
"« │ │ │ »\n",
"« q_1: ──┼────┼───────────────────────────────■───────────┼──»\n",
"« ┌─┴─┐ │ ┌──────────────────┐ ┌─┴─┐ │ »\n",
"« q_2: ┤ X ├──┼──┤ U3(-0.28365,0,0) ├───────┤ X ├─────────┼──»\n",
"« └───┘┌─┴─┐└──────────────────┘┌──────┴───┴──────┐┌─┴─┐»\n",
"« q_3: ─────┤ X ├────────────────────┤ U3(0.11174,0,0) ├┤ X ├»\n",
"« └───┘ └─────────────────┘└───┘»\n",
"« q_4: ──────────────────────────────────────────────────────»\n",
"« »\n",
"«q_a_0: ──────────────────────────────────────────────────────»\n",
"« »\n",
"«q_a_1: ──────────────────────────────────────────────────────»\n",
"« »\n",
"«q_a_2: ──────────────────────────────────────────────────────»\n",
"« »\n",
"« ░ »\n",
"« q_0: ─────────────────────────────────────────────────────────────────────░─»\n",
"« ░ »\n",
"« q_1: ────────────────────────────■────────────■───────────────────────■───░─»\n",
"« ┌─────────────────┐ ┌─┴─┐ │ │ ░ »\n",
"« q_2: ┤ U3(0.28365,0,0) ├───────┤ X ├──────────┼───────────────────────┼───░─»\n",
"« └─────────────────┘┌──────┴───┴───────┐┌─┴─┐┌─────────────────┐┌─┴─┐ ░ »\n",
"« q_3: ───────────────────┤ U3(-0.22349,0,0) ├┤ X ├┤ U3(0.22349,0,0) ├┤ X ├─░─»\n",
"« └──────────────────┘└───┘└─────────────────┘└───┘ ░ »\n",
"« q_4: ─────────────────────────────────────────────────────────────────────░─»\n",
"« ░ »\n",
"«q_a_0: ─────────────────────────────────────────────────────────────────────░─»\n",
"« ░ »\n",
"«q_a_1: ─────────────────────────────────────────────────────────────────────░─»\n",
"« ░ »\n",
"«q_a_2: ─────────────────────────────────────────────────────────────────────░─»\n",
"« ░ »\n",
"« ░ ░ »\n",
"« q_0: ─────────────────────────────────────────░─────────────────░───────────»\n",
"« ░ ░ »\n",
"« q_1: ─────────────────────────────────────────░─────────────────░───────────»\n",
"« ░ ░ »\n",
"« q_2: ──■────■────■─────────■──────────────────░─────────────────░───────────»\n",
"« │ │ │ │ ░ ░ »\n",
"« q_3: ──┼────┼────┼─────────┼────■────■────────░─────────────────░───■───────»\n",
"« │ │ │ │ │ │ ░ ┌───┐┌───┐ ░ │ »\n",
"« q_4: ──┼────┼────┼─────────┼────┼────┼────────░──────┤ X ├┤ X ├─░───┼───────»\n",
"« │ ┌─┴─┐ │ ┌───┐ │ │ │ ┌───┐ ░ └─┬─┘└───┘ ░ │ ┌───┐»\n",
"«q_a_0: ──■──┤ X ├──┼──┤ X ├──■────┼────┼──┤ X ├─░───■────┼────■───░───┼──┤ X ├»\n",
"« │ └───┘┌─┴─┐└───┘ │ ┌─┴─┐┌─┴─┐└───┘ ░ │ │ │ ░ ┌─┴─┐└───┘»\n",
"«q_a_1: ──┼───────┤ X ├───────┼──┤ X ├┤ X ├──────░───┼────■────┼───░─┤ X ├─────»\n",
"« ┌─┴─┐ └─┬─┘ ┌─┴─┐└───┘└─┬─┘ ░ ┌─┴─┐ │ ┌─┴─┐ ░ └─┬─┘ »\n",
"«q_a_2: ┤ X ├───────■───────┤ X ├───────■────────░─┤ X ├──■──┤ X ├─░───■───────»\n",
"« └───┘ └───┘ ░ └───┘ └───┘ ░ »\n",
"« ░ \n",
"« q_0: ───────────────────────────────░─\n",
"« ░ \n",
"« q_1: ───────────────────────────────░─\n",
"« ░ \n",
"« q_2: ───────■────■─────────■────■───░─\n",
"« │ │ │ │ ░ \n",
"« q_3: ──■────┼────┼─────────┼────┼───░─\n",
"« │ │ │ │ │ ░ \n",
"« q_4: ──┼────┼────┼─────────┼────┼───░─\n",
"« │ │ │ ┌───┐┌─┴─┐ │ ░ \n",
"«q_a_0: ──┼────■────┼──┤ X ├┤ X ├──■───░─\n",
"« ┌─┴─┐ │ ┌─┴─┐└───┘└───┘ │ ░ \n",
"«q_a_1: ┤ X ├──┼──┤ X ├────────────┼───░─\n",
"« └───┘┌─┴─┐└─┬─┘ ┌─┴─┐ ░ \n",
"«q_a_2: ─────┤ X ├──■────────────┤ X ├─░─\n",
"« └───┘ └───┘ ░ </pre>"
],
"text/plain": [
"<qiskit.visualization.text.TextDrawing at 0x1d8a5b32940>"
]
},
"metadata": {
"tags": []
},
"execution_count": 21
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "LE8uPXbGJp5s",
"outputId": "f4e86afc-c81f-4a2b-ba82-a31acb95bfc4"
},
"source": [
"# evaluate resulting statevector\n",
"var_prob = 0\n",
"for i, a in enumerate(job.result().get_statevector()):\n",
" b = ('{0:0%sb}' % multivariate_cdf.num_target_qubits).format(i)[-multivariate_cdf.num_target_qubits:]\n",
" prob = np.abs(a)**2\n",
" if prob > 1e-6 and b[0] == '1':\n",
" var_prob += prob\n",
"print('Operator CDF(%s)' % x_eval + ' = %.4f' % var_prob)\n",
"print('Exact CDF(%s)' % x_eval + ' = %.4f' % cdf[x_eval])"
],
"execution_count": null,
"outputs": [
{
"output_type": "stream",
"text": [
"Operator CDF(2) = 0.9591\n",
"Exact CDF(2) = 0.9591\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "cK7UTNOgJp5s"
},
"source": [
"Next we run QAE to estimate the CDF for a given $x$."
]
},
{
"cell_type": "code",
"metadata": {
"id": "myJJYREXJp5t"
},
"source": [
"# run amplitude estimation\n",
"num_eval_qubits = 4\n",
"ae_cdf = AmplitudeEstimation(num_eval_qubits, multivariate_cdf)\n",
"# result_cdf = ae_cdf.run(quantum_instance=BasicAer.get_backend('qasm_simulator'), shots=100)\n",
"result_cdf = ae_cdf.run(quantum_instance=BasicAer.get_backend('statevector_simulator'))"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "923ZZmSmJp5t",
"outputId": "b0039fd8-24e4-4193-be8c-a3ae6daf6ab1"
},
"source": [
"# print results\n",
"print('Exact value: \\t%.4f' % cdf[x_eval])\n",
"print('Estimated value:\\t%.4f' % result_cdf['estimation'])\n",
"print('Probability: \\t%.4f' % result_cdf['max_probability'])\n",
"\n",
"# plot estimated values for \"a\"\n",
"plt.bar(result_cdf['values'], result_cdf['probabilities'], width=0.5/len(result['probabilities']))\n",
"plt.axvline(cdf[x_eval], color='red', linestyle='--', linewidth=2)\n",
"plt.xticks([0, 0.25, 0.5, 0.75, 1], size=15)\n",
"plt.yticks([0, 0.25, 0.5, 0.75, 1], size=15)\n",
"plt.title('CDF(%s)' % x_eval, size=15)\n",
"plt.ylabel('Probability', size=15)\n",
"plt.ylim((0,1))\n",
"plt.grid()\n",
"plt.show()"
],
"execution_count": null,
"outputs": [
{
"output_type": "stream",
"text": [
"Exact value: \t0.9591\n",
"Estimated value:\t0.9619\n",
"Probability: \t0.9958\n"
],
"name": "stdout"
},
{
"output_type": "display_data",
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"tags": [],
"needs_background": "light"
}
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "GwM_82iwJp5t"
},
"source": [
"### Value at Risk\n",
"\n",
"In the following we use a bisection search and QAE to efficiently evaluate the CDF to estimate the value at risk."
]
},
{
"cell_type": "code",
"metadata": {
"id": "WAhRYdaWJp5t"
},
"source": [
"def run_ae_for_cdf(x_eval, num_eval_qubits=3, simulator='statevector_simulator'):\n",
"\n",
" # run amplitude estimation\n",
" multivariate_var = get_cdf_operator_factory(x_eval)\n",
" ae_var = AmplitudeEstimation(num_eval_qubits, multivariate_var)\n",
" result_var = ae_var.run(BasicAer.get_backend(simulator))\n",
"\n",
" return result_var['estimation']"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "E8lOYY-dJp5u"
},
"source": [
"def bisection_search(objective, target_value, low_level, high_level, low_value=None, high_value=None):\n",
" \"\"\"\n",
" Determines the smallest level such that the objective value is still larger than the target\n",
" :param objective: objective function\n",
" :param target: target value\n",
" :param low_level: lowest level to be considered\n",
" :param high_level: highest level to be considered\n",
" :param low_value: value of lowest level (will be evaluated if set to None)\n",
" :param high_value: value of highest level (will be evaluated if set to None)\n",
" :return: dictionary with level, value, num_eval\n",
" \"\"\"\n",
"\n",
" # check whether low and high values are given and evaluated them otherwise\n",
" print('--------------------------------------------------------------------')\n",
" print('start bisection search for target value %.3f' % target_value)\n",
" print('--------------------------------------------------------------------')\n",
" num_eval = 0\n",
" if low_value is None:\n",
" low_value = objective(low_level)\n",
" num_eval += 1\n",
" if high_value is None:\n",
" high_value = objective(high_level)\n",
" num_eval += 1\n",
"\n",
" # check if low_value already satisfies the condition\n",
" if low_value > target_value:\n",
" return {'level': low_level, 'value': low_value, 'num_eval': num_eval, 'comment': 'returned low value'}\n",
" elif low_value == target_value:\n",
" return {'level': low_level, 'value': low_value, 'num_eval': num_eval, 'comment': 'success'}\n",
"\n",
" # check if high_value is above target\n",
" if high_value < target_value:\n",
" return {'level': high_level, 'value': high_value, 'num_eval': num_eval, 'comment': 'returned low value'}\n",
" elif high_value == target_value:\n",
" return {'level': high_level, 'value': high_value, 'num_eval': num_eval, 'comment': 'success'}\n",
"\n",
" # perform bisection search until\n",
" print('low_level low_value level value high_level high_value')\n",
" print('--------------------------------------------------------------------')\n",
" while high_level - low_level > 1:\n",
"\n",
" level = int(np.round((high_level + low_level) / 2.0))\n",
" num_eval += 1\n",
" value = objective(level)\n",
"\n",
" print('%2d %.3f %2d %.3f %2d %.3f' \\\n",
" % (low_level, low_value, level, value, high_level, high_value))\n",
"\n",
" if value >= target_value:\n",
" high_level = level\n",
" high_value = value\n",
" else:\n",
" low_level = level\n",
" low_value = value\n",
"\n",
" # return high value after bisection search\n",
" print('--------------------------------------------------------------------')\n",
" print('finished bisection search')\n",
" print('--------------------------------------------------------------------')\n",
" return {'level': high_level, 'value': high_value, 'num_eval': num_eval, 'comment': 'success'}"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "JOPBHkj9Jp5u",
"outputId": "8393e90b-1d9d-43e9-abcc-9bb39bbcf56d"
},
"source": [
"# run bisection search to determine VaR\n",
"num_eval_qubits = 4\n",
"objective = lambda x: run_ae_for_cdf(x, num_eval_qubits=num_eval_qubits)\n",
"bisection_result = bisection_search(objective, 1-alpha, min(losses)-1, max(losses), low_value=0, high_value=1)\n",
"var = bisection_result['level']"
],
"execution_count": null,
"outputs": [
{
"output_type": "stream",
"text": [
"--------------------------------------------------------------------\n",
"start bisection search for target value 0.950\n",
"--------------------------------------------------------------------\n",
"low_level low_value level value high_level high_value\n",
"--------------------------------------------------------------------\n",
"-1 0.000 1 0.691 3 1.000\n",
" 1 0.691 2 0.962 3 1.000\n",
"--------------------------------------------------------------------\n",
"finished bisection search\n",
"--------------------------------------------------------------------\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "PPt_yT0XJp51",
"outputId": "5542def2-1581-4b02-c430-9dec76762fcc"
},
"source": [
"print('Estimated Value at Risk: %2d' % var)\n",
"print('Exact Value at Risk: %2d' % exact_var)\n",
"print('Estimated Probability: %.3f' % bisection_result['value'])\n",
"print('Exact Probability: %.3f' % cdf[exact_var])"
],
"execution_count": null,
"outputs": [
{
"output_type": "stream",
"text": [
"Estimated Value at Risk: 2\n",
"Exact Value at Risk: 2\n",
"Estimated Probability: 0.962\n",
"Exact Probability: 0.959\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "6YJukPRRJp52"
},
"source": [
"### Conditional Value at Risk\n",
"\n",
"Last, we compute the CVaR, i.e. the expected value of the loss conditional to it being larger than or equal to the VaR.\n",
"To do so, we evaluate a piecewise linear objective function $f(L)$, dependent on the total loss $L$, that is given by\n",
"\n",
"$$ f(L) = \\begin{cases}\n",
"0 & \\text{if}\\quad L \\leq VaR \\\\\n",
"L & \\text{if}\\quad L > VaR.\n",
"\\end{cases} $$\n",
"\n",
"To normalize, we have to divide the resulting expected value by the VaR-probability, i.e. $\\mathbb{P}[L \\leq VaR]$."
]
},
{
"cell_type": "code",
"metadata": {
"id": "lHcy61LfJp52"
},
"source": [
"# define linear objective\n",
"breakpoints = [0, var]\n",
"slopes = [0, 1]\n",
"offsets = [0, 0] # subtract VaR and add it later to the estimate\n",
"f_min = 0\n",
"f_max = 3 - var\n",
"c_approx = 0.25\n",
"\n",
"cvar_objective = PwlObjective(\n",
" agg.num_sum_qubits,\n",
" 0,\n",
" 2**agg.num_sum_qubits-1, # max value that can be reached by the qubit register (will not always be reached)\n",
" breakpoints,\n",
" slopes,\n",
" offsets,\n",
" f_min,\n",
" f_max,\n",
" c_approx\n",
")"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "7WUeWQOxJp55"
},
"source": [
"var = 2"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "ze89JnupJp55"
},
"source": [
"multivariate_cvar = MultivariateProblem(u, agg, cvar_objective)"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "VvPuEt96Jp55"
},
"source": [
"num_qubits = multivariate_cvar.num_target_qubits\n",
"num_ancillas = multivariate_cvar.required_ancillas()\n",
"\n",
"q = QuantumRegister(num_qubits, name='q')\n",
"q_a = QuantumRegister(num_ancillas, name='q_a')\n",
"qc = QuantumCircuit(q, q_a)\n",
"\n",
"multivariate_cvar.build(qc, q, q_a)"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "UGH78N5qJp55"
},
"source": [
"Again, we first use quantum simulation to validate the quantum circuit."
]
},
{
"cell_type": "code",
"metadata": {
"id": "hRLA1ju0Jp56"
},
"source": [
"job = execute(qc, backend=BasicAer.get_backend('statevector_simulator'))"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "QYCbpO11Jp56",
"outputId": "9edb25a1-8ce4-408e-bbbe-32723952447c"
},
"source": [
"# evaluate resulting statevector\n",
"value = 0\n",
"for i, a in enumerate(job.result().get_statevector()):\n",
" b = ('{0:0%sb}' % multivariate_cvar.num_target_qubits).format(i)[-multivariate_cvar.num_target_qubits:]\n",
" am = np.round(np.real(a), decimals=4)\n",
" if np.abs(am) > 1e-6 and b[0] == '1':\n",
" value += am**2\n",
"\n",
"# normalize and add VaR to estimate\n",
"value = multivariate_cvar.value_to_estimation(value)\n",
"normalized_value = value / (1.0 - bisection_result['value']) + var\n",
"print('Estimated CVaR: %.4f' % normalized_value)\n",
"print('Exact CVaR: %.4f' % exact_cvar)"
],
"execution_count": null,
"outputs": [
{
"output_type": "stream",
"text": [
"Estimated CVaR: 3.3796\n",
"Exact CVaR: 3.0000\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "EwzCmmuIJp56"
},
"source": [
"Next we run QAE to estimate the CVaR."
]
},
{
"cell_type": "code",
"metadata": {
"id": "tbA8xcmLJp56"
},
"source": [
"# run amplitude estimation\n",
"num_eval_qubits = 7\n",
"ae_cvar = AmplitudeEstimation(num_eval_qubits, multivariate_cvar)\n",
"# result_cvar = ae_cvar.run(quantum_instance=BasicAer.get_backend('qasm_simulator'), shots=100)\n",
"result_cvar = ae_cvar.run(quantum_instance=BasicAer.get_backend('statevector_simulator'))\n"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "prYSohkbJp57",
"outputId": "9e9b203b-07c5-4fef-e7b7-939636fa0e12"
},
"source": [
"# print results\n",
"print('Exact CVaR: \\t%.4f' % exact_cvar)\n",
"print('Estimated CVaR:\\t%.4f' % (result_cvar['estimation'] / (1.0 - bisection_result['value']) + var))\n",
"print('Probability: \\t%.4f' % result_cvar['max_probability'])"
],
"execution_count": null,
"outputs": [
{
"output_type": "stream",
"text": [
"Exact CVaR: \t3.0000\n",
"Estimated CVaR:\t3.8670\n",
"Probability: \t0.7146\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "7UiDUoIkJp57",
"outputId": "f7dc14d6-0239-4cbd-9bec-efcd599ccdc9"
},
"source": [
"# plot estimated values for \"a\"\n",
"plt.bar(result_cvar['values'], result_cvar['probabilities'], width=0.5/len(result_cvar['probabilities']))\n",
"plt.xticks([0, 0.25, 0.5, 0.75, 1], size=15)\n",
"plt.yticks([0, 0.25, 0.5, 0.75, 1], size=15)\n",
"plt.title('\"a\" Value', size=15)\n",
"plt.ylabel('Probability', size=15)\n",
"plt.ylim((0,1))\n",
"plt.grid()\n",
"plt.show()\n",
"\n",
"# plot estimated values for expected loss (after re-scaling and reversing the c_approx-transformation)\n",
"normalized_values = np.array(result_cvar['mapped_values']) / (1.0 - bisection_result['value']) + var\n",
"plt.bar(normalized_values, result_cvar['probabilities'])\n",
"plt.axvline(exact_cvar, color='red', linestyle='--', linewidth=2)\n",
"plt.xticks(size=15)\n",
"plt.yticks([0, 0.25, 0.5, 0.75, 1], size=15)\n",
"plt.title('CvaR', size=15)\n",
"plt.ylabel('Probability', size=15)\n",
"plt.ylim((0,1))\n",
"plt.grid()\n",
"plt.show()"
],
"execution_count": null,
"outputs": [
{
"output_type": "display_data",
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"tags": [],
"needs_background": "light"
}
},
{
"output_type": "display_data",
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"tags": [],
"needs_background": "light"
}
}
]
},
{
"cell_type": "code",
"metadata": {
"ExecuteTime": {
"end_time": "2019-08-22T01:56:12.651056Z",
"start_time": "2019-08-22T01:56:12.640412Z"
},
"id": "Ax1vl34lJp58",
"outputId": "c4834510-86d4-4c5a-ada1-c9ffe16e01e1"
},
"source": [
"import qiskit.tools.jupyter\n",
"%qiskit_version_table\n",
"%qiskit_copyright"
],
"execution_count": null,
"outputs": [
{
"output_type": "display_data",
"data": {
"text/html": [
"<h3>Version Information</h3><table><tr><th>Qiskit Software</th><th>Version</th></tr><tr><td>Qiskit</td><td>None</td></tr><tr><td>Terra</td><td>0.9.0</td></tr><tr><td>Aer</td><td>0.3.0</td></tr><tr><td>Ignis</td><td>0.2.0</td></tr><tr><td>Aqua</td><td>0.5.6</td></tr><tr><td>IBM Q Provider</td><td>0.3.2rc1</td></tr><tr><th>System information</th></tr><tr><td>Python</td><td>3.7.4 (default, Aug 13 2019, 15:17:50) \n",
"[Clang 4.0.1 (tags/RELEASE_401/final)]</td></tr><tr><td>OS</td><td>Darwin</td></tr><tr><td>CPUs</td><td>4</td></tr><tr><td>Memory (Gb)</td><td>16.0</td></tr><tr><td colspan='2'>Wed Aug 21 21:56:12 2019 EDT</td></tr></table>"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {
"tags": []
}
},
{
"output_type": "display_data",
"data": {
"text/html": [
"<div style='width: 100%; background-color:#d5d9e0;padding-left: 10px; padding-bottom: 10px; padding-right: 10px; padding-top: 5px'><h3>This code is a part of Qiskit</h3><p>&copy; Copyright IBM 2017, 2019.</p><p>This code is licensed under the Apache License, Version 2.0. You may<br>obtain a copy of this license in the LICENSE.txt file in the root directory<br> of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.<p>Any modifications or derivative works of this code must retain this<br>copyright notice, and modified files need to carry a notice indicating<br>that they have been altered from the originals.</p></div>"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {
"tags": []
}
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "V4Z5wuT2Jp58"
},
"source": [],
"execution_count": null,
"outputs": []
}
]
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment