Nota
Esta página foi gerada a partir de tutorials/finance/11_time_series.ipynb.
Execute interativamente no IBM Quantum lab.
Carregando e Processando Dados de Séries Temporais do Mercado de Ações¶
Introdução¶
Dentre muitos problemas nas finanças, um começa com séries temporais. Aqui, mostraremos como gerar séries temporais pseudoaleatórias, baixar séries temporais reais do mercado de ações de vários provedores comuns, e como computar medidas de similaridade de séries temporais.
[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()
Uma vez que os dados são carregados, você pode executar uma variedade de algoritmos sobre os mesmos para agregá-los. Notavelmente, você pode calcular a matriz de covariância ou uma variante, o que consideraria medidas de similaridade de séries temporais alternativas baseadas em dynamic time warping (DTW). Na DTW, as mudanças que variam em velocidade, por exemplo, o preço de uma ação seguindo o preço de outra ação com um pequeno atraso, podem ser acomodadas.
[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]]

Se desejar, você pode observar as séries temporais pseudo-aleatórias subjacentes utilizadas. Por favor, considere que os membros da classe privada (começando pelo underline) podem mudar em lançamentos futuros do 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]
Claramente, você pode adaptar o número e os nomes dos tickers e o intervalo de datas:
[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()

Acessando o time-series do preço de fechamento¶
Enquanto o acesso a dados em tempo real geralmente requer um pagamento, é possível acessar preços de fechamento históricos (ajustados) via Wikipedia e Quandl de forma gratuita, seguindo o registro em: https://www.quandl.com/?modal=register No código abaixo, é necessário especificar os tickers reais da NASDAQ e o token de acesso que você obtém de Quandl; Ao executar o código abaixo, você concorda com os termos e condições de Quandl, incluindo uma renúncia de responsabilidade. Observe que pelo menos dois tickers são necessários para a computação de matrizes de covariância e de séries temporais, mas centenas de tickers podem ir além dos limites de uso justo do 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.")
Assim que os dados são carregados, você pode voltar a calcular a matriz de covariância ou suas 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.')
Se desejar, você pode olhar para o tempo subjacente-série usando:
[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] Configure o token para acessar séries temporais recentes e refinadas¶
Se você quiser fazer o download de dados profissionais, terá que configurar um token com um dos principais provedores. Vamos agora ilustrar os dados com o NASDAQ Data on Demand, que pode fazer ofertas e solicitar preços em resolução arbitrária, bem como dados agregados como preços de fechamento ajustados diários, para NASDAQ e NYSE.
Se você não tiver a licença NASDAQ Data on Demand, você pode entrar em contato com a NASDAQ (cf. https://business.nasdaq.com/intel/GIS/Nasdaq-Data-on-Demand.html) para obter uma licença de teste ou paga.
Se e quando você tiver acesso ao NASDAQ Data on Demand usando o seu próprio token, você deverá substituir REPLACE-ME abaixo com o token. Para garantir a segurança da conexão, você também deve ter o seu próprio meio de validar os certificados da NASDAQ. O construtor DataOnDemandProvider tem um argumento opcional verify
, que pode ser None
, um conjunto de caracteres ou um booleano. Se for None
, serão utilizados certificados de certificação (padrão). Se verify for um conjunto de caracteres, ele deve estar apontando para um certificado para a conexão HTTPS para NASDAQ (dataondemand.nasdaq.com), seja na forma de um arquivo CA_BUNDLE ou de um diretório para busca.
[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.")
Outro importante fornecedor de dados do mercado de ações é o Exchange Data International (EDI), cuja API podem ser usadas para consultar mais de 100 mercados emergentes e de fronteira que são África, Ásia, Extremo Oriente, América Latina e Oriente Médio, bem como os mais estabelecidos. Veja: https://www.exchange-data.com/pricing-data/adjusted-prices.php#exchange-cobertura para uma visão geral da cobertura.
O acesso também requer um token de acesso válido para substituir REPLACE-ME abaixo. O token pode ser obtido em um teste ou pré-pago para uso em: 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.")
Um deles também pode acessar o Yahoo Finance Data, a partir do Yahoo! Finance, sem a necessidade de um token.
[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)

Para o uso real dos dados, por favor, consulte os 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.
[ ]: