{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Option Pricing with qGANs\n", "\n", "\n", "## Introduction\n", "In this notebook, we discuss how a Quantum Machine Learning Algorithm, namely a quantum Generative Adversarial Network (qGAN), can facilitate the pricing of a European call option. More specifically, a qGAN can be trained such that a quantum circuit models the spot price of an asset underlying a European call option. The resulting model can then be integrated into a Quantum Amplitude Estimation based algorithm to evaluate the expected payoff - see [European Call Option Pricing](03_european_call_option_pricing.ipynb).
\n", "For further details on learning and loading random distributions by training a qGAN please refer to [Quantum Generative Adversarial Networks for Learning and Loading Random Distributions. Zoufal, Lucchi, Woerner. 2019.](https://www.nature.com/articles/s41534-019-0223-2)" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "ExecuteTime": { "end_time": "2020-07-13T20:54:15.112855Z", "start_time": "2020-07-13T20:54:04.404067Z" } }, "outputs": [], "source": [ "import matplotlib.pyplot as plt\n", "import numpy as np\n", "\n", "from qiskit.circuit import ParameterVector\n", "from qiskit.circuit.library import TwoLocal\n", "from qiskit.quantum_info import Statevector\n", "\n", "from qiskit_algorithms import IterativeAmplitudeEstimation, EstimationProblem\n", "from qiskit_aer.primitives import Sampler\n", "from qiskit_finance.applications.estimation import EuropeanCallPricing\n", "from qiskit_finance.circuit.library import NormalDistribution" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Uncertainty Model\n", "\n", "The Black-Scholes model assumes that the spot price at maturity $S_T$ for a European call option is log-normally distributed. Thus, we can train a qGAN on samples from a log-normal distribution and use the result as an uncertainty model underlying the option.\n", "
\n", "In the following, we construct a quantum circuit that loads the uncertainty model. The circuit output reads \n", "\n", "$$ \\big| g_{\\theta}\\rangle = \\sum_{j=0}^{2^n-1}\\sqrt{p_{\\theta}^{j}} \\big| j \\rangle , $$\n", "\n", "where the probabilities $p_{\\theta}^{j}$, for $j\\in \\left\\{0, \\ldots, {2^n-1} \\right\\}$, represent a model of the target distribution." ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "ExecuteTime": { "end_time": "2020-07-13T20:54:15.146155Z", "start_time": "2020-07-13T20:54:15.115128Z" } }, "outputs": [], "source": [ "# Set upper and lower data values\n", "bounds = np.array([0.0, 7.0])\n", "# Set number of qubits used in the uncertainty model\n", "num_qubits = 3\n", "\n", "# Load the trained circuit parameters\n", "g_params = [0.29399714, 0.38853322, 0.9557694, 0.07245791, 6.02626428, 0.13537225]\n", "\n", "# Set an initial state for the generator circuit\n", "init_dist = NormalDistribution(num_qubits, mu=1.0, sigma=1.0, bounds=bounds)\n", "\n", "# construct the variational form\n", "var_form = TwoLocal(num_qubits, \"ry\", \"cz\", entanglement=\"circular\", reps=1)\n", "\n", "# keep a list of the parameters so we can associate them to the list of numerical values\n", "# (otherwise we need a dictionary)\n", "theta = var_form.ordered_parameters\n", "\n", "# compose the generator circuit, this is the circuit loading the uncertainty model\n", "g_circuit = init_dist.compose(var_form)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Evaluate Expected Payoff\n", "Now, the trained uncertainty model can be used to evaluate the expectation value of the option's payoff function with Quantum Amplitude Estimation." ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "ExecuteTime": { "end_time": "2020-07-13T20:54:15.153755Z", "start_time": "2020-07-13T20:54:15.149598Z" } }, "outputs": [], "source": [ "# set the strike price (should be within the low and the high value of the uncertainty)\n", "strike_price = 2\n", "\n", "# set the approximation scaling for the payoff function\n", "c_approx = 0.25" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Plot the probability distribution\n", "Next, we plot the trained probability distribution and, for reasons of comparison, also the target probability distribution." ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "ExecuteTime": { "end_time": "2020-07-13T20:54:15.764662Z", "start_time": "2020-07-13T20:54:15.156034Z" }, "tags": [ "nbsphinx-thumbnail" ] }, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAZwAAAERCAYAAABPbxE/AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/YYfK9AAAACXBIWXMAAAsTAAALEwEAmpwYAABO/UlEQVR4nO2dd5gUVda43zOkIWdBBCQoGSQMCIoC4poVE2KW1V1U1nX302XX9dtV1PX7mXNajIurYsKsawJERESyhAFEkOSSh2FgBhj6/P64NdBd0z3dPdNhwnmfp56euvfWrVM13XXq3nPuOaKqGIZhGEayyUi3AIZhGEbVwBSOYRiGkRJM4RiGYRgpwRSOYRiGkRJM4RiGYRgpwRSOYRiGkRLSrnBEpJuIfCkie0Rko4jcKSLVohzTXUT+47XfKyJrReQ5ETk8TNsRIvKDiBSIyFIRGZW8qzEMwzAiUT2dJxeRxsAXwFJgBNAReBCnCP9WwqENgdXARGAj0B64HegnIv1VtdDrfzDwNvAUcCNwBvCaiOxQ1c+SclGGYRhGWCSdCz9F5K/An4EjVTXXK/szMB5oWVQWY1+/Aj4D+qnqPK/sU6CGqp4U1O5joIGqDo7WZ7NmzbRdu3axX1AJ7N69m7p16yakr2RSUeSEiiOryZlYKoqcUHFkTaScc+fO3aqqzcNWqmraNmA6MMlX1hZQ4Ow4++rrHTfQ268F7AOu87W7EjgANIzWZ79+/TRRTJ06NWF9JZOKIqdqxZHV5EwsFUVO1YojayLlBOZohGdqum04XYDs4AJVXQvs8epKREQyRKSmiHQG7gG+B2Z71R2BGv7+gWW4KbtOZRPdMAzDiId0K5zGQE6Y8h1eXTQ+BvbilEoT4CxVDQT1TZj+d/jqDcMwjBSQbhvOfmCcqj7iK18PTFTVW6McfzRO0RyNczLYDRyvqgUicjwwA+ijqguCjjkKWAmcqmEcB0RkDDAGoEWLFv0mTZpU+gsMIi8vj3r16iWkr2RSUeSEiiOryZlYKoqcUHFkTaScw4YNm6uqWeHq0uqlhhttNAxT3phDI5GIqOpK78/vRORrnOfapcALQcf7+y8a2YTtX1UnABMAsrKydOjQodHEiIlp06aRqL6SSUWREyqOrJVJzv3797N+/XoKCgpSI1QYGjZsSGZmZtrOHw8VRdbSyJmZmUnr1q2pUaNGzMekW+Fk47PViEgboA7FbS8loqo/i8h2oINXtArY7/X/VVDTLkAAWFFKmQ2jyrJ+/Xrq169Pu3btEJG0yLBr1y7q16+flnPHS0WRNV45VZVt27axfv162rdvH/Nx6bbhfAKcKiLBVzoKyCdUSUTFcxxoihvloKp7ganASF/TUcC3qrqztEIbRlWloKCApk2bRlU2qvBdLoxcAnWnQ8Y093nREpid6+qNiouI0LRp07hHuuke4TyDW5A5WUTuxY1OxgMPadAaHBH5EfhKVa/x9h8ACoHvcE4BXXHreVYBwUaXu4BpIvII8C5u4ecZwGlJvCbDqNREUzb7A3BlNry/FQoCbjoBYE8A3t4CH2+Ds5vBxC5QI92vvEapKc0IN63/blXdAQwHqgEfAHcAD+OiBgRT3WtTxBzgBOB54COc0nobtwZnd1D/M4ALgZOBT4FzgEvDOQsYhlF2VA8pmz1ByqaIALA7AO9tde3iHenk5OTw7LPPJkrcEnn33XdZunRpTG2LDO4bN27kwgsvjNguJyeHp556qsS+jjvuOMDZ1M4666wYpXX4Zb7tttv44osv4uojmaR7hIOqLgVOitKmnW9/EqEjmZKOfRc3ujHCcNLYtSH7Fw/cx52+silPtU2lSEYFZvYu+MBTNiWRH3Dtvt8FAxrE3n9OTg7PPfccN910U8zHHFx0mBHf+/W7777LWWedRbdu3WI+plWrVrz11lsR64sUztixY4vVFRYWUr16dWbOnBmXnMH4Zb7zzjtL3VcysAGtYRhxI9PCbwPnuRFMLOwOwLHzwvcTiVtuuYXVq1fTu3dvxo0bR15eHsOHD6dv37707NmT9957D4A1a9bQuXNnrrzySnr06MG6deu466676Ny5M4MHD+aSSy7hgQceAGDVqlWcdtpp9OvXjxNOOIHs7GxmzpzJ+++/z7hx4+jduzerVq0KkWP16tUMGjSInj178re/HQr7uGbNGnr06AHAkiVLGDp0KL1796ZXr16sXLmSW265hVWrVh2Uf9q0aZxwwgmcc845B5VEsHtybm4uZ555Jp07d+a6664jEAgUa/PWW28xevTosDKPHj36oAL88ssv6dOnDz179uTqq69m7969ALRr146777774D3Mzo7LXysuTOEYhlFhuOeee2jfvj0LFizg/vvvJzMzk3feeYd58+YxdepUbr755qIQVqxcuZKxY8eyZMkSNm/ezNtvv83ChQv55JNPmDNnzsE+x4wZw+OPP87cuXN54IEHGDt2LMcddxznnHMO999/PwsWLKBjx44hcvzhD3/g+uuv54cffuDww4sFqQfgmWee4frrr2fBggXMmTOH1q1bc88999CxY8eD8gPMmzePRx99lBUrijvOzp49m8cff5ylS5eyatUqJk+eHPHelCRzQUEBo0eP5vXXX+eHH36gsLCQp59++mB906ZNmTdvHtdff/1BRZwMTOEYhlFhUVVuvfVWevXqxcknn8yGDRvYtGkTAEceeSQDBw4E4JtvvmHEiBFkZmZSv359zj77bMAteJw5cyYjR46kd+/eXHvttfzyyy9Rz/vNN99wySWXAHDFFVeEbTNo0CAefPBB7r33Xn7++Wdq164dtt2AAQMiuhYPGDCADh06UK1aNS655BJmzJgRVbZwLF++nPbt29Opk4voddVVVzF9+vSD9eeccw4A/fr1Y82aNaU6Ryyk3YZjGIZRWl555RW2bNnC3LlzqVGjBu3atTvoqhtL9ONAIECjRo1YsGBB3OeO5qV16aWX0r17d7766ivOOOMM/vnPf9KhQ4di7UqS03+Oov3g8kQswq1VqxYA1apVo7CwsMz9RcJGOIZhxI0ODb+NbB77QyUDuKh5+H4iUb9+ffLy8g7u79y5k8MOO4waNWowdepUfv7557DHHX/88XzwwQcUFBSQl5fHhx9+CECDBg1o3749b775prsuVRYuXHjwXLt27YrYX1HYq1deeSVsm59++on27dtz4403MmLECBYtWlRin+GYPXs2q1evJhAI8PrrrzN4sMuq0qJFC5YtW0YgEOCdd94JuT/h+u/cuTNr1qzhxx9/BODll19myJAhMcuRKEzhVHEU2NmkJosHNeOr81tzbZtf8dX5rVk8sCm5TWpi6/OMeLi5DdSO8amSmeHax0PTpk059thj6dGjB+PGjeOyyy5jzpw59OzZk4kTJ9KlS/gg8/379+ecc86hV69enH766fTs2ZOGDV3Uq1deeYXnn3+eY445hu7dux90PLj44ou5//776dOnTzGngUcffZQnn3ySnj17smHDhrDnfOONNzj22GPp3bs3ixcv5sorr6Rp06Ycf/zxB+WPRv/+/bnhhhvo2rUr7du357zzzgOcLeuss87iuOOOC7EhRZI5MzOT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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# Evaluate trained probability distribution\n", "values = [\n", " bounds[0] + (bounds[1] - bounds[0]) * x / (2**num_qubits - 1) for x in range(2**num_qubits)\n", "]\n", "uncertainty_model = g_circuit.assign_parameters(dict(zip(theta, g_params)))\n", "amplitudes = Statevector.from_instruction(uncertainty_model).data\n", "\n", "x = np.array(values)\n", "y = np.abs(amplitudes) ** 2\n", "\n", "# Sample from target probability distribution\n", "N = 100000\n", "log_normal = np.random.lognormal(mean=1, sigma=1, size=N)\n", "log_normal = np.round(log_normal)\n", "log_normal = log_normal[log_normal <= 7]\n", "log_normal_samples = []\n", "for i in range(8):\n", " log_normal_samples += [np.sum(log_normal == i)]\n", "log_normal_samples = np.array(log_normal_samples / sum(log_normal_samples))\n", "\n", "# Plot distributions\n", "plt.bar(x, y, width=0.2, label=\"trained distribution\", color=\"royalblue\")\n", "plt.xticks(x, size=15, rotation=90)\n", "plt.yticks(size=15)\n", "plt.grid()\n", "plt.xlabel(\"Spot Price at Maturity $S_T$ (\\$)\", size=15)\n", "plt.ylabel(\"Probability ($\\%$)\", size=15)\n", "plt.plot(\n", " log_normal_samples,\n", " \"-o\",\n", " color=\"deepskyblue\",\n", " label=\"target distribution\",\n", " linewidth=4,\n", " markersize=12,\n", ")\n", "plt.legend(loc=\"best\")\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Evaluate Expected Payoff\n", "Now, the trained uncertainty model can be used to evaluate the expectation value of the option's payoff function analytically and with Quantum Amplitude Estimation." ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "ExecuteTime": { "end_time": "2020-07-13T20:54:35.397951Z", "start_time": "2020-07-13T20:54:15.766834Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Analytically calculated expected payoff w.r.t. the target distribution: 1.0611\n", "Analytically calculated expected payoff w.r.t. the trained distribution: 0.9805\n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# Evaluate payoff for different distributions\n", "payoff = np.array([0, 0, 0, 1, 2, 3, 4, 5])\n", "ep = np.dot(log_normal_samples, payoff)\n", "print(\"Analytically calculated expected payoff w.r.t. the target distribution: %.4f\" % ep)\n", "ep_trained = np.dot(y, payoff)\n", "print(\"Analytically calculated expected payoff w.r.t. the trained distribution: %.4f\" % ep_trained)\n", "\n", "# Plot exact payoff function (evaluated on the grid of the trained uncertainty model)\n", "x = np.array(values)\n", "y_strike = np.maximum(0, x - strike_price)\n", "plt.plot(x, y_strike, \"ro-\")\n", "plt.grid()\n", "plt.title(\"Payoff Function\", size=15)\n", "plt.xlabel(\"Spot Price\", size=15)\n", "plt.ylabel(\"Payoff\", size=15)\n", "plt.xticks(x, size=15, rotation=90)\n", "plt.yticks(size=15)\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [], "source": [ "# construct circuit for payoff function\n", "european_call_pricing = EuropeanCallPricing(\n", " num_qubits,\n", " strike_price=strike_price,\n", " rescaling_factor=c_approx,\n", " bounds=bounds,\n", " uncertainty_model=uncertainty_model,\n", ")" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [], "source": [ "# set target precision and confidence level\n", "epsilon = 0.01\n", "alpha = 0.05\n", "\n", "problem = european_call_pricing.to_estimation_problem()\n", "# construct amplitude estimation\n", "ae = IterativeAmplitudeEstimation(\n", " epsilon_target=epsilon, alpha=alpha, sampler=Sampler(run_options={\"shots\": 100, \"seed\": 75})\n", ")" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [], "source": [ "result = ae.estimate(problem)" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Exact value: \t0.9805\n", "Estimated value: \t1.0138\n", "Confidence interval:\t[0.9883, 1.0394]\n" ] } ], "source": [ "conf_int = np.array(result.confidence_interval_processed)\n", "print(\"Exact value: \\t%.4f\" % ep_trained)\n", "print(\"Estimated value: \\t%.4f\" % (result.estimation_processed))\n", "print(\"Confidence interval:\\t[%.4f, %.4f]\" % tuple(conf_int))" ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "ExecuteTime": { "end_time": "2020-07-13T20:54:35.972442Z", "start_time": "2020-07-13T20:54:35.400448Z" } }, "outputs": [ { "data": { "text/html": [ "

Version Information

SoftwareVersion
qiskitNone
qiskit-terra0.45.0.dev0+c626be7
qiskit_algorithms0.2.0
qiskit_aer0.12.0
qiskit_optimization0.6.0
qiskit_finance0.4.0
qiskit_ibm_provider0.6.1
System information
Python version3.9.7
Python compilerGCC 7.5.0
Python builddefault, Sep 16 2021 13:09:58
OSLinux
CPUs2
Memory (Gb)5.778430938720703
Fri Aug 18 16:26:01 2023 EDT
" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "

This code is a part of Qiskit

© Copyright IBM 2017, 2023.

This code is licensed under the Apache License, Version 2.0. You may
obtain a copy of this license in the LICENSE.txt file in the root directory
of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.

Any modifications or derivative works of this code must retain this
copyright notice, and modified files need to carry a notice indicating
that they have been altered from the originals.

" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import tutorial_magics\n", "\n", "%qiskit_version_table\n", "%qiskit_copyright" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "celltoolbar": "Tags", "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.9.7" }, "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 }, "vscode": { "interpreter": { "hash": "e3b168dd14084693aa742087410f9921d6040e41eb6bdb17b20e4003862f82dd" } } }, "nbformat": 4, "nbformat_minor": 2 }