Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions pyproject.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
[tool.black]
line-length = 100
target-version = ['py36', 'py37', 'py38', 'py39']
Original file line number Diff line number Diff line change
Expand Up @@ -28,9 +28,7 @@ class PortfolioDiversification(OptimizationApplication):
[1]: GG. Cornuejols and R. Tutuncu, Optimization methods in finance, 2006
"""

def __init__(
self, similarity_matrix: np.ndarray, num_assets: int, num_clusters: int
) -> None:
def __init__(self, similarity_matrix: np.ndarray, num_assets: int, num_clusters: int) -> None:
"""
Args:
similarity_matrix: An asset-to-asset similarity matrix, such as the covariance matrix.
Expand Down Expand Up @@ -63,9 +61,7 @@ def to_quadratic_program(self) -> QuadraticProgram:
for j in range(self._num_assets)
)
)
mdl.add_constraint(
mdl.sum(y[j] for j in range(self._num_assets)) == self._num_clusters
)
mdl.add_constraint(mdl.sum(y[j] for j in range(self._num_assets)) == self._num_clusters)
for i in range(self._num_assets):
mdl.add_constraint(mdl.sum(x[(i, j)] for j in range(self._num_assets)) == 1)
for j in range(self._num_assets):
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -67,9 +67,7 @@ def to_quadratic_program(self) -> QuadraticProgram:
op.from_docplex(mdl)
return op

def portfolio_expected_value(
self, result: Union[OptimizationResult, np.ndarray]
) -> float:
def portfolio_expected_value(self, result: Union[OptimizationResult, np.ndarray]) -> float:
"""Returns the portfolio expected value based on the result.

Args:
Expand All @@ -81,9 +79,7 @@ def portfolio_expected_value(
x = self._result_to_x(result)
return np.dot(self._expected_returns, x)

def portfolio_variance(
self, result: Union[OptimizationResult, np.ndarray]
) -> float:
def portfolio_variance(self, result: Union[OptimizationResult, np.ndarray]) -> float:
"""Returns the portfolio variance based on the result

