From 95eef3475fdf62b49a05dc2662e2b2fbdd65adad Mon Sep 17 00:00:00 2001 From: Edoardo Altamura <38359901+edoaltamura@users.noreply.github.com> Date: Sat, 24 Feb 2024 17:26:25 +0000 Subject: [PATCH 01/23] Simplify pandas usage, update type hinting and improve API docs --- .../data_providers/random_data_provider.py | 62 +++++++++++-------- .../data_providers/wikipedia_data_provider.py | 34 ++++++---- .../data_providers/yahoo_data_provider.py | 32 +++++++--- 3 files changed, 81 insertions(+), 47 deletions(-) diff --git a/qiskit_finance/data_providers/random_data_provider.py b/qiskit_finance/data_providers/random_data_provider.py index ebd641a7..5867c14f 100644 --- a/qiskit_finance/data_providers/random_data_provider.py +++ b/qiskit_finance/data_providers/random_data_provider.py @@ -1,6 +1,6 @@ # This code is part of a Qiskit project. # -# (C) Copyright IBM 2019, 2023. +# (C) Copyright IBM 2019, 2024. # # 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 @@ -12,10 +12,8 @@ """ Pseudo-randomly generated mock stock-market data provider """ -from typing import Optional, Union, List import datetime import logging -import pandas as pd import numpy as np from ._base_data_provider import BaseDataProvider @@ -28,50 +26,62 @@ class RandomDataProvider(BaseDataProvider): def __init__( self, - tickers: Optional[Union[str, List[str]]] = None, + tickers: str | list[str] | None = None, start: datetime.datetime = datetime.datetime(2016, 1, 1), end: datetime.datetime = datetime.datetime(2016, 1, 30), - seed: Optional[int] = None, + seed: int | None = None, ) -> None: """ + Initialize RandomDataProvider. + Args: - tickers: tickers - start: first data point - end: last data point precedes this date - seed: optional random seed + tickers (str | list[str] | None): Tickers for the data provider. + Default is None, using ["TICKER1", "TICKER2"] if not provided. + start (datetime.datetime): Start date of the data. + Defaults to January 1st, 2016. + end (datetime.datetime): End date of the data. + Defaults to January 30th, 2016. + seed (int | None): Random seed for reproducibility. """ super().__init__() tickers = tickers if tickers is not None else ["TICKER1", "TICKER2"] + if isinstance(tickers, list): self._tickers = tickers else: self._tickers = tickers.replace("\n", ";").split(";") - self._n = len(self._tickers) + self._n = len(self._tickers) self._start = start self._end = end self._seed = seed def run(self) -> None: """ - Generates data pseudo-randomly, thus enabling get_similarity_matrix - and get_covariance_matrix methods in the base class. - """ + Generate pseudo-random stock market data. + Generates pseudo-random stock market data using normal distribution + and truncates values to zero after the first occurrence of zero. + + Raises: + None + Returns: + None + """ length = (self._end - self._start).days 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 - ) - 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) - if zero_idx >= 0: - # set to 0 all values after first 0 - trimmed_list = [ - val if idx < zero_idx else 0 for idx, val in enumerate(trimmed_list) - ] - self._data.append(trimmed_list) + random_numbers = generator.standard_normal(length) + cumsum = np.cumsum(random_numbers) + d_f = cumsum + generator.integers(1, 101) + trimmed = np.maximum(d_f, np.zeros(length)) + + # Set all values after the first 0 to 0 + for idx, val in enumerate(trimmed): + if val == 0: + trimmed[idx + 1 :] = 0 + break + + self._data.append(trimmed.tolist()) diff --git a/qiskit_finance/data_providers/wikipedia_data_provider.py b/qiskit_finance/data_providers/wikipedia_data_provider.py index 0844ecb5..c8a224ec 100644 --- a/qiskit_finance/data_providers/wikipedia_data_provider.py +++ b/qiskit_finance/data_providers/wikipedia_data_provider.py @@ -12,7 +12,6 @@ """ Wikipedia data provider. """ -from typing import Optional, Union, List import logging import datetime import nasdaqdatalink @@ -26,27 +25,34 @@ class WikipediaDataProvider(BaseDataProvider): """Wikipedia data provider. - Please see: + This data provider retrieves stock market data from the Wikipedia dataset + using Nasdaq Data Link API. For more details on usage, please refer to the + official documentation: https://qiskit-community.github.io/qiskit-finance/tutorials/11_time_series.html - for instructions on use. """ def __init__( self, - token: Optional[str] = None, - tickers: Optional[Union[str, List[str]]] = None, + token: str | None = None, + tickers: str | list[str] | None = None, start: datetime.datetime = datetime.datetime(2016, 1, 1), end: datetime.datetime = datetime.datetime(2016, 1, 30), ) -> None: """ + Initialize the Wikipedia Data Provider. + Args: - token: Nasdaq Data Link access token, which is not needed, strictly speaking - tickers: tickers - start: start time - end: end time + token (str | None): Nasdaq Data Link access token. + Default is None. + tickers (str | list[str] | None): Tickers for the data provider. + Default is None, meaning no tickers provided. + start (datetime.datetime): Start date of the data. + Default is January 1st, 2016. + end (datetime.datetime): End date of the data. + Default is January 30th, 2016. """ super().__init__() - self._tickers = None # type: Optional[Union[str, List[str]]] + self._tickers = None tickers = tickers if tickers is not None else [] if isinstance(tickers, list): self._tickers = tickers @@ -62,8 +68,12 @@ def __init__( def run(self) -> None: """ - Loads data, thus enabling get_similarity_matrix and - get_covariance_matrix methods in the base class. + Loads data from Wikipedia using Nasdaq Data Link API. + + This method retrieves stock market data from the Wikipedia dataset + using Nasdaq Data Link API, and populates the data attribute of the + base class, enabling further calculations like similarity and covariance + matrices. """ nasdaqdatalink.ApiConfig.api_key = self._token self._data = [] diff --git a/qiskit_finance/data_providers/yahoo_data_provider.py b/qiskit_finance/data_providers/yahoo_data_provider.py index 4d24f4b3..d82be70a 100644 --- a/qiskit_finance/data_providers/yahoo_data_provider.py +++ b/qiskit_finance/data_providers/yahoo_data_provider.py @@ -12,7 +12,6 @@ """ Yahoo data provider. """ -from typing import Optional, Union, List import datetime import logging import tempfile @@ -35,22 +34,27 @@ class YahooDataProvider(BaseDataProvider): """Yahoo data provider. - Please see: + This data provider retrieves stock market data from Yahoo Finance using the yfinance library. + For more details on usage, please refer to the official documentation: https://qiskit-community.github.io/qiskit-finance/tutorials/11_time_series.html - for instructions on use. """ def __init__( self, - tickers: Optional[Union[str, List[str]]] = None, + tickers: str | list[str] | None = None, start: datetime.datetime = datetime.datetime(2016, 1, 1), end: datetime.datetime = datetime.datetime(2016, 1, 30), ) -> None: """ + Initialize the Yahoo Data Provider. + Args: - tickers: tickers - start: start time - end: end time + tickers (str | list[str] | None): Tickers for the data provider. + Default is None, meaning no tickers provided. + start (datetime.datetime): Start date of the data. + Default is January 1st, 2016. + end (datetime.datetime): End date of the data. + Default is January 30th, 2016. """ super().__init__() self._tickers = [] @@ -67,8 +71,11 @@ def __init__( def run(self) -> None: """ - Loads data, thus enabling get_similarity_matrix and - get_covariance_matrix methods in the base class. + Loads data from Yahoo Finance. + + This method retrieves stock market data from Yahoo Finance using the yfinance library, + and populates the data attribute of the base class, enabling further calculations like + similarity and covariance matrices. """ if len(self._tickers) == 0: raise QiskitFinanceError("Missing tickers to download.") @@ -85,18 +92,25 @@ def run(self) -> None: threads=False, progress=logger.isEnabledFor(logging.DEBUG), ) + if len(self._tickers) == 1: ticker_name = self._tickers[0] stock_value = stock_data["Adj Close"] + if stock_value.dropna().empty: stocks_notfound.append(ticker_name) + self._data.append(stock_value) + else: for ticker_name in self._tickers: stock_value = stock_data[ticker_name]["Adj Close"] + if stock_value.dropna().empty: stocks_notfound.append(ticker_name) + self._data.append(stock_value) + except Exception as ex: # pylint: disable=broad-except logger.debug(ex, exc_info=True) raise QiskitFinanceError("Accessing Yahoo Data failed.") from ex From 78b87862dc2bb2c1ae994964222d43b15cd14323 Mon Sep 17 00:00:00 2001 From: Edoardo Altamura <38359901+edoaltamura@users.noreply.github.com> Date: Sat, 24 Feb 2024 17:35:30 +0000 Subject: [PATCH 02/23] Trigger workflow --- qiskit_finance/data_providers/yahoo_data_provider.py | 1 + 1 file changed, 1 insertion(+) diff --git a/qiskit_finance/data_providers/yahoo_data_provider.py b/qiskit_finance/data_providers/yahoo_data_provider.py index d82be70a..2f8a8fb3 100644 --- a/qiskit_finance/data_providers/yahoo_data_provider.py +++ b/qiskit_finance/data_providers/yahoo_data_provider.py @@ -59,6 +59,7 @@ def __init__( super().__init__() self._tickers = [] tickers = tickers if tickers is not None else [] + if isinstance(tickers, list): self._tickers = tickers else: From 330517ac9718a2600ee8e95d898804470dded3dd Mon Sep 17 00:00:00 2001 From: Edoardo Altamura <38359901+edoaltamura@users.noreply.github.com> Date: Sat, 24 Feb 2024 18:42:32 +0000 Subject: [PATCH 03/23] Add more documentation --- .../data_providers/_base_data_provider.py | 188 +++++++++++------- .../data_providers/wikipedia_data_provider.py | 9 + .../data_providers/yahoo_data_provider.py | 10 +- 3 files changed, 130 insertions(+), 77 deletions(-) diff --git a/qiskit_finance/data_providers/_base_data_provider.py b/qiskit_finance/data_providers/_base_data_provider.py index c965abfd..5eccfcb7 100644 --- a/qiskit_finance/data_providers/_base_data_provider.py +++ b/qiskit_finance/data_providers/_base_data_provider.py @@ -13,7 +13,7 @@ """This module implements the abstract base class for data_provider modules the finance module.""" from abc import ABC, abstractmethod -from typing import Tuple, Optional, List, cast +from typing import cast import logging from enum import Enum @@ -27,11 +27,11 @@ class StockMarket(Enum): - """Stock Market enum""" + """Enum representing various stock markets.""" - LONDON = "XLON" - EURONEXT = "XPAR" - SINGAPORE = "XSES" + LONDON: str = "XLON" + EURONEXT: str = "XPAR" + SINGAPORE: str = "XSES" class BaseDataProvider(ABC): @@ -47,37 +47,56 @@ class BaseDataProvider(ABC): @abstractmethod def __init__(self) -> None: - self._data: Optional[List] = None - self._n = 0 # pylint: disable=invalid-name - self.period_return_mean: Optional[np.ndarray] = None - self.cov: Optional[np.ndarray] = None - self.period_return_cov: Optional[np.ndarray] = None - self.rho: Optional[np.ndarray] = None - self.mean: Optional[np.ndarray] = None + self._data: list | None = None + self._n: int = 0 # pylint: disable=invalid-name + self.period_return_mean: np.ndarray | None = None + self.cov: np.ndarray | None = None + self.period_return_cov: np.ndarray | None = None + self.rho: np.ndarray | None = None + self.mean: np.ndarray | None = None @abstractmethod def run(self) -> None: - """Loads data.""" + """ + Abstract method to load data. + + Method responsible for loading data. Subclasses of `BaseDataProvider` + must implement this method to load data from a specific data source. + + Raises: + NotImplementedError: This method must be implemented in a subclass. + """ pass + def _check_data_loaded(self) -> None: + """ + Checks if data is loaded. + + Raises: + QiskitFinanceError: If no data is loaded. Please run the method :code:`run()` + first to load the data. + """ + if not hasattr(self, "_data") or not self._data: + raise QiskitFinanceError( + "No data loaded yet. Please run the method :code:`run()` first to load the data." + ) + # it does not have to be overridden in non-abstract derived classes. def get_mean_vector(self) -> np.ndarray: - """Returns a vector containing the mean value of each asset. + """Returns the mean value vector of each asset. + + Calculates the mean value for each asset based on the loaded data, + assuming each row represents a time-series observation for an asset. Returns: - a per-asset mean vector. + np.ndarray: A vector containing the mean value of each asset. + Raises: - QiskitFinanceError: no data loaded + QiskitFinanceError: If no data is loaded. Please run the method :code:`run()` + first to load the data. """ - try: - if not self._data: - raise QiskitFinanceError( - "No data loaded, yet. Please run the method run() first to load the data." - ) - except AttributeError as ex: - raise QiskitFinanceError( - "No data loaded, yet. Please run the method run() first to load the data." - ) from ex + self._check_data_loaded() + self.mean = cast(np.ndarray, np.mean(self._data, axis=1)) return self.mean @@ -93,22 +112,21 @@ def _divide(val_1, val_2): # it does not have to be overridden in non-abstract derived classes. def get_period_return_mean_vector(self) -> np.ndarray: """ - Returns a vector containing the mean value of each asset. + Calculates the mean period return vector for each asset. + + Returns the mean period return value for each asset based on the loaded data. + Period return is calculated as the ratio of the current period's value to + the previous period's value minus one. Returns: - a per-asset mean vector. + np.ndarray: A vector containing the mean period return value of each asset. + Raises: - QiskitFinanceError: no data loaded + QiskitFinanceError: If no data is loaded. Please run the method :code:`run()` + first to load the data. """ - try: - if not self._data: - raise QiskitFinanceError( - "No data loaded, yet. Please run the method run() first to load the data." - ) - except AttributeError as ex: - raise QiskitFinanceError( - "No data loaded, yet. Please run the method run() first to load the data." - ) from ex + self._check_data_loaded() + _div_func = np.vectorize(BaseDataProvider._divide) 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)) @@ -117,44 +135,45 @@ def get_period_return_mean_vector(self) -> np.ndarray: # it does not have to be overridden in non-abstract derived classes. def get_covariance_matrix(self) -> np.ndarray: """ - Returns the covariance matrix. + Calculates the covariance matrix of asset returns. + + Returns the covariance matrix of asset returns based on the loaded data. + Each row in the data is assumed to represent a time-series observation for an asset. + Covariance measures the relationship between two assets, indicating how they move in relation + to each other. Returns: - an asset-to-asset covariance matrix. + np.ndarray: An asset-to-asset covariance matrix. + Raises: - QiskitFinanceError: no data loaded + QiskitFinanceError: If no data is loaded. Please run the method :code:`run()` + first to load the data. """ - try: - if not self._data: - raise QiskitFinanceError( - "No data loaded, yet. Please run the method run() first to load the data." - ) - except AttributeError as ex: - raise QiskitFinanceError( - "No data loaded, yet. Please run the method run() first to load the data." - ) from ex + self._check_data_loaded() + self.cov = np.cov(self._data, rowvar=True) return self.cov # it does not have to be overridden in non-abstract derived classes. def get_period_return_covariance_matrix(self) -> np.ndarray: """ - Returns a vector containing the mean value of each asset. + Calculates the covariance matrix of period returns for each asset. + + Returns the covariance matrix of period returns for each asset based + on the loaded data. Period return is calculated as the ratio of the + current period's value to the previous period's value minus one. + Covariance measures the relationship between two assets' period + returns, indicating how they move in relation to each other. Returns: - a per-asset mean vector. + np.ndarray: A covariance matrix between period returns of assets. + Raises: - QiskitFinanceError: no data loaded + QiskitFinanceError: If no data is loaded. Please run the method :code:`run()` + first to load the data. """ - try: - if not self._data: - raise QiskitFinanceError( - "No data loaded, yet. Please run the method run() first to load the data." - ) - except AttributeError as ex: - raise QiskitFinanceError( - "No data loaded, yet. Please run the method run() first to load the data." - ) from ex + self._check_data_loaded() + _div_func = np.vectorize(BaseDataProvider._divide) period_returns = _div_func(np.array(self._data)[:, 1:], np.array(self._data)[:, :-1]) - 1 self.period_return_cov = np.cov(period_returns) @@ -163,22 +182,26 @@ def get_period_return_covariance_matrix(self) -> np.ndarray: # it does not have to be overridden in non-abstract derived classes. def get_similarity_matrix(self) -> np.ndarray: """ - Returns time-series similarity matrix computed using dynamic time warping. + Calculates the similarity matrix based on time-series using dynamic + time warping. + + Returns the similarity matrix based on time-series using the + approximate Dynamic Time Warping (DTW) algorithm that provides + optimal or near-optimal alignments with an :math:`O(N)` time and memory + complexity. DTW is a technique to measure the + similarity between two sequences that may vary in time or speed. + The resulting similarity matrix indicates the similarity between + different assets' time-series data. Returns: - an asset-to-asset similarity matrix. + np.ndarray: An asset-to-asset similarity matrix. + Raises: - QiskitFinanceError: no data loaded + QiskitFinanceError: If no data is loaded. Please run the method :code:`run()` + first to load the data. """ - try: - if not self._data: - raise QiskitFinanceError( - "No data loaded, yet. Please run the method run() first to load the data." - ) - except AttributeError as ex: - raise QiskitFinanceError( - "No data loaded, yet. Please run the method run() first to load the data." - ) from ex + self._check_data_loaded() + self.rho = np.zeros((self._n, self._n)) for i_i in range(0, self._n): self.rho[i_i, i_i] = 1.0 @@ -191,9 +214,22 @@ def get_similarity_matrix(self) -> np.ndarray: # gets coordinates suitable for plotting # it does not have to be overridden in non-abstract derived classes. - def get_coordinates(self) -> Tuple[np.ndarray, np.ndarray]: - """Returns random coordinates for visualisation purposes.""" - # Coordinates for visualisation purposes + def get_coordinates(self) -> tuple[np.ndarray, np.ndarray]: + """ + Generates random coordinates for visualisation purposes. + + Returns random coordinates for visualization purposes. These coordinates + can be used to plot assets in a two-dimensional space, facilitating visualization + of relationships between assets. + + Returns: + tuple[np.ndarray, np.ndarray]: :math:`x` and :math:`y` coordinates of each asset. + + Note: + The generated coordinates are random and may not reflect any meaningful relationship + between assets. + + """ x_c = np.zeros([self._n, 1]) y_c = np.zeros([self._n, 1]) x_c = (algorithm_globals.random.random(self._n) - 0.5) * 1 diff --git a/qiskit_finance/data_providers/wikipedia_data_provider.py b/qiskit_finance/data_providers/wikipedia_data_provider.py index c8a224ec..7a108451 100644 --- a/qiskit_finance/data_providers/wikipedia_data_provider.py +++ b/qiskit_finance/data_providers/wikipedia_data_provider.py @@ -74,6 +74,15 @@ def run(self) -> None: using Nasdaq Data Link API, and populates the data attribute of the base class, enabling further calculations like similarity and covariance matrices. + + Raises: + QiskitFinanceError: If there is an invalid Nasdaq Data Link token, + if the Nasdaq Data Link limit is exceeded, if data is not found + for the specified tickers, or if there is an error accessing + Nasdaq Data Link. + + Returns: + None """ nasdaqdatalink.ApiConfig.api_key = self._token self._data = [] diff --git a/qiskit_finance/data_providers/yahoo_data_provider.py b/qiskit_finance/data_providers/yahoo_data_provider.py index 2f8a8fb3..96e93f58 100644 --- a/qiskit_finance/data_providers/yahoo_data_provider.py +++ b/qiskit_finance/data_providers/yahoo_data_provider.py @@ -74,9 +74,17 @@ def run(self) -> None: """ Loads data from Yahoo Finance. - This method retrieves stock market data from Yahoo Finance using the yfinance library, + This method retrieves stock market data from Yahoo Finance using the `yfinance` library, and populates the data attribute of the base class, enabling further calculations like similarity and covariance matrices. + + Raises: + QiskitFinanceError: If there are missing tickers in download, + if accessing Yahoo Data fails, or if no data is found for + the specified date range, possibly due to delisted symbols. + + Returns: + None """ if len(self._tickers) == 0: raise QiskitFinanceError("Missing tickers to download.") From c235ee998a81db8e50089a00d3be569d8e0b9567 Mon Sep 17 00:00:00 2001 From: Edoardo Altamura <38359901+edoaltamura@users.noreply.github.com> Date: Sat, 24 Feb 2024 19:15:54 +0000 Subject: [PATCH 04/23] Whitelist datetime in pylint --- .pylintdict | 1 + 1 file changed, 1 insertion(+) diff --git a/.pylintdict b/.pylintdict index 657eabeb..7534a1fc 100644 --- a/.pylintdict +++ b/.pylintdict @@ -29,6 +29,7 @@ covariances currentmodule cvar dataondemand +datetime dicts discretization discretize From 7c92647b2a514abaf71fc95b4b85d99516610c17 Mon Sep 17 00:00:00 2001 From: Edoardo Altamura <38359901+edoaltamura@users.noreply.github.com> Date: Sat, 24 Feb 2024 19:16:59 +0000 Subject: [PATCH 05/23] Whitelist `datetime` in pylint --- qiskit_finance/data_providers/yahoo_data_provider.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/qiskit_finance/data_providers/yahoo_data_provider.py b/qiskit_finance/data_providers/yahoo_data_provider.py index 96e93f58..2cb4764a 100644 --- a/qiskit_finance/data_providers/yahoo_data_provider.py +++ b/qiskit_finance/data_providers/yahoo_data_provider.py @@ -81,7 +81,7 @@ def run(self) -> None: Raises: QiskitFinanceError: If there are missing tickers in download, if accessing Yahoo Data fails, or if no data is found for - the specified date range, possibly due to delisted symbols. + the specified date range, possibly due to de-listed symbols. Returns: None @@ -91,7 +91,7 @@ def run(self) -> None: self._data = [] stocks_notfound = [] try: - # download multiple tickers in single thread to avoid + # Download multiple tickers in single thread to avoid # race condition stock_data = yf.download( self._tickers, @@ -126,5 +126,5 @@ def run(self) -> None: if stocks_notfound: raise QiskitFinanceError( - f"No data found for this date range, symbols may be delisted: {stocks_notfound}." + f"No data found for this date range, symbols may be de-listed: {stocks_notfound}." ) From 891b47daa0ec9bbd7bf042c84db9c9dfdd65d37c Mon Sep 17 00:00:00 2001 From: Edoardo Altamura <38359901+edoaltamura@users.noreply.github.com> Date: Sat, 24 Feb 2024 19:20:57 +0000 Subject: [PATCH 06/23] Whitelist `datetime` in pylint --- qiskit_finance/data_providers/yahoo_data_provider.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/qiskit_finance/data_providers/yahoo_data_provider.py b/qiskit_finance/data_providers/yahoo_data_provider.py index 2cb4764a..1c38460f 100644 --- a/qiskit_finance/data_providers/yahoo_data_provider.py +++ b/qiskit_finance/data_providers/yahoo_data_provider.py @@ -74,7 +74,7 @@ def run(self) -> None: """ Loads data from Yahoo Finance. - This method retrieves stock market data from Yahoo Finance using the `yfinance` library, + This method retrieves stock market data from Yahoo Finance using the :code:`yfinance` library, and populates the data attribute of the base class, enabling further calculations like similarity and covariance matrices. From f5594ffd27fce3ceaf89cb0ed16c19f74b4cbe98 Mon Sep 17 00:00:00 2001 From: Edoardo Altamura <38359901+edoaltamura@users.noreply.github.com> Date: Sun, 25 Feb 2024 10:49:45 +0000 Subject: [PATCH 07/23] Whitelist `DTW` in pylint (wasn't flagged locally) --- .pylintdict | 1 + 1 file changed, 1 insertion(+) diff --git a/.pylintdict b/.pylintdict index 7534a1fc..d169204c 100644 --- a/.pylintdict +++ b/.pylintdict @@ -34,6 +34,7 @@ dicts discretization discretize discretized +DTW egger eigendecomposition eigensolver From e1ca6ef5f02af04eddc41001b2d74ec05e61a2a8 Mon Sep 17 00:00:00 2001 From: Edoardo Altamura <38359901+edoaltamura@users.noreply.github.com> Date: Fri, 24 May 2024 22:30:05 +0200 Subject: [PATCH 08/23] Add `from __future__ import annotations` --- qiskit_finance/data_providers/_base_data_provider.py | 2 +- qiskit_finance/data_providers/random_data_provider.py | 2 +- qiskit_finance/data_providers/wikipedia_data_provider.py | 2 +- qiskit_finance/data_providers/yahoo_data_provider.py | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/qiskit_finance/data_providers/_base_data_provider.py b/qiskit_finance/data_providers/_base_data_provider.py index 5eccfcb7..822af47f 100644 --- a/qiskit_finance/data_providers/_base_data_provider.py +++ b/qiskit_finance/data_providers/_base_data_provider.py @@ -11,7 +11,7 @@ # that they have been altered from the originals. """This module implements the abstract base class for data_provider modules the finance module.""" - +from __future__ import annotations from abc import ABC, abstractmethod from typing import cast import logging diff --git a/qiskit_finance/data_providers/random_data_provider.py b/qiskit_finance/data_providers/random_data_provider.py index 5867c14f..fa9230d8 100644 --- a/qiskit_finance/data_providers/random_data_provider.py +++ b/qiskit_finance/data_providers/random_data_provider.py @@ -11,7 +11,7 @@ # that they have been altered from the originals. """ Pseudo-randomly generated mock stock-market data provider """ - +from __future__ import annotations import datetime import logging import numpy as np diff --git a/qiskit_finance/data_providers/wikipedia_data_provider.py b/qiskit_finance/data_providers/wikipedia_data_provider.py index 7a108451..90c3981e 100644 --- a/qiskit_finance/data_providers/wikipedia_data_provider.py +++ b/qiskit_finance/data_providers/wikipedia_data_provider.py @@ -11,7 +11,7 @@ # that they have been altered from the originals. """ Wikipedia data provider. """ - +from __future__ import annotations import logging import datetime import nasdaqdatalink diff --git a/qiskit_finance/data_providers/yahoo_data_provider.py b/qiskit_finance/data_providers/yahoo_data_provider.py index 1c38460f..8bc22da9 100644 --- a/qiskit_finance/data_providers/yahoo_data_provider.py +++ b/qiskit_finance/data_providers/yahoo_data_provider.py @@ -11,7 +11,7 @@ # that they have been altered from the originals. """ Yahoo data provider. """ - +from __future__ import annotations import datetime import logging import tempfile From d0801691887030a695214ae9ecc038a708d906e9 Mon Sep 17 00:00:00 2001 From: Edoardo Altamura <38359901+edoaltamura@users.noreply.github.com> Date: Fri, 24 May 2024 23:54:35 +0200 Subject: [PATCH 09/23] Remove Return None statements --- qiskit_finance/data_providers/_base_data_provider.py | 2 -- qiskit_finance/data_providers/random_data_provider.py | 5 ----- qiskit_finance/data_providers/wikipedia_data_provider.py | 3 --- qiskit_finance/data_providers/yahoo_data_provider.py | 3 --- 4 files changed, 13 deletions(-) diff --git a/qiskit_finance/data_providers/_base_data_provider.py b/qiskit_finance/data_providers/_base_data_provider.py index 822af47f..480a05ea 100644 --- a/qiskit_finance/data_providers/_base_data_provider.py +++ b/qiskit_finance/data_providers/_base_data_provider.py @@ -42,7 +42,6 @@ class BaseDataProvider(ABC): To use the subclasses, please see https://qiskit-community.github.io/qiskit-finance/tutorials/11_time_series.html - """ @abstractmethod @@ -228,7 +227,6 @@ def get_coordinates(self) -> tuple[np.ndarray, np.ndarray]: Note: The generated coordinates are random and may not reflect any meaningful relationship between assets. - """ x_c = np.zeros([self._n, 1]) y_c = np.zeros([self._n, 1]) diff --git a/qiskit_finance/data_providers/random_data_provider.py b/qiskit_finance/data_providers/random_data_provider.py index fa9230d8..51483cbc 100644 --- a/qiskit_finance/data_providers/random_data_provider.py +++ b/qiskit_finance/data_providers/random_data_provider.py @@ -62,11 +62,6 @@ def run(self) -> None: Generates pseudo-random stock market data using normal distribution and truncates values to zero after the first occurrence of zero. - - Raises: - None - Returns: - None """ length = (self._end - self._start).days generator = np.random.default_rng(self._seed) diff --git a/qiskit_finance/data_providers/wikipedia_data_provider.py b/qiskit_finance/data_providers/wikipedia_data_provider.py index 90c3981e..36e2b768 100644 --- a/qiskit_finance/data_providers/wikipedia_data_provider.py +++ b/qiskit_finance/data_providers/wikipedia_data_provider.py @@ -80,9 +80,6 @@ def run(self) -> None: if the Nasdaq Data Link limit is exceeded, if data is not found for the specified tickers, or if there is an error accessing Nasdaq Data Link. - - Returns: - None """ nasdaqdatalink.ApiConfig.api_key = self._token self._data = [] diff --git a/qiskit_finance/data_providers/yahoo_data_provider.py b/qiskit_finance/data_providers/yahoo_data_provider.py index 8bc22da9..0444582a 100644 --- a/qiskit_finance/data_providers/yahoo_data_provider.py +++ b/qiskit_finance/data_providers/yahoo_data_provider.py @@ -82,9 +82,6 @@ def run(self) -> None: QiskitFinanceError: If there are missing tickers in download, if accessing Yahoo Data fails, or if no data is found for the specified date range, possibly due to de-listed symbols. - - Returns: - None """ if len(self._tickers) == 0: raise QiskitFinanceError("Missing tickers to download.") From daa0985a5cbcd257fe8a120d59cfd1fbe9022977 Mon Sep 17 00:00:00 2001 From: Edoardo Altamura <38359901+edoaltamura@users.noreply.github.com> Date: Tue, 28 May 2024 17:20:15 +0200 Subject: [PATCH 10/23] Remove ticker str type --- qiskit_finance/data_providers/wikipedia_data_provider.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/qiskit_finance/data_providers/wikipedia_data_provider.py b/qiskit_finance/data_providers/wikipedia_data_provider.py index 36e2b768..37a2fcf3 100644 --- a/qiskit_finance/data_providers/wikipedia_data_provider.py +++ b/qiskit_finance/data_providers/wikipedia_data_provider.py @@ -34,7 +34,7 @@ class WikipediaDataProvider(BaseDataProvider): def __init__( self, token: str | None = None, - tickers: str | list[str] | None = None, + tickers: list[str] | None = None, start: datetime.datetime = datetime.datetime(2016, 1, 1), end: datetime.datetime = datetime.datetime(2016, 1, 30), ) -> None: @@ -44,7 +44,7 @@ def __init__( Args: token (str | None): Nasdaq Data Link access token. Default is None. - tickers (str | list[str] | None): Tickers for the data provider. + tickers (list[str] | None): Tickers for the data provider. Default is None, meaning no tickers provided. start (datetime.datetime): Start date of the data. Default is January 1st, 2016. From e65c76f394ee39c9942a0d8f260f6513d80a4b74 Mon Sep 17 00:00:00 2001 From: Edoardo Altamura <38359901+edoaltamura@users.noreply.github.com> Date: Fri, 7 Jun 2024 14:17:55 +0100 Subject: [PATCH 11/23] Remove ticker str type --- qiskit_finance/data_providers/random_data_provider.py | 2 +- qiskit_finance/data_providers/yahoo_data_provider.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/qiskit_finance/data_providers/random_data_provider.py b/qiskit_finance/data_providers/random_data_provider.py index 51483cbc..82f6a51f 100644 --- a/qiskit_finance/data_providers/random_data_provider.py +++ b/qiskit_finance/data_providers/random_data_provider.py @@ -26,7 +26,7 @@ class RandomDataProvider(BaseDataProvider): def __init__( self, - tickers: str | list[str] | None = None, + tickers: list[str] | None = None, start: datetime.datetime = datetime.datetime(2016, 1, 1), end: datetime.datetime = datetime.datetime(2016, 1, 30), seed: int | None = None, diff --git a/qiskit_finance/data_providers/yahoo_data_provider.py b/qiskit_finance/data_providers/yahoo_data_provider.py index 0444582a..3d357c85 100644 --- a/qiskit_finance/data_providers/yahoo_data_provider.py +++ b/qiskit_finance/data_providers/yahoo_data_provider.py @@ -41,7 +41,7 @@ class YahooDataProvider(BaseDataProvider): def __init__( self, - tickers: str | list[str] | None = None, + tickers: list[str] | None = None, start: datetime.datetime = datetime.datetime(2016, 1, 1), end: datetime.datetime = datetime.datetime(2016, 1, 30), ) -> None: From 5718ef2bac1825683a3e8202fbdafd741cacecf2 Mon Sep 17 00:00:00 2001 From: Edoardo Altamura <38359901+edoaltamura@users.noreply.github.com> Date: Fri, 7 Jun 2024 14:22:36 +0100 Subject: [PATCH 12/23] Remove ticker str type --- qiskit_finance/data_providers/random_data_provider.py | 2 +- qiskit_finance/data_providers/yahoo_data_provider.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/qiskit_finance/data_providers/random_data_provider.py b/qiskit_finance/data_providers/random_data_provider.py index 82f6a51f..201086d4 100644 --- a/qiskit_finance/data_providers/random_data_provider.py +++ b/qiskit_finance/data_providers/random_data_provider.py @@ -35,7 +35,7 @@ def __init__( Initialize RandomDataProvider. Args: - tickers (str | list[str] | None): Tickers for the data provider. + tickers (list[str] | None): Tickers for the data provider. Default is None, using ["TICKER1", "TICKER2"] if not provided. start (datetime.datetime): Start date of the data. Defaults to January 1st, 2016. diff --git a/qiskit_finance/data_providers/yahoo_data_provider.py b/qiskit_finance/data_providers/yahoo_data_provider.py index 3d357c85..06178145 100644 --- a/qiskit_finance/data_providers/yahoo_data_provider.py +++ b/qiskit_finance/data_providers/yahoo_data_provider.py @@ -49,7 +49,7 @@ def __init__( Initialize the Yahoo Data Provider. Args: - tickers (str | list[str] | None): Tickers for the data provider. + tickers (list[str] | None): Tickers for the data provider. Default is None, meaning no tickers provided. start (datetime.datetime): Start date of the data. Default is January 1st, 2016. From d7530e1df7d450fa26475d713e566454bec65213 Mon Sep 17 00:00:00 2001 From: Edoardo Altamura <38359901+edoaltamura@users.noreply.github.com> Date: Mon, 10 Jun 2024 18:23:21 +0200 Subject: [PATCH 13/23] Enhance documentation for str | list[str] | None and restore str type --- .../data_providers/data_on_demand_provider.py | 26 ++++++++++++------- .../data_providers/exchange_data_provider.py | 23 ++++++++++------ .../data_providers/random_data_provider.py | 9 +++++-- .../data_providers/wikipedia_data_provider.py | 7 +++-- .../data_providers/yahoo_data_provider.py | 13 +++++++--- 5 files changed, 53 insertions(+), 25 deletions(-) diff --git a/qiskit_finance/data_providers/data_on_demand_provider.py b/qiskit_finance/data_providers/data_on_demand_provider.py index 4c5f5e9c..12968a1b 100644 --- a/qiskit_finance/data_providers/data_on_demand_provider.py +++ b/qiskit_finance/data_providers/data_on_demand_provider.py @@ -12,7 +12,7 @@ """ NASDAQ Data on demand data provider. """ -from typing import Optional, Union, List +from __future__ import annotations import datetime from urllib.parse import urlencode import logging @@ -37,27 +37,35 @@ class DataOnDemandProvider(BaseDataProvider): def __init__( self, token: str, - tickers: Union[str, List[str]], + tickers: str | list[str] | None = None, start: datetime.datetime = datetime.datetime(2016, 1, 1), end: datetime.datetime = datetime.datetime(2016, 1, 30), - verify: Optional[Union[str, bool]] = None, + verify: str | bool | None = None, ) -> None: """ Args: - token: data on demand access token - tickers: tickers - start: first data point - end: last data point precedes this date - verify: if verify is None, certify certificates + token (str): Nasdaq Data Link access token. + tickers (str | list[str] | None): Tickers for the data provider. + - If a string is provided, it can be a single ticker symbol or multiple symbols + separated by semicolons or newlines. + - If a list of strings is provided, each string should be a single ticker symbol. + Default is None. + start (datetime.datetime): Start date of the data. + Defaults to January 1st, 2016. + end (datetime.datetime): End date of the data. + Defaults to January 30th, 2016. + verify (str | bool | None): If verify is None, certify certificates will be used (default); if this is False, no certificates will be checked; if this is a string, it should be pointing - to a certificate for the HTTPS connection to NASDAQ (dataondemand.nasdaq.com), + to a certificate for the HTTPS connection to NASDAQ (`dataondemand.nasdaq.com`), either in the form of a CA_BUNDLE file or a directory wherein to look. """ super().__init__() + self._tickers = None + tickers = tickers if tickers is not None else [] if isinstance(tickers, list): self._tickers = tickers else: diff --git a/qiskit_finance/data_providers/exchange_data_provider.py b/qiskit_finance/data_providers/exchange_data_provider.py index 2cd275fe..34896168 100644 --- a/qiskit_finance/data_providers/exchange_data_provider.py +++ b/qiskit_finance/data_providers/exchange_data_provider.py @@ -12,7 +12,7 @@ """ Exchange data provider. """ -from typing import Union, List +from __future__ import annotations import logging import datetime import nasdaqdatalink @@ -34,24 +34,31 @@ class ExchangeDataProvider(BaseDataProvider): def __init__( self, token: str, - tickers: Union[str, List[str]], + tickers: str | list[str] | None = None, stockmarket: StockMarket = StockMarket.LONDON, start: datetime.datetime = datetime.datetime(2016, 1, 1), end: datetime.datetime = datetime.datetime(2016, 1, 30), ) -> None: """ Args: - token: Nasdaq Data Link access token - tickers: tickers - stockmarket: LONDON, EURONEXT, or SINGAPORE - start: first data point - end: last data point precedes this date + token (str): Nasdaq Data Link access token. + tickers (str | list[str] | None): Tickers for the data provider. + - If a string is provided, it can be a single ticker symbol or multiple symbols + separated by semicolons or newlines. + - If a list of strings is provided, each string should be a single ticker symbol. + Default is None. + stockmarket (StockMarket): LONDON (default), EURONEXT, or SINGAPORE + start (datetime.datetime): Start date of the data. + Defaults to January 1st, 2016. + end (datetime.datetime): End date of the data. + Defaults to January 30th, 2016. Raises: QiskitFinanceError: provider doesn't support given stock market """ super().__init__() - self._tickers = [] # type: Union[str, List[str]] + self._tickers = None + tickers = tickers if tickers is not None else [] if isinstance(tickers, list): self._tickers = tickers else: diff --git a/qiskit_finance/data_providers/random_data_provider.py b/qiskit_finance/data_providers/random_data_provider.py index 201086d4..f2ce2c20 100644 --- a/qiskit_finance/data_providers/random_data_provider.py +++ b/qiskit_finance/data_providers/random_data_provider.py @@ -11,6 +11,7 @@ # that they have been altered from the originals. """ Pseudo-randomly generated mock stock-market data provider """ + from __future__ import annotations import datetime import logging @@ -26,7 +27,7 @@ class RandomDataProvider(BaseDataProvider): def __init__( self, - tickers: list[str] | None = None, + tickers: str | list[str] | None = None, start: datetime.datetime = datetime.datetime(2016, 1, 1), end: datetime.datetime = datetime.datetime(2016, 1, 30), seed: int | None = None, @@ -35,7 +36,10 @@ def __init__( Initialize RandomDataProvider. Args: - tickers (list[str] | None): Tickers for the data provider. + tickers (str | list[str] | None): Tickers for the data provider. + - If a string is provided, it can be a single ticker symbol or multiple symbols + separated by semicolons or newlines. + - If a list of strings is provided, each string should be a single ticker symbol. Default is None, using ["TICKER1", "TICKER2"] if not provided. start (datetime.datetime): Start date of the data. Defaults to January 1st, 2016. @@ -44,6 +48,7 @@ def __init__( seed (int | None): Random seed for reproducibility. """ super().__init__() + self._tickers = None tickers = tickers if tickers is not None else ["TICKER1", "TICKER2"] if isinstance(tickers, list): diff --git a/qiskit_finance/data_providers/wikipedia_data_provider.py b/qiskit_finance/data_providers/wikipedia_data_provider.py index 37a2fcf3..3994ff3e 100644 --- a/qiskit_finance/data_providers/wikipedia_data_provider.py +++ b/qiskit_finance/data_providers/wikipedia_data_provider.py @@ -34,7 +34,7 @@ class WikipediaDataProvider(BaseDataProvider): def __init__( self, token: str | None = None, - tickers: list[str] | None = None, + tickers: str | list[str] | None = None, start: datetime.datetime = datetime.datetime(2016, 1, 1), end: datetime.datetime = datetime.datetime(2016, 1, 30), ) -> None: @@ -44,7 +44,10 @@ def __init__( Args: token (str | None): Nasdaq Data Link access token. Default is None. - tickers (list[str] | None): Tickers for the data provider. + tickers (str | list[str] | None): Tickers for the data provider. + - If a string is provided, it can be a single ticker symbol or multiple symbols + separated by semicolons or newlines. + - If a list of strings is provided, each string should be a single ticker symbol. Default is None, meaning no tickers provided. start (datetime.datetime): Start date of the data. Default is January 1st, 2016. diff --git a/qiskit_finance/data_providers/yahoo_data_provider.py b/qiskit_finance/data_providers/yahoo_data_provider.py index 06178145..5df67524 100644 --- a/qiskit_finance/data_providers/yahoo_data_provider.py +++ b/qiskit_finance/data_providers/yahoo_data_provider.py @@ -11,6 +11,7 @@ # that they have been altered from the originals. """ Yahoo data provider. """ + from __future__ import annotations import datetime import logging @@ -41,7 +42,7 @@ class YahooDataProvider(BaseDataProvider): def __init__( self, - tickers: list[str] | None = None, + tickers: str | list[str] | None = None, start: datetime.datetime = datetime.datetime(2016, 1, 1), end: datetime.datetime = datetime.datetime(2016, 1, 30), ) -> None: @@ -49,7 +50,10 @@ def __init__( Initialize the Yahoo Data Provider. Args: - tickers (list[str] | None): Tickers for the data provider. + tickers (str | list[str] | None): Tickers for the data provider. + - If a string is provided, it can be a single ticker symbol or multiple symbols + separated by semicolons or newlines. + - If a list of strings is provided, each string should be a single ticker symbol. Default is None, meaning no tickers provided. start (datetime.datetime): Start date of the data. Default is January 1st, 2016. @@ -57,13 +61,14 @@ def __init__( Default is January 30th, 2016. """ super().__init__() - self._tickers = [] - tickers = tickers if tickers is not None else [] + self._tickers = None + tickers = tickers if tickers is not None else [] if isinstance(tickers, list): self._tickers = tickers else: self._tickers = tickers.replace("\n", ";").split(";") + self._n = len(self._tickers) self._start = start.strftime("%Y-%m-%d") From ef53f9e15f89d3f8f2e7a75af1b09abbb6da1a1a Mon Sep 17 00:00:00 2001 From: Edoardo Altamura <38359901+edoaltamura@users.noreply.github.com> Date: Mon, 10 Jun 2024 19:15:08 +0200 Subject: [PATCH 14/23] Resolve Incompatible types in assignment in linter --- .../data_providers/data_on_demand_provider.py | 50 +++++++++---------- .../data_providers/exchange_data_provider.py | 37 +++++++------- .../data_providers/random_data_provider.py | 15 +++--- .../data_providers/wikipedia_data_provider.py | 15 +++--- .../data_providers/yahoo_data_provider.py | 16 +++--- 5 files changed, 63 insertions(+), 70 deletions(-) diff --git a/qiskit_finance/data_providers/data_on_demand_provider.py b/qiskit_finance/data_providers/data_on_demand_provider.py index 12968a1b..b51d9708 100644 --- a/qiskit_finance/data_providers/data_on_demand_provider.py +++ b/qiskit_finance/data_providers/data_on_demand_provider.py @@ -49,29 +49,26 @@ def __init__( - If a string is provided, it can be a single ticker symbol or multiple symbols separated by semicolons or newlines. - If a list of strings is provided, each string should be a single ticker symbol. - Default is None. + Default is :code:`None`. start (datetime.datetime): Start date of the data. Defaults to January 1st, 2016. end (datetime.datetime): End date of the data. Defaults to January 30th, 2016. - verify (str | bool | None): If verify is None, certify certificates - will be used (default); - if this is False, no certificates will be checked; if this is a string, + verify (str | bool | None): If verify is `None`, runs the certificate verification (default); + if this is :code:`False`, no certificates will be checked; if this is a :code:`str`, it should be pointing - to a certificate for the HTTPS connection to NASDAQ (`dataondemand.nasdaq.com`), - either in the - form of a CA_BUNDLE file or a directory wherein to look. + to a certificate for the HTTPS connection to NASDAQ (:code:`dataondemand.nasdaq.com`), + either in the form of a :code:`CA_BUNDLE` file or a directory wherein to look. """ super().__init__() - self._tickers = None - tickers = tickers if tickers is not None else [] - if isinstance(tickers, list): - self._tickers = tickers - else: - self._tickers = tickers.replace("\n", ";").split(";") - self._n = len(self._tickers) + if tickers is None: + tickers = [] + if isinstance(tickers, str): + tickers = tickers.replace("\n", ";").split(";") + self._tickers = tickers + self._n = len(tickers) self._token = token self._start = start self._end = end @@ -79,10 +76,9 @@ def __init__( def run(self) -> None: """ - Loads data, thus enabling get_similarity_matrix and get_covariance_matrix + Loads data, thus enabling :code:`get_similarity_matrix` and :code:`get_covariance_matrix` methods in the base class. """ - http = urllib3.PoolManager(cert_reqs="CERT_REQUIRED", ca_certs=certifi.where()) url = "https://dataondemand.nasdaq.com/api/v1/quotes?" self._data = [] @@ -96,23 +92,23 @@ def run(self) -> None: "end": self._end.strftime("%Y-%m-%d'T'%H:%M:%S.%f'Z'"), "next_cursor": 0, } - encoded = url + urlencode(values) + encoded_url = f"{url}{urlencode(values)}" if self._verify is None: - response = http.request( - "POST", encoded - ) # this runs certificate verification, as per the set-up of the urllib3 + # Runs certificate verification, as per the set-up of the urllib3 + response = http.request("POST", encoded_url) else: - # this disables certificate verification (False) + # Disables certificate verification (False) # or forces the certificate path (str) - response = http.request("POST", encoded, verify=self._verify) + response = http.request("POST", encoded_url, verify=self._verify) + if response.status != 200: - logger.debug(response.data.decode("utf-8")) + error_message = response.data.decode("utf-8") + logger.debug(f"Error fetching data for {ticker}: {error_message}") stocks_error.append(ticker) continue - quotes = json.loads(response.data.decode("utf-8"))["quotes"] - price_evolution = [] - for q in quotes: - price_evolution.append(q["ask_price"]) + + quotes = json.loads(response.data.decode("utf-8")).get("quotes", []) + price_evolution = [q["ask_price"] for q in quotes] self._data.append(price_evolution) finally: http.clear() diff --git a/qiskit_finance/data_providers/exchange_data_provider.py b/qiskit_finance/data_providers/exchange_data_provider.py index 34896168..b35cee0f 100644 --- a/qiskit_finance/data_providers/exchange_data_provider.py +++ b/qiskit_finance/data_providers/exchange_data_provider.py @@ -22,6 +22,12 @@ logger = logging.getLogger(__name__) +VALID_STOCKMARKETS = [ + StockMarket.LONDON, + StockMarket.EURONEXT, + StockMarket.SINGAPORE, +] + class ExchangeDataProvider(BaseDataProvider): """Exchange data provider. @@ -44,9 +50,9 @@ def __init__( token (str): Nasdaq Data Link access token. tickers (str | list[str] | None): Tickers for the data provider. - If a string is provided, it can be a single ticker symbol or multiple symbols - separated by semicolons or newlines. + separated by semicolons or new-lines. - If a list of strings is provided, each string should be a single ticker symbol. - Default is None. + Default is :code:`None`. stockmarket (StockMarket): LONDON (default), EURONEXT, or SINGAPORE start (datetime.datetime): Start date of the data. Defaults to January 1st, 2016. @@ -57,22 +63,17 @@ def __init__( QiskitFinanceError: provider doesn't support given stock market """ super().__init__() - self._tickers = None - tickers = tickers if tickers is not None else [] - if isinstance(tickers, list): - self._tickers = tickers - else: - self._tickers = tickers.replace("\n", ";").split(";") - self._n = len(self._tickers) - - if stockmarket not in [ - StockMarket.LONDON, - StockMarket.EURONEXT, - StockMarket.SINGAPORE, - ]: - msg = "ExchangeDataProvider does not support " - msg += stockmarket.value - msg += " as a stock market." + + if tickers is None: + tickers = [] + if isinstance(tickers, str): + tickers = tickers.replace("\n", ";").split(";") + + self._tickers = tickers + self._n = len(tickers) + + if stockmarket not in VALID_STOCKMARKETS: + msg = f"ExchangeDataProvider does not support {stockmarket.value} as a stock market." raise QiskitFinanceError(msg) # This is to aid serialization; string is ok to serialize diff --git a/qiskit_finance/data_providers/random_data_provider.py b/qiskit_finance/data_providers/random_data_provider.py index f2ce2c20..dfda7a89 100644 --- a/qiskit_finance/data_providers/random_data_provider.py +++ b/qiskit_finance/data_providers/random_data_provider.py @@ -40,7 +40,7 @@ def __init__( - If a string is provided, it can be a single ticker symbol or multiple symbols separated by semicolons or newlines. - If a list of strings is provided, each string should be a single ticker symbol. - Default is None, using ["TICKER1", "TICKER2"] if not provided. + Default is :code:`None`, using :code:`["TICKER1", "TICKER2"]` if not provided. start (datetime.datetime): Start date of the data. Defaults to January 1st, 2016. end (datetime.datetime): End date of the data. @@ -48,15 +48,14 @@ def __init__( seed (int | None): Random seed for reproducibility. """ super().__init__() - self._tickers = None - tickers = tickers if tickers is not None else ["TICKER1", "TICKER2"] - if isinstance(tickers, list): - self._tickers = tickers - else: - self._tickers = tickers.replace("\n", ";").split(";") + if tickers is None: + tickers = ["TICKER1", "TICKER2"] + if isinstance(tickers, str): + tickers = tickers.replace("\n", ";").split(";") - self._n = len(self._tickers) + self._tickers = tickers + self._n = len(tickers) self._start = start self._end = end self._seed = seed diff --git a/qiskit_finance/data_providers/wikipedia_data_provider.py b/qiskit_finance/data_providers/wikipedia_data_provider.py index 3994ff3e..061899ac 100644 --- a/qiskit_finance/data_providers/wikipedia_data_provider.py +++ b/qiskit_finance/data_providers/wikipedia_data_provider.py @@ -55,16 +55,15 @@ def __init__( Default is January 30th, 2016. """ super().__init__() - self._tickers = None - tickers = tickers if tickers is not None else [] - if isinstance(tickers, list): - self._tickers = tickers - else: - self._tickers = tickers.replace("\n", ";").split(";") - self._n = len(self._tickers) - self._token = token + if tickers is None: + tickers = [] + if isinstance(tickers, str): + tickers = tickers.replace("\n", ";").split(";") + self._tickers = tickers + self._n = len(tickers) + self._token = token self._start = start.strftime("%Y-%m-%d") self._end = end.strftime("%Y-%m-%d") self._data = [] diff --git a/qiskit_finance/data_providers/yahoo_data_provider.py b/qiskit_finance/data_providers/yahoo_data_provider.py index 5df67524..bbe5cf3b 100644 --- a/qiskit_finance/data_providers/yahoo_data_provider.py +++ b/qiskit_finance/data_providers/yahoo_data_provider.py @@ -54,7 +54,7 @@ def __init__( - If a string is provided, it can be a single ticker symbol or multiple symbols separated by semicolons or newlines. - If a list of strings is provided, each string should be a single ticker symbol. - Default is None, meaning no tickers provided. + Default is :code:`None`, meaning no tickers provided. start (datetime.datetime): Start date of the data. Default is January 1st, 2016. end (datetime.datetime): End date of the data. @@ -62,15 +62,13 @@ def __init__( """ super().__init__() - self._tickers = None - tickers = tickers if tickers is not None else [] - if isinstance(tickers, list): - self._tickers = tickers - else: - self._tickers = tickers.replace("\n", ";").split(";") - - self._n = len(self._tickers) + if tickers is None: + tickers = [] + if isinstance(tickers, str): + tickers = tickers.replace("\n", ";").split(";") + self._tickers = tickers + self._n = len(tickers) self._start = start.strftime("%Y-%m-%d") self._end = end.strftime("%Y-%m-%d") self._data = [] From 4ad61fecc2587dc592931e24cb764ebb783f364f Mon Sep 17 00:00:00 2001 From: Edoardo Altamura <38359901+edoaltamura@users.noreply.github.com> Date: Mon, 10 Jun 2024 19:25:06 +0200 Subject: [PATCH 15/23] Add to dictionary --- .pylintdict | 1 + 1 file changed, 1 insertion(+) diff --git a/.pylintdict b/.pylintdict index 912d63d6..7442a9de 100644 --- a/.pylintdict +++ b/.pylintdict @@ -61,6 +61,7 @@ integrality ints ising isometry +january kwargs latin linesep From 7c92d979d9c1b322378a9196db4d872e4f12f0e4 Mon Sep 17 00:00:00 2001 From: Edoardo Altamura <38359901+edoaltamura@users.noreply.github.com> Date: Mon, 10 Jun 2024 19:28:05 +0200 Subject: [PATCH 16/23] Replace f-string with lazy formatting --- qiskit_finance/data_providers/data_on_demand_provider.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/qiskit_finance/data_providers/data_on_demand_provider.py b/qiskit_finance/data_providers/data_on_demand_provider.py index b51d9708..9bf791da 100644 --- a/qiskit_finance/data_providers/data_on_demand_provider.py +++ b/qiskit_finance/data_providers/data_on_demand_provider.py @@ -103,7 +103,7 @@ def run(self) -> None: if response.status != 200: error_message = response.data.decode("utf-8") - logger.debug(f"Error fetching data for {ticker}: {error_message}") + logger.debug("Error fetching data for %s: %s", ticker, error_message) stocks_error.append(ticker) continue From 25cd223da9e76c927ff71abe81598577f039e157 Mon Sep 17 00:00:00 2001 From: Edoardo Altamura <38359901+edoaltamura@users.noreply.github.com> Date: Mon, 10 Jun 2024 19:40:21 +0200 Subject: [PATCH 17/23] Remove redundant strings --- qiskit_finance/data_providers/data_on_demand_provider.py | 2 -- qiskit_finance/data_providers/exchange_data_provider.py | 2 -- qiskit_finance/data_providers/random_data_provider.py | 2 -- qiskit_finance/data_providers/wikipedia_data_provider.py | 1 - qiskit_finance/data_providers/yahoo_data_provider.py | 2 -- 5 files changed, 9 deletions(-) diff --git a/qiskit_finance/data_providers/data_on_demand_provider.py b/qiskit_finance/data_providers/data_on_demand_provider.py index 9bf791da..5ac5f9df 100644 --- a/qiskit_finance/data_providers/data_on_demand_provider.py +++ b/qiskit_finance/data_providers/data_on_demand_provider.py @@ -10,8 +10,6 @@ # copyright notice, and modified files need to carry a notice indicating # that they have been altered from the originals. -""" NASDAQ Data on demand data provider. """ - from __future__ import annotations import datetime from urllib.parse import urlencode diff --git a/qiskit_finance/data_providers/exchange_data_provider.py b/qiskit_finance/data_providers/exchange_data_provider.py index b35cee0f..b017d81f 100644 --- a/qiskit_finance/data_providers/exchange_data_provider.py +++ b/qiskit_finance/data_providers/exchange_data_provider.py @@ -10,8 +10,6 @@ # copyright notice, and modified files need to carry a notice indicating # that they have been altered from the originals. -""" Exchange data provider. """ - from __future__ import annotations import logging import datetime diff --git a/qiskit_finance/data_providers/random_data_provider.py b/qiskit_finance/data_providers/random_data_provider.py index dfda7a89..5a88766a 100644 --- a/qiskit_finance/data_providers/random_data_provider.py +++ b/qiskit_finance/data_providers/random_data_provider.py @@ -10,8 +10,6 @@ # copyright notice, and modified files need to carry a notice indicating # that they have been altered from the originals. -""" Pseudo-randomly generated mock stock-market data provider """ - from __future__ import annotations import datetime import logging diff --git a/qiskit_finance/data_providers/wikipedia_data_provider.py b/qiskit_finance/data_providers/wikipedia_data_provider.py index 061899ac..19145266 100644 --- a/qiskit_finance/data_providers/wikipedia_data_provider.py +++ b/qiskit_finance/data_providers/wikipedia_data_provider.py @@ -10,7 +10,6 @@ # copyright notice, and modified files need to carry a notice indicating # that they have been altered from the originals. -""" Wikipedia data provider. """ from __future__ import annotations import logging import datetime diff --git a/qiskit_finance/data_providers/yahoo_data_provider.py b/qiskit_finance/data_providers/yahoo_data_provider.py index bbe5cf3b..65f46651 100644 --- a/qiskit_finance/data_providers/yahoo_data_provider.py +++ b/qiskit_finance/data_providers/yahoo_data_provider.py @@ -10,8 +10,6 @@ # copyright notice, and modified files need to carry a notice indicating # that they have been altered from the originals. -""" Yahoo data provider. """ - from __future__ import annotations import datetime import logging From f71d98f9fb8f1bbde12a7cd15ce9468a2b7813dc Mon Sep 17 00:00:00 2001 From: Edoardo Altamura <38359901+edoaltamura@users.noreply.github.com> Date: Tue, 11 Jun 2024 00:10:04 +0200 Subject: [PATCH 18/23] Fix html compilation --- .../data_providers/_base_data_provider.py | 19 +++++++++++++++++-- .../data_providers/data_on_demand_provider.py | 10 +++++++--- .../data_providers/exchange_data_provider.py | 12 ++++++++---- .../data_providers/random_data_provider.py | 10 +++++++--- .../data_providers/wikipedia_data_provider.py | 13 ++++++++----- .../data_providers/yahoo_data_provider.py | 10 +++++++--- 6 files changed, 54 insertions(+), 20 deletions(-) diff --git a/qiskit_finance/data_providers/_base_data_provider.py b/qiskit_finance/data_providers/_base_data_provider.py index 480a05ea..c293f51a 100644 --- a/qiskit_finance/data_providers/_base_data_provider.py +++ b/qiskit_finance/data_providers/_base_data_provider.py @@ -10,7 +10,13 @@ # copyright notice, and modified files need to carry a notice indicating # that they have been altered from the originals. -"""This module implements the abstract base class for data_provider modules the finance module.""" +"""This module implements the abstract base class for data provider modules in the finance module. + +The module defines the :code:`BaseDataProvider` abstract class which should be inherited by any data +provider class within the finance module. It also includes the :code:`StockMarket` :code:`Enum` +representing supported stock markets. +""" + from __future__ import annotations from abc import ABC, abstractmethod from typing import cast @@ -27,7 +33,16 @@ class StockMarket(Enum): - """Enum representing various stock markets.""" + """:code:`Enum` representing various stock markets. + + This :code:`Enum` contains identifiers for the following stock markets, + represented by their respective codes: + + * :code:`"XLON"`: The London Stock Exchange. + * :code:`"XPAR"`: The Euronext Paris. + * :code:`"XSES"`: The Singapore Exchange. + + """ LONDON: str = "XLON" EURONEXT: str = "XPAR" diff --git a/qiskit_finance/data_providers/data_on_demand_provider.py b/qiskit_finance/data_providers/data_on_demand_provider.py index 5ac5f9df..2507c78f 100644 --- a/qiskit_finance/data_providers/data_on_demand_provider.py +++ b/qiskit_finance/data_providers/data_on_demand_provider.py @@ -10,6 +10,8 @@ # copyright notice, and modified files need to carry a notice indicating # that they have been altered from the originals. +"""NASDAQ Data on demand data provider.""" + from __future__ import annotations import datetime from urllib.parse import urlencode @@ -44,10 +46,12 @@ def __init__( Args: token (str): Nasdaq Data Link access token. tickers (str | list[str] | None): Tickers for the data provider. - - If a string is provided, it can be a single ticker symbol or multiple symbols + + * If a string is provided, it can be a single ticker symbol or multiple symbols separated by semicolons or newlines. - - If a list of strings is provided, each string should be a single ticker symbol. - Default is :code:`None`. + * If a list of strings is provided, each string should be a single ticker symbol. + + Default is :code:`None`, which corresponds to no tickers provided. start (datetime.datetime): Start date of the data. Defaults to January 1st, 2016. end (datetime.datetime): End date of the data. diff --git a/qiskit_finance/data_providers/exchange_data_provider.py b/qiskit_finance/data_providers/exchange_data_provider.py index b017d81f..b78a3c62 100644 --- a/qiskit_finance/data_providers/exchange_data_provider.py +++ b/qiskit_finance/data_providers/exchange_data_provider.py @@ -10,6 +10,8 @@ # copyright notice, and modified files need to carry a notice indicating # that they have been altered from the originals. +""" Exchange data provider. """ + from __future__ import annotations import logging import datetime @@ -47,10 +49,12 @@ def __init__( Args: token (str): Nasdaq Data Link access token. tickers (str | list[str] | None): Tickers for the data provider. - - If a string is provided, it can be a single ticker symbol or multiple symbols - separated by semicolons or new-lines. - - If a list of strings is provided, each string should be a single ticker symbol. - Default is :code:`None`. + + * If a string is provided, it can be a single ticker symbol or multiple symbols + separated by semicolons or newlines. + * If a list of strings is provided, each string should be a single ticker symbol. + + Default is :code:`None`, which corresponds to no tickers provided. stockmarket (StockMarket): LONDON (default), EURONEXT, or SINGAPORE start (datetime.datetime): Start date of the data. Defaults to January 1st, 2016. diff --git a/qiskit_finance/data_providers/random_data_provider.py b/qiskit_finance/data_providers/random_data_provider.py index 5a88766a..f25576a1 100644 --- a/qiskit_finance/data_providers/random_data_provider.py +++ b/qiskit_finance/data_providers/random_data_provider.py @@ -10,6 +10,8 @@ # copyright notice, and modified files need to carry a notice indicating # that they have been altered from the originals. +""" Pseudo-randomly generated mock stock-market data provider """ + from __future__ import annotations import datetime import logging @@ -31,13 +33,15 @@ def __init__( seed: int | None = None, ) -> None: """ - Initialize RandomDataProvider. + Initialize an instance of pseudo-randomly generated mock stock-market data provider. Args: tickers (str | list[str] | None): Tickers for the data provider. - - If a string is provided, it can be a single ticker symbol or multiple symbols + + * If a string is provided, it can be a single ticker symbol or multiple symbols separated by semicolons or newlines. - - If a list of strings is provided, each string should be a single ticker symbol. + * If a list of strings is provided, each string should be a single ticker symbol. + Default is :code:`None`, using :code:`["TICKER1", "TICKER2"]` if not provided. start (datetime.datetime): Start date of the data. Defaults to January 1st, 2016. diff --git a/qiskit_finance/data_providers/wikipedia_data_provider.py b/qiskit_finance/data_providers/wikipedia_data_provider.py index 19145266..7c57c605 100644 --- a/qiskit_finance/data_providers/wikipedia_data_provider.py +++ b/qiskit_finance/data_providers/wikipedia_data_provider.py @@ -10,6 +10,8 @@ # copyright notice, and modified files need to carry a notice indicating # that they have been altered from the originals. +"""Wikipedia data provider.""" + from __future__ import annotations import logging import datetime @@ -44,10 +46,12 @@ def __init__( token (str | None): Nasdaq Data Link access token. Default is None. tickers (str | list[str] | None): Tickers for the data provider. - - If a string is provided, it can be a single ticker symbol or multiple symbols + + * If a string is provided, it can be a single ticker symbol or multiple symbols separated by semicolons or newlines. - - If a list of strings is provided, each string should be a single ticker symbol. - Default is None, meaning no tickers provided. + * If a list of strings is provided, each string should be a single ticker symbol. + + Default is :code:`None`, which corresponds to no tickers provided. start (datetime.datetime): Start date of the data. Default is January 1st, 2016. end (datetime.datetime): End date of the data. @@ -70,8 +74,7 @@ def __init__( def run(self) -> None: """ Loads data from Wikipedia using Nasdaq Data Link API. - - This method retrieves stock market data from the Wikipedia dataset + Retrieves stock market data from the Wikipedia dataset using Nasdaq Data Link API, and populates the data attribute of the base class, enabling further calculations like similarity and covariance matrices. diff --git a/qiskit_finance/data_providers/yahoo_data_provider.py b/qiskit_finance/data_providers/yahoo_data_provider.py index 65f46651..d690434c 100644 --- a/qiskit_finance/data_providers/yahoo_data_provider.py +++ b/qiskit_finance/data_providers/yahoo_data_provider.py @@ -10,6 +10,8 @@ # copyright notice, and modified files need to carry a notice indicating # that they have been altered from the originals. +""" Yahoo data provider. """ + from __future__ import annotations import datetime import logging @@ -49,10 +51,12 @@ def __init__( Args: tickers (str | list[str] | None): Tickers for the data provider. - - If a string is provided, it can be a single ticker symbol or multiple symbols + + * If a string is provided, it can be a single ticker symbol or multiple symbols separated by semicolons or newlines. - - If a list of strings is provided, each string should be a single ticker symbol. - Default is :code:`None`, meaning no tickers provided. + * If a list of strings is provided, each string should be a single ticker symbol. + + Default is :code:`None`, which corresponds to no tickers provided. start (datetime.datetime): Start date of the data. Default is January 1st, 2016. end (datetime.datetime): End date of the data. From 4e5ce49b2d7c81a0b9ce2e5dad3845cff65be188 Mon Sep 17 00:00:00 2001 From: Edoardo Altamura <38359901+edoaltamura@users.noreply.github.com> Date: Tue, 11 Jun 2024 14:54:05 +0200 Subject: [PATCH 19/23] Whitelist Euronext in lint --- .pylintdict | 1 + 1 file changed, 1 insertion(+) diff --git a/.pylintdict b/.pylintdict index 7442a9de..8ca5edd6 100644 --- a/.pylintdict +++ b/.pylintdict @@ -40,6 +40,7 @@ eigendecomposition eigensolver enum et +euronext european farhi formatter From dfd8f8a766bc70978aad89ec1626bdc3f33266e9 Mon Sep 17 00:00:00 2001 From: Edoardo Altamura <38359901+edoaltamura@users.noreply.github.com> Date: Tue, 11 Jun 2024 16:28:23 +0200 Subject: [PATCH 20/23] Whitelist singapore and paris in lint --- .pylintdict | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.pylintdict b/.pylintdict index 8ca5edd6..7cd91691 100644 --- a/.pylintdict +++ b/.pylintdict @@ -91,6 +91,7 @@ ok os param parametrization +paris paulis pca pdf @@ -120,6 +121,7 @@ selectable scholes scipy silvio +singapore stamatopoulos statevector stdout From 1837fe3bb75318a519937a4b99cfb6e28fcef187 Mon Sep 17 00:00:00 2001 From: Edoardo Altamura <38359901+edoaltamura@users.noreply.github.com> Date: Wed, 12 Jun 2024 10:42:24 +0200 Subject: [PATCH 21/23] Correct the docstrings and fix scattered typos --- .../data_providers/_base_data_provider.py | 14 ++++++-------- .../data_providers/exchange_data_provider.py | 4 ++-- 2 files changed, 8 insertions(+), 10 deletions(-) diff --git a/qiskit_finance/data_providers/_base_data_provider.py b/qiskit_finance/data_providers/_base_data_provider.py index c293f51a..0f5c97e4 100644 --- a/qiskit_finance/data_providers/_base_data_provider.py +++ b/qiskit_finance/data_providers/_base_data_provider.py @@ -50,9 +50,10 @@ class StockMarket(Enum): class BaseDataProvider(ABC): - """The abstract base class for data_provider modules within Qiskit Finance module. + """The abstract base class for :code:`data_provider` modules within Qiskit Finance. - To create add-on data_provider module subclass the BaseDataProvider class in this module. + Creates :code:`data_provider` module subclasses based on the :code:`BaseDataProvider` + abstract class in this module. Doing so requires that the required driver interface is implemented. To use the subclasses, please see @@ -74,11 +75,8 @@ def run(self) -> None: """ Abstract method to load data. - Method responsible for loading data. Subclasses of `BaseDataProvider` + Method responsible for loading data. Subclasses of :code:`BaseDataProvider` must implement this method to load data from a specific data source. - - Raises: - NotImplementedError: This method must be implemented in a subclass. """ pass @@ -92,7 +90,7 @@ def _check_data_loaded(self) -> None: """ if not hasattr(self, "_data") or not self._data: raise QiskitFinanceError( - "No data loaded yet. Please run the method :code:`run()` first to load the data." + "No data loaded yet. Please run the method `run()` first to load the data." ) # it does not have to be overridden in non-abstract derived classes. @@ -230,7 +228,7 @@ def get_similarity_matrix(self) -> np.ndarray: # it does not have to be overridden in non-abstract derived classes. def get_coordinates(self) -> tuple[np.ndarray, np.ndarray]: """ - Generates random coordinates for visualisation purposes. + Generates random coordinates for visualization purposes. Returns random coordinates for visualization purposes. These coordinates can be used to plot assets in a two-dimensional space, facilitating visualization diff --git a/qiskit_finance/data_providers/exchange_data_provider.py b/qiskit_finance/data_providers/exchange_data_provider.py index b78a3c62..77b1ec1c 100644 --- a/qiskit_finance/data_providers/exchange_data_provider.py +++ b/qiskit_finance/data_providers/exchange_data_provider.py @@ -62,7 +62,7 @@ def __init__( Defaults to January 30th, 2016. Raises: - QiskitFinanceError: provider doesn't support given stock market + QiskitFinanceError: provider doesn't support given stock market. """ super().__init__() @@ -88,7 +88,7 @@ def __init__( def run(self) -> None: """ - Loads data, thus enabling get_similarity_matrix and get_covariance_matrix + Loads data, thus enabling :code:`get_similarity_matrix` and :code:`get_covariance_matrix` methods in the base class. """ nasdaqdatalink.ApiConfig.api_key = self._token From 0ca7b4a84bb97fa5ffb418ef6fdc1d34e52f3786 Mon Sep 17 00:00:00 2001 From: Edoardo Altamura <38359901+edoaltamura@users.noreply.github.com> Date: Wed, 12 Jun 2024 22:23:48 +0200 Subject: [PATCH 22/23] Correct method links in API docs --- qiskit_finance/data_providers/_base_data_provider.py | 4 ++-- qiskit_finance/data_providers/data_on_demand_provider.py | 2 +- qiskit_finance/data_providers/exchange_data_provider.py | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/qiskit_finance/data_providers/_base_data_provider.py b/qiskit_finance/data_providers/_base_data_provider.py index 0f5c97e4..9707728e 100644 --- a/qiskit_finance/data_providers/_base_data_provider.py +++ b/qiskit_finance/data_providers/_base_data_provider.py @@ -181,7 +181,7 @@ def get_period_return_covariance_matrix(self) -> np.ndarray: np.ndarray: A covariance matrix between period returns of assets. Raises: - QiskitFinanceError: If no data is loaded. Please run the method :code:`run()` + QiskitFinanceError: If no data is loaded. Please run the method :meth:`run()` first to load the data. """ self._check_data_loaded() @@ -209,7 +209,7 @@ def get_similarity_matrix(self) -> np.ndarray: np.ndarray: An asset-to-asset similarity matrix. Raises: - QiskitFinanceError: If no data is loaded. Please run the method :code:`run()` + QiskitFinanceError: If no data is loaded. Please run the method :meth:`run()` first to load the data. """ self._check_data_loaded() diff --git a/qiskit_finance/data_providers/data_on_demand_provider.py b/qiskit_finance/data_providers/data_on_demand_provider.py index 2507c78f..f0041b7a 100644 --- a/qiskit_finance/data_providers/data_on_demand_provider.py +++ b/qiskit_finance/data_providers/data_on_demand_provider.py @@ -59,7 +59,7 @@ def __init__( verify (str | bool | None): If verify is `None`, runs the certificate verification (default); if this is :code:`False`, no certificates will be checked; if this is a :code:`str`, it should be pointing - to a certificate for the HTTPS connection to NASDAQ (:code:`dataondemand.nasdaq.com`), + to a certificate for the HTTPS connection to NASDAQ (www.dataondemand.nasdaq.com), either in the form of a :code:`CA_BUNDLE` file or a directory wherein to look. """ super().__init__() diff --git a/qiskit_finance/data_providers/exchange_data_provider.py b/qiskit_finance/data_providers/exchange_data_provider.py index 77b1ec1c..3263a202 100644 --- a/qiskit_finance/data_providers/exchange_data_provider.py +++ b/qiskit_finance/data_providers/exchange_data_provider.py @@ -88,7 +88,7 @@ def __init__( def run(self) -> None: """ - Loads data, thus enabling :code:`get_similarity_matrix` and :code:`get_covariance_matrix` + Loads data, thus enabling :meth:`get_similarity_matrix` and :meth:`get_covariance_matrix` methods in the base class. """ nasdaqdatalink.ApiConfig.api_key = self._token From ed6d09d1a22d540ac92b08a858fa956ccb1d0f2e Mon Sep 17 00:00:00 2001 From: Edoardo Altamura <38359901+edoaltamura@users.noreply.github.com> Date: Thu, 13 Jun 2024 01:32:02 +0200 Subject: [PATCH 23/23] Spell check --- .pylintdict | 1 + 1 file changed, 1 insertion(+) diff --git a/.pylintdict b/.pylintdict index 7cd91691..8612cde3 100644 --- a/.pylintdict +++ b/.pylintdict @@ -148,6 +148,7 @@ vec visualisation wikipedia woerner +www yamamoto yfinance york