Note
Cette page a été générée à partir de tutorials/finance/11_time_series.ipynb.
Exécuter en mode interactif dans le IBM Quantum lab.
*Chargement et traitement des actions avec des séries chronologiques *¶
Introduction¶
Dans de nombreux problèmes du domaine de la finance, on commence par une série chronologique. Ici, nous vous indiquons comment générer des séries temporelles pseudo-aléatoires, télécharger des séries temporelles de stock-temps réelles à partir d’un certain nombre de fournisseurs communs, et comment calculer des mesures de similarité pour des séries chronologiques.
[1]:
%matplotlib inline
from qiskit.finance import QiskitFinanceError
from qiskit.finance.data_providers import *
import warnings
warnings.filterwarnings("ignore", category=DeprecationWarning)
import datetime
import matplotlib.pyplot as plt
from pandas.plotting import register_matplotlib_converters
register_matplotlib_converters()
[2]:
data = RandomDataProvider(tickers=["TICKER1", "TICKER2"],
start = datetime.datetime(2016, 1, 1),
end = datetime.datetime(2016, 1, 30),
seed = 1)
data.run()
Une fois les données chargées, vous pouvez utiliser divers algorithmes pour les agréger. Notamment, vous pouvez calculer la matrice de covariance ou une variante, qui pourrait prendre en compte d’autres mesures de similarité des séries chronologiques basées sur déformation temporelle dynamique (DTW-Dynamic Time Warping). Dans la DTW, les changements qui dont les vitesses varient, par exemple le changement de prix d’un titre suivant la variation de prix d’un autre titre avec un léger retard, peuvent être pris en compte.
[3]:
means = data.get_mean_vector()
print("Means:")
print(means)
rho = data.get_similarity_matrix()
print("A time-series similarity measure:")
print(rho)
plt.imshow(rho)
plt.show()
cov = data.get_covariance_matrix()
print("A covariance matrix:")
print(cov)
plt.imshow(cov)
plt.show()
Means:
[33.97683271 97.61130683]
A time-series similarity measure:
[[1.00000000e+00 5.41888011e-04]
[5.41888011e-04 1.00000000e+00]]

A covariance matrix:
[[2.08413157 0.20842107]
[0.20842107 1.99542187]]

Si vous le souhaitez, vous pouvez consulter les séries temporelles pseudo-aléatoires sous-jacentes. Veuillez noter que les membres de la classe privée (à commencer par le tiret-bas) pourraient changer dans les prochaines versions de Qiskit.
[4]:
print("The underlying evolution of stock prices:")
for (cnt, s) in enumerate(data._tickers):
plt.plot(data._data[cnt], label=s)
plt.legend()
plt.xticks(rotation=90)
plt.show()
for (cnt, s) in enumerate(data._tickers):
print(s)
print(data._data[cnt])
The underlying evolution of stock prices:

TICKER1
[33.345584192064784, 34.167202335565946, 34.49763941174933, 33.19448218014497, 34.099838046818086, 34.5462126191821, 34.009259383821814, 34.59037748801817, 34.95494988420424, 35.24908238085977, 35.27750462217556, 35.82421760878801, 35.08776352178634, 34.92485357379329, 34.442734261113316, 35.04158047374794, 35.0813025812296, 34.78884583026451, 34.00693736790767, 33.7497451272888, 33.757887307807145, 33.48228440250777, 34.77634821690598, 35.783072532211776, 33.07191005324581, 31.182896807278134, 31.008124715222973, 30.585934303646617, 30.799577301145227]
TICKER2
[96.8774156647853, 98.99525441983634, 97.88323365714406, 97.50562865001707, 99.5484002575094, 100.19510325371124, 100.85816662608751, 100.34416025440004, 98.69608508354439, 98.86354982776713, 98.97256391558868, 97.7452118613441, 97.06198519956354, 96.98994151983632, 96.04518989677554, 95.94691992892332, 96.04240295639278, 96.07798919344826, 95.57169753513395, 96.16544560691977, 97.0566125612021, 97.37746086576867, 96.55923063837835, 97.29088292216379, 96.78944290369674, 97.66860352198472, 96.59681610510728, 97.51128330823606, 97.49121985362058]
Évidemment, vous pouvez adapter le nombre et les noms des « tickers » et la plage des dates:
[5]:
data = RandomDataProvider(tickers=["CompanyA", "CompanyB", "CompanyC"],
start = datetime.datetime(2015, 1, 1),
end = datetime.datetime(2016, 1, 30),
seed = 1)
data.run()
for (cnt, s) in enumerate(data._tickers):
plt.plot(data._data[cnt], label=s)
plt.legend()
plt.xticks(rotation=90)
plt.show()