Args:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,18 +35,14 @@ def __init__(
"""
# map strike price to {0, ..., 2^n-1}
num_values = 2 ** num_state_qubits
strike_price = (
(strike_price - bounds[0]) / (bounds[1] - bounds[0]) * (num_values - 1)
)
strike_price = (strike_price - bounds[0]) / (bounds[1] - bounds[0]) * (num_values - 1)
strike_price = int(np.ceil(strike_price))

# create comparator
comparator = IntegerComparator(num_state_qubits, strike_price)

# initialize circuit
qr_state = QuantumRegister(
comparator.num_qubits - comparator.num_ancillas, "state"
)
qr_state = QuantumRegister(comparator.num_qubits - comparator.num_ancillas, "state")
qr_work = QuantumRegister(comparator.num_ancillas, "work")
super().__init__(qr_state, qr_work, name="ECD")

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -79,12 +79,7 @@ def __init__(
g = np.zeros(dimensions)
for t in range(time_steps):
h += cash_flow[t] / (1 + initial_interests[t]) ** (t + 1)
g += (
-(t + 1)
* cash_flow[t]
* pca_matrix[t, :]
/ (1 + initial_interests[t]) ** (t + 2)
)
g += -(t + 1) * cash_flow[t] * pca_matrix[t, :] / (1 + initial_interests[t]) ** (t + 2)

# compute overall offset using lower bound for x (corresponding to x = min)
low = [bound[0] for bound in bounds]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -129,12 +129,10 @@ def __init__(
# indexing 'ij' yields the "column-based" indexing
meshgrid = np.meshgrid(
*[
np.linspace(
bound[0], bound[1], num=2 ** num_qubits[i] # type: ignore
)
np.linspace(bound[0], bound[1], num=2 ** num_qubits[i]) # type: ignore
for i, bound in enumerate(bounds)
],
indexing="ij"
indexing="ij",
)
# flatten into a list of points
x = list(zip(*[grid.flatten() for grid in meshgrid])) # type: ignore
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -176,12 +176,10 @@ def __init__(
# indexing 'ij' yields the "column-based" indexing
meshgrid = np.meshgrid(
*[
np.linspace(
bound[0], bound[1], num=2 ** num_qubits[i] # type: ignore
)
np.linspace(bound[0], bound[1], num=2 ** num_qubits[i]) # type: ignore
for i, bound in enumerate(bounds)
],
indexing="ij"
indexing="ij",
)
# flatten into a list of points
x = list(zip(*[grid.flatten() for grid in meshgrid]))
Expand Down Expand Up @@ -225,9 +223,7 @@ def bounds(self) -> Union[Tuple[float, float], List[Tuple[float, float]]]:


def _check_dimensions_match(num_qubits, mu, sigma, bounds):
num_qubits = (
[num_qubits] if not isinstance(num_qubits, (list, np.ndarray)) else num_qubits
)
num_qubits = [num_qubits] if not isinstance(num_qubits, (list, np.ndarray)) else num_qubits
dim = len(num_qubits)

if mu is not None:
Expand Down
8 changes: 2 additions & 6 deletions qiskit_finance/data_providers/_base_data_provider.py
Original file line number Diff line number Diff line change
Expand Up @@ -110,9 +110,7 @@ def get_period_return_mean_vector(self) -> np.ndarray:
"No data loaded, yet. Please run the method run() first to load the data."
) from ex
_div_func = np.vectorize(BaseDataProvider._divide)
period_returns = (
_div_func(np.array(self._data)[:, 1:], np.array(self._data)[:, :-1]) - 1
)
period_returns = _div_func(np.array(self._data)[:, 1:], np.array(self._data)[:, :-1]) - 1
self.period_return_mean = cast(np.ndarray, np.mean(period_returns, axis=1))
return self.period_return_mean

Expand Down Expand Up @@ -158,9 +156,7 @@ def get_period_return_covariance_matrix(self) -> np.ndarray:
"No data loaded, yet. Please run the method run() first to load the data."
) from ex
_div_func = np.vectorize(BaseDataProvider._divide)
period_returns = (
_div_func(np.array(self._data)[:, 1:], np.array(self._data)[:, :-1]) - 1
)
period_returns = _div_func(np.array(self._data)[:, 1:], np.array(self._data)[:, :-1]) - 1
self.period_return_cov = np.cov(period_returns)
return self.period_return_cov

Expand Down
4 changes: 1 addition & 3 deletions qiskit_finance/data_providers/data_on_demand_provider.py
Original file line number Diff line number Diff line change
Expand Up @@ -109,7 +109,5 @@ def run(self) -> None:
price_evolution.append(q["ask_price"])
self._data.append(price_evolution)
except Exception as ex: # pylint: disable=broad-except
raise QiskitFinanceError(
"Accessing NASDAQ Data on Demand failed."
) from ex
raise QiskitFinanceError("Accessing NASDAQ Data on Demand failed.") from ex
http.clear()
14 changes: 3 additions & 11 deletions qiskit_finance/data_providers/exchange_data_provider.py
Original file line number Diff line number Diff line change
Expand Up @@ -104,9 +104,7 @@ def run(self) -> None:
stock_data = None
name = self._stockmarket + "/" + ticker_name
try:
stock_data = quandl.get(
name, start_date=self._start, end_date=self._end
)
stock_data = quandl.get(name, start_date=self._start, end_date=self._end)
except quandl.AuthenticationError as ex:
raise QiskitFinanceError("Quandl invalid token.") from ex
except quandl.NotFoundError as ex:
Expand All @@ -120,16 +118,10 @@ def run(self) -> None:
try:
self._data.append(stock_data["Close"])
except KeyError as ex:
raise QiskitFinanceError(
"Cannot parse Quandl '{}'output.".format(name)
) from ex
raise QiskitFinanceError("Cannot parse Quandl '{}'output.".format(name)) from ex

if stocks_notfound or stocks_forbidden:
err_msg = (
"Stocks not found: {}. ".format(stocks_notfound)
if stocks_notfound
else ""
)
err_msg = "Stocks not found: {}. ".format(stocks_notfound) if stocks_notfound else ""
if stocks_forbidden:
err_msg += (
"You do not have permission to view this data. "
Expand Down
10 changes: 4 additions & 6 deletions qiskit_finance/data_providers/random_data_provider.py
Original file line number Diff line number Diff line change
Expand Up @@ -79,15 +79,13 @@ def run(self) -> None:
generator = np.random.default_rng(self._seed)
self._data = []
for _ in self._tickers:
d_f = pd.DataFrame(
generator.standard_normal(length)
).cumsum() + generator.integers(1, 101)
d_f = pd.DataFrame(generator.standard_normal(length)).cumsum() + generator.integers(
1, 101
)
trimmed = np.maximum(d_f[0].values, np.zeros(len(d_f[0].values)))
trimmed_list = trimmed.tolist()
# find index of first 0 element
zero_idx = next(
(idx for idx, val in enumerate(trimmed_list) if val == 0), -1
)
zero_idx = next((idx for idx, val in enumerate(trimmed_list) if val == 0), -1)
if zero_idx >= 0:
# set to 0 all values after first 0
trimmed_list = [
Expand Down
4 changes: 1 addition & 3 deletions qiskit_finance/data_providers/wikipedia_data_provider.py
Original file line number Diff line number Diff line change
Expand Up @@ -89,9 +89,7 @@ def run(self) -> None:
stock_data = None
name = "WIKI" + "/" + ticker_name
try:
stock_data = quandl.get(
name, start_date=self._start, end_date=self._end
)
stock_data = quandl.get(name, start_date=self._start, end_date=self._end)
except quandl.AuthenticationError as ex:
raise QiskitFinanceError("Quandl invalid token.") from ex
except quandl.NotFoundError as ex:
Expand Down
4 changes: 1 addition & 3 deletions test/applications/test_european_call_pricing.py
Original file line number Diff line number Diff line change
Expand Up @@ -61,9 +61,7 @@ def test_to_estimation_problem(self):
self.assertEqual(est_problem.objective_qubits, [num_qubits])
self.assertTrue(Operator(est_problem.state_preparation).equiv(expected_circ))
# pylint: disable=not-callable
self.assertEqual(
linear_function.post_processing(0.5), est_problem.post_processing(0.5)
)
self.assertEqual(linear_function.post_processing(0.5), est_problem.post_processing(0.5))


if __name__ == "__main__":
Expand Down
24 changes: 6 additions & 18 deletions test/applications/test_portfolio_diversification.py
Original file line number Diff line number Diff line change
Expand Up @@ -51,19 +51,13 @@ def assertEqualQuadraticProgram(self, actual, expected):
# Test objective
self.assertEqual(actual.objective.sense, expected.objective.sense)
self.assertEqual(actual.objective.constant, expected.objective.constant)
self.assertDictEqual(
actual.objective.linear.to_dict(), expected.objective.linear.to_dict()
)
self.assertDictEqual(actual.objective.linear.to_dict(), expected.objective.linear.to_dict())
self.assertDictEqual(
actual.objective.quadratic.to_dict(), expected.objective.quadratic.to_dict()
)
# Test constraint
self.assertEqual(
len(actual.linear_constraints), len(expected.linear_constraints)
)
for act_lin, exp_lin in zip(
actual.linear_constraints, expected.linear_constraints
):
self.assertEqual(len(actual.linear_constraints), len(expected.linear_constraints))
for act_lin, exp_lin in zip(actual.linear_constraints, expected.linear_constraints):
self.assertEqual(act_lin.sense, exp_lin.sense)
self.assertEqual(act_lin.rhs, exp_lin.rhs)
self.assertEqual(act_lin.linear.to_dict(), exp_lin.linear.to_dict())
Expand Down Expand Up @@ -96,12 +90,8 @@ def test_to_quadratic_program(self):
linear = {"x_0_0": 1, "x_0_1": 0.8, "x_1_0": 0.8, "x_1_1": 1}
expected_op.maximize(linear=linear)
expected_op.linear_constraint(linear={"y_0": 1, "y_1": 1}, sense="==", rhs=1)
expected_op.linear_constraint(
linear={"x_0_0": 1, "x_0_1": 1}, sense="==", rhs=1
)
expected_op.linear_constraint(
linear={"x_1_0": 1, "x_1_1": 1}, sense="==", rhs=1
)
expected_op.linear_constraint(linear={"x_0_0": 1, "x_0_1": 1}, sense="==", rhs=1)
expected_op.linear_constraint(linear={"x_1_0": 1, "x_1_1": 1}, sense="==", rhs=1)
expected_op.linear_constraint(linear={"x_0_0": 1, "y_0": -1}, sense="==", rhs=0)
expected_op.linear_constraint(linear={"x_1_1": 1, "y_1": -1}, sense="==", rhs=0)
expected_op.linear_constraint(linear={"x_0_0": 1, "y_0": -1}, sense="<=", rhs=0)
Expand All @@ -128,9 +118,7 @@ def test_smilarity_matrix(self):
num_clusters=self.q,
)
portfolio_diversification.similarity_matrix = np.array([[0, 1], [1, 0]])
self.assertEqual(
portfolio_diversification.similarity_matrix.tolist(), [[0, 1], [1, 0]]
)
self.assertEqual(portfolio_diversification.similarity_matrix.tolist(), [[0, 1], [1, 0]])

def test_num_assets(self):
"""test num_assets"""
Expand Down
16 changes: 4 additions & 12 deletions test/applications/test_portfolio_optimization.py
Original file line number Diff line number Diff line change
Expand Up @@ -53,19 +53,13 @@ def assertEqualQuadraticProgram(self, actual, expected):
# Test objective
self.assertEqual(actual.objective.sense, expected.objective.sense)
self.assertEqual(actual.objective.constant, expected.objective.constant)
self.assertDictEqual(
actual.objective.linear.to_dict(), expected.objective.linear.to_dict()
)
self.assertDictEqual(actual.objective.linear.to_dict(), expected.objective.linear.to_dict())
self.assertDictEqual(
actual.objective.quadratic.to_dict(), expected.objective.quadratic.to_dict()
)
# Test constraint
self.assertEqual(
len(actual.linear_constraints), len(expected.linear_constraints)
)
for act_lin, exp_lin in zip(
actual.linear_constraints, expected.linear_constraints
):
self.assertEqual(len(actual.linear_constraints), len(expected.linear_constraints))
for act_lin, exp_lin in zip(actual.linear_constraints, expected.linear_constraints):
self.assertEqual(act_lin.sense, exp_lin.sense)
self.assertEqual(act_lin.rhs, exp_lin.rhs)
self.assertEqual(act_lin.linear.to_dict(), exp_lin.linear.to_dict())
Expand Down Expand Up @@ -115,9 +109,7 @@ def test_portfolio_expected_value(self):
)
result_x = np.array([0, 1, 0, 1])
expected_value = np.dot(self.expected_returns, result_x)
self.assertEqual(
portfolio_optimization.portfolio_expected_value(result_x), expected_value
)
self.assertEqual(portfolio_optimization.portfolio_expected_value(result_x), expected_value)

def test_portfolio_variance(self):
"""test portfolio_variance"""
Expand Down
8 changes: 2 additions & 6 deletions test/circuit/test_european_call_delta_objective.py
Original file line number Diff line number Diff line change
Expand Up @@ -53,9 +53,7 @@ def test_application(self):
Aer,
) # pylint: disable=unused-import,import-outside-toplevel
except ImportError as ex: # pylint: disable=broad-except
self.skipTest(
"Aer doesn't appear to be installed. Error: '{}'".format(str(ex))
)
self.skipTest("Aer doesn't appear to be installed. Error: '{}'".format(str(ex)))
return

num_qubits = 3
Expand Down Expand Up @@ -105,9 +103,7 @@ def test_application(self):
q_i = QuantumInstance(
Aer.get_backend("qasm_simulator"), seed_simulator=125, seed_transpiler=80
)
iae = IterativeAmplitudeEstimation(
epsilon_target=0.01, alpha=0.05, quantum_instance=q_i
)
iae = IterativeAmplitudeEstimation(epsilon_target=0.01, alpha=0.05, quantum_instance=q_i)
result = iae.estimate(problem)
self.assertAlmostEqual(result.estimation_processed, 0.8079816552117238)

Expand Down
12 changes: 3 additions & 9 deletions test/circuit/test_european_call_pricing_objective.py
Original file line number Diff line number Diff line change
Expand Up @@ -42,9 +42,7 @@ def test_ecev_circuit(self):
rescaling_factor = 0.1
strike_price = 0.5
bounds = (0, 2)
ecev = EuropeanCallPricingObjective(
num_qubits, strike_price, rescaling_factor, bounds
)
ecev = EuropeanCallPricingObjective(num_qubits, strike_price, rescaling_factor, bounds)

breakpoints = [0, strike_price]
slopes = [0, 1]
Expand All @@ -70,9 +68,7 @@ def test_application(self):
Aer,
) # pylint: disable=unused-import,import-outside-toplevel
except ImportError as ex: # pylint: disable=broad-except
self.skipTest(
"Aer doesn't appear to be installed. Error: '{}'".format(str(ex))
)
self.skipTest("Aer doesn't appear to be installed. Error: '{}'".format(str(ex)))
return

bounds = np.array([0.0, 7.0])
Expand Down Expand Up @@ -116,9 +112,7 @@ def test_application(self):
q_i = QuantumInstance(
Aer.get_backend("qasm_simulator"), seed_simulator=125, seed_transpiler=80
)
iae = IterativeAmplitudeEstimation(
epsilon_target=0.01, alpha=0.05, quantum_instance=q_i
)
iae = IterativeAmplitudeEstimation(epsilon_target=0.01, alpha=0.05, quantum_instance=q_i)
result = iae.estimate(problem)
self.assertAlmostEqual(result.estimation_processed, 1.0127253837345427)

Expand Down
8 changes: 2 additions & 6 deletions test/circuit/test_fixed_income_pricing_objective.py
Original file line number Diff line number Diff line change
Expand Up @@ -57,9 +57,7 @@ def test_application(self):
Aer,
) # pylint: disable=unused-import,import-outside-toplevel
except ImportError as ex: # pylint: disable=broad-except
self.skipTest(
"Aer doesn't appear to be installed. Error: '{}'".format(str(ex))
)
self.skipTest("Aer doesn't appear to be installed. Error: '{}'".format(str(ex)))
return

a_n = np.eye(2)
Expand Down Expand Up @@ -99,9 +97,7 @@ def test_application(self):
q_i = QuantumInstance(
Aer.get_backend("qasm_simulator"), seed_simulator=2, seed_transpiler=2
)
iae = IterativeAmplitudeEstimation(
epsilon_target=0.01, alpha=0.05, quantum_instance=q_i
)
iae = IterativeAmplitudeEstimation(epsilon_target=0.01, alpha=0.05, quantum_instance=q_i)
result = iae.estimate(problem)

# compare to precomputed solution
Expand Down
Loading