This project is archived
Qiskit Finance is no longer maintained and this documentation is no longer updated. It is kept online for reference only, and the code it describes may not work with current versions of Qiskit. See the project repository for more information.
Source code for qiskit_finance.data_providers.wikipedia_data_provider
# This code is part of a Qiskit project.
#
# (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
# of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.
#
# Any modifications or derivative works of this code must retain this
# copyright notice, and modified files need to carry a notice indicating
# that they have been altered from the originals.
""" Wikipedia data provider. """
from typing import Optional, Union, List
import logging
import datetime
import nasdaqdatalink
from ._base_data_provider import BaseDataProvider
from ..exceptions import QiskitFinanceError
logger = logging.getLogger(__name__)
[docs]class WikipediaDataProvider(BaseDataProvider):
"""Wikipedia data provider.
Please see:
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,
start: datetime.datetime = datetime.datetime(2016, 1, 1),
end: datetime.datetime = datetime.datetime(2016, 1, 30),
) -> None:
"""
Args:
token: Nasdaq Data Link access token, which is not needed, strictly speaking
tickers: tickers
start: start time
end: end time
"""
super().__init__()
self._tickers = None # type: Optional[Union[str, List[str]]]
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
self._tickers = tickers
self._start = start.strftime("%Y-%m-%d")
self._end = end.strftime("%Y-%m-%d")
self._data = []
[docs] def run(self) -> None:
"""
Loads data, thus enabling get_similarity_matrix and
get_covariance_matrix methods in the base class.
"""
nasdaqdatalink.ApiConfig.api_key = self._token
self._data = []
stocks_notfound = []
for _, ticker_name in enumerate(self._tickers):
stock_data = None
name = "WIKI" + "/" + ticker_name
try:
stock_data = nasdaqdatalink.get(name, start_date=self._start, end_date=self._end)
except nasdaqdatalink.AuthenticationError as ex:
logger.debug(ex, exc_info=True)
raise QiskitFinanceError("Nasdaq Data Link invalid token.") from ex
except nasdaqdatalink.LimitExceededError as ex:
logger.debug(ex, exc_info=True)
raise QiskitFinanceError("Nasdaq Data Link limit exceeded.") from ex
except nasdaqdatalink.NotFoundError as ex:
logger.debug(ex, exc_info=True)
stocks_notfound.append(name)
continue
except nasdaqdatalink.DataLinkError as ex:
logger.debug(ex, exc_info=True)
raise QiskitFinanceError(f"Nasdaq Data Link Error for '{name}'.") from ex
try:
self._data.append(stock_data["Adj. Close"])
except KeyError as ex:
raise QiskitFinanceError("Cannot parse Nasdaq Data Link output.") from ex
if stocks_notfound:
raise QiskitFinanceError(f"Stocks not found: {stocks_notfound}. ")