Accès à la série chronologique des prix de clôture¶
Bien que l’accès aux données en temps réel soit généralement payant, il est possible d’accéder gratuitement aux prix de clôture historiques (ajustés) via Wikipedia et Quandl, à la suite de l’inscription sur : https://www.quandl.com/?modal=register . Dans le code ci-dessous, il est nécessaire de spécifier les tickers réels du NASDAQ ainsi que le jeton d’accès que vous obtenez de Quandl ; en exécutant le code ci-dessous, vous acceptez les termes et conditions de Quandl, y compris une dispense de responsabilité. Notez qu’au moins deux tickers sont requis pour le calcul des matrices de covariance et de série temporelle, cependant, l’utilisation de centaines de tickers peut dépasser les limites d’utilisation équitable de Quandl.
[6]:
stocks = ["GOOG", "AAPL"]
token = "REPLACE-ME"
if token != "REPLACE-ME":
try:
wiki = WikipediaDataProvider(
token = token,
tickers = stocks,
start = datetime.datetime(2016,1,1),
end = datetime.datetime(2016,1,30))
wiki.run()
except QiskitFinanceError as ex:
print(ex)
print("Error retrieving data.")
Une fois les données chargées, vous pouvez à nouveau calculer la matrice de covariance ou ses variantes DTW.
[7]:
if token != "REPLACE-ME":
if wiki._data:
if wiki._n <= 1:
print("Not enough wiki data to plot covariance or time-series similarity. Please use at least two tickers.")
else:
rho = wiki.get_similarity_matrix()
print("A time-series similarity measure:")
print(rho)
plt.imshow(rho)
plt.show()
cov = wiki.get_covariance_matrix()
print("A covariance matrix:")
print(cov)
plt.imshow(cov)
plt.show()
else:
print('No wiki data loaded.')
Si vous le souhaitez, vous pouvez examiner les séries temporelles sous-jacentes en utilisant :
[8]:
if token != "REPLACE-ME":
if wiki._data:
print("The underlying evolution of stock prices:")
for (cnt, s) in enumerate(stocks):
plt.plot(wiki._data[cnt], label=s)
plt.legend()
plt.xticks(rotation=90)
plt.show()
for (cnt, s) in enumerate(stocks):
print(s)
print(wiki._data[cnt])
else:
print('No wiki data loaded.')
[Optional] Jeton de configuration pour accéder à des séries temporelles récentes et à granularité fine¶
Si vous souhaitez télécharger des données professionnelles, vous devez mettre en place un jeton avec l’un des principaux fournisseurs. Voyons maintenant les données avec le service NASDAQ Data on Demand, qui peut fournir des offres et demander des prix avec une résolution arbitraire, ainsi que des agrégats tels que les prix de clôture corrigés quotidiens, pour le NASDAQ et le NYSE.
Si vous n’avez pas de licence d’utilisation pour le service NASDAQ Data on Demand, vous pouvez contacter le NASDAQ (cf. https://business.nasdaq.com/intel/GIS/Nasdaq-Data-on-Demand.html) pour obtenir une licence d’essai ou une licence payante.
Si et quand vous avez accès au service NASDAQ Data on Demand à l’aide de votre propre jeton, vous devez remplacer REPLACE-ME ci-dessous par le jeton. Pour garantir la sécurité de la connexion, vous devriez également avoir vos propres moyens de valider les certificats du NASDAQ. Le constructeur DataOnDemandProvider a un argument optionnel verify
, qui peut être None
ou une chaîne ou une valeur booléenne. S’il est None
, des certificats seront utilisés (par défaut). Si la vérification est une chaîne, elle doit pointer vers un certificat pour la connexion HTTPS au NASDAQ (dataondemand.nasdaq.com), sous la forme d’un fichier CA_BUNDLE ou d’un répertoire dans lequel regarder.
[9]:
token = "REPLACE-ME"
if token != "REPLACE-ME":
try:
nasdaq = DataOnDemandProvider(token = token,
tickers = ["GOOG", "AAPL"],
start = datetime.datetime(2016,1,1),
end = datetime.datetime(2016,1,2))
nasdaq.run()
for (cnt, s) in enumerate(nasdaq._tickers):
plt.plot(nasdaq._data[cnt], label=s)
plt.legend()
plt.xticks(rotation=90)
plt.show()
except QiskitFinanceError as ex:
print(ex)
print("Error retrieving data.")
Un autre fournisseur majeur de données sur les marchés boursiers est Exchange Data International (EDI), dont l’API peut être utilisée pour interroger plus de 100 marchés émergents et frontaliers qui sont l’Afrique, l’Asie, l’Extrême-Orient, l’Amérique latine et le Moyen-Orient, ainsi que les marchés les plus établis. Voir: https://www.exchange-data.com/pricing-data/adjusted-prices.php#exchange-coverage pour un aperçu de la couverture.
L’accès nécessite à nouveau un jeton d’accès pour remplacer REPLACE-ME ci-dessous. Le jeton peut être obtenu à l’issue d’un essai ou d’un paiement, à l’adresse suivante: https://www.quandl.com/
[10]:
token = "REPLACE-ME"
if token != "REPLACE-ME":
try:
lse = ExchangeDataProvider(token = token,
tickers = ["AEO", "ABBY", "ADIG", "ABF",
"AEP", "AAL", "AGK", "AFN", "AAS", "AEFS"],
stockmarket = StockMarket.LONDON,
start=datetime.datetime(2018, 1, 1),
end=datetime.datetime(2018, 12, 31))
lse.run()
for (cnt, s) in enumerate(lse._tickers):
plt.plot(lse._data[cnt], label=s)
plt.legend()
plt.xticks(rotation=90)
plt.show()
except QiskitFinanceError as ex:
print(ex)
print("Error retrieving data.")
On peut aussi accéder à Yahoo Finance Data depuis Yahoo ! Finances, aucun jeton d’accès n’est requis.
[11]:
try:
data = YahooDataProvider(
tickers = ["AEO", "ABBY", "AEP", "AAL", "AFN"],
start=datetime.datetime(2018, 1, 1),
end=datetime.datetime(2018, 12, 31))
data.run()
for (cnt, s) in enumerate(data._tickers):
plt.plot(data._data[cnt], label=s)
plt.legend()
plt.xticks(rotation=90)
plt.show()
except QiskitFinanceError as ex:
data = None
print(ex)

Pour l’utilisation effective de données, veuillez consulter les notebooks portfolio_optimization ou portfolio_diversification.
[12]:
import qiskit.tools.jupyter
%qiskit_version_table
%qiskit_copyright
Version Information
Qiskit Software | Version |
---|---|
Qiskit | None |
Terra | 0.15.1 |
Aer | 0.6.1 |
Ignis | 0.4.0 |
Aqua | 0.7.5 |
IBM Q Provider | 0.8.0 |
System information | |
Python | 3.7.4 (default, Aug 13 2019, 15:17:50) [Clang 4.0.1 (tags/RELEASE_401/final)] |
OS | Darwin |
CPUs | 2 |
Memory (Gb) | 12.0 |
Wed Aug 12 13:20:52 2020 EDT |
This code is a part of Qiskit
© Copyright IBM 2017, 2020.
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.
[ ]: