Skip to content

Option Pricing Using Amplitude Estimation

This notebook demonstrates how to use the construct_finance_model function, which constructs an option pricing model. For more comprehensive explanation on the algorithm see Option Pricing notebook.

Option pricing deals with evaluating average values \(E[f(x)]\), where \(f\) is some financial payoff function, and the probability distribution is given. A quantum algorithm for this task is the Amplitude Estimation algorithm, which can estimate the average with a convergence rate of \(\Omega(1/M^{1/2})\), compared to \(\Omega(1/M)\) in the classical case, where \(M\) is the number of Grover iterations in the quantum case and the number of the Monte Carlo samples in the classical case. This represents a theoretical quadratic speed-up of the quantum method over classical Monte Carlo methods.

1. Defining a Financial Function Input

First, we define the probability distribution. The constructor function supports two different built-in functions, a log-normal distribution, or a Gaussian one. In the example below we choose the former:

from classiq.applications.finance import log_normal_model_input

num_qubits = 5
mu = 0.7
sigma = 0.13

log_normal_model = log_normal_model_input.LogNormalModelInput(
    num_qubits=num_qubits, mu=mu, sigma=sigma
)

Next, we define the payoff function. The constructor supports two built-in payoff functions: European Call Option or Value at Risk:

$f_{\rm european}(S)=\ \Bigg{\begin{array}{lr} 0, & \text{when } K\geq S\ S - K, & \text{when } K < S\end{array}, $

$f_{\rm var}(S)=\ \Bigg{\begin{array}{lr} 0, & \text{when } K\geq S\ 1, & \text{when } K < S\end{array}. $

This notebook demonstrates for the European Call Option.

from classiq.applications.finance import function_input

threshold = 2

condition = function_input.FunctionCondition(threshold=threshold, larger=True)
finance_function = function_input.FinanceFunctionInput(
    f="european call option",
    condition=condition,
)

2. Constructing and Synthesizing a Finance Model

Finally, we construct the model using the construct_finance_model function. We pass the phase_port_size which will set the accuracy of the calculation.

from classiq import construct_finance_model

qmod = construct_finance_model(
    finance_model_input=log_normal_model,
    finance_function_input=finance_function,
    phase_port_size=1,
)
from classiq import write_qmod

write_qmod(qmod, "option_pricing")

We synthesize and visualize the circuit

from classiq import show, synthesize

qprog = synthesize(qmod)
show(qprog)
Opening: https://platform.classiq.io/circuit/a57d2c5e-b2e1-4918-8c4c-7ca30fb27d56?version=0.41.0.dev39%2B79c8fd0855

3. Executing to Find the Average Value

from classiq import execute

results = execute(qprog).result()

Printing out the result estimation of the options price :

print(results[1].name, ":", results[1].value)
estimation : 0.3509999999999999