!pip install xlrd
!pip install yfinance==0.1.77
!pip install statsmodels
!pip install openpyxl
Looking in indexes: https://pypi.org/simple, https://us-python.pkg.dev/colab-wheels/public/simple/
Requirement already satisfied: xlrd in /usr/local/lib/python3.9/dist-packages (2.0.1)
Looking in indexes: https://pypi.org/simple, https://us-python.pkg.dev/colab-wheels/public/simple/
Requirement already satisfied: yfinance==0.1.77 in /usr/local/lib/python3.9/dist-packages (0.1.77)
Requirement already satisfied: numpy>=1.15 in /usr/local/lib/python3.9/dist-packages (from yfinance==0.1.77) (1.22.4)
Requirement already satisfied: multitasking>=0.0.7 in /usr/local/lib/python3.9/dist-packages (from yfinance==0.1.77) (0.0.11)
Requirement already satisfied: appdirs>=1.4.4 in /usr/local/lib/python3.9/dist-packages (from yfinance==0.1.77) (1.4.4)
Requirement already satisfied: pandas>=0.24.0 in /usr/local/lib/python3.9/dist-packages (from yfinance==0.1.77) (1.5.3)
Requirement already satisfied: lxml>=4.5.1 in /usr/local/lib/python3.9/dist-packages (from yfinance==0.1.77) (4.9.2)
Requirement already satisfied: requests>=2.26 in /usr/local/lib/python3.9/dist-packages (from yfinance==0.1.77) (2.27.1)
Requirement already satisfied: pytz>=2020.1 in /usr/local/lib/python3.9/dist-packages (from pandas>=0.24.0->yfinance==0.1.77) (2022.7.1)
Requirement already satisfied: python-dateutil>=2.8.1 in /usr/local/lib/python3.9/dist-packages (from pandas>=0.24.0->yfinance==0.1.77) (2.8.2)
Requirement already satisfied: idna<4,>=2.5 in /usr/local/lib/python3.9/dist-packages (from requests>=2.26->yfinance==0.1.77) (3.4)
Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.9/dist-packages (from requests>=2.26->yfinance==0.1.77) (2022.12.7)
Requirement already satisfied: charset-normalizer~=2.0.0 in /usr/local/lib/python3.9/dist-packages (from requests>=2.26->yfinance==0.1.77) (2.0.12)
Requirement already satisfied: urllib3<1.27,>=1.21.1 in /usr/local/lib/python3.9/dist-packages (from requests>=2.26->yfinance==0.1.77) (1.26.15)
Requirement already satisfied: six>=1.5 in /usr/local/lib/python3.9/dist-packages (from python-dateutil>=2.8.1->pandas>=0.24.0->yfinance==0.1.77) (1.16.0)
Looking in indexes: https://pypi.org/simple, https://us-python.pkg.dev/colab-wheels/public/simple/
Requirement already satisfied: statsmodels in /usr/local/lib/python3.9/dist-packages (0.13.5)
Requirement already satisfied: packaging>=21.3 in /usr/local/lib/python3.9/dist-packages (from statsmodels) (23.0)
Requirement already satisfied: pandas>=0.25 in /usr/local/lib/python3.9/dist-packages (from statsmodels) (1.5.3)
Requirement already satisfied: patsy>=0.5.2 in /usr/local/lib/python3.9/dist-packages (from statsmodels) (0.5.3)
Requirement already satisfied: scipy>=1.3 in /usr/local/lib/python3.9/dist-packages (from statsmodels) (1.10.1)
Requirement already satisfied: numpy>=1.17 in /usr/local/lib/python3.9/dist-packages (from statsmodels) (1.22.4)
Requirement already satisfied: python-dateutil>=2.8.1 in /usr/local/lib/python3.9/dist-packages (from pandas>=0.25->statsmodels) (2.8.2)
Requirement already satisfied: pytz>=2020.1 in /usr/local/lib/python3.9/dist-packages (from pandas>=0.25->statsmodels) (2022.7.1)
Requirement already satisfied: six in /usr/local/lib/python3.9/dist-packages (from patsy>=0.5.2->statsmodels) (1.16.0)
Looking in indexes: https://pypi.org/simple, https://us-python.pkg.dev/colab-wheels/public/simple/
Requirement already satisfied: openpyxl in /usr/local/lib/python3.9/dist-packages (3.0.10)
Requirement already satisfied: et-xmlfile in /usr/local/lib/python3.9/dist-packages (from openpyxl) (1.1.0)
# Importações
import matplotlib.pyplot as plt
import pandas as pd
import yfinance as yf
import statsmodels.api as sm
import statsmodels.tsa as smts
import statsmodels.formula.api as smf
import numpy as np
import plotly.graph_objects as go
from statsmodels.sandbox.regression.predstd import wls_prediction_std
pd.options.plotting.backend = "plotly"
# Cotação S&P 500
#Obtendo dados de fechamento do S&P 500 através do yahoo finance
spxts = pd.DataFrame(yf.Ticker("^GSPC").history(period="max")["Close"])
spxts.rename(columns={"Close":"Close_spx"},inplace=True)
# Normallizando datas
spxts.index = pd.DatetimeIndex(spxts.index).strftime("%Y-%m-%d")
# Obtendo dados de fechamento do bitcion através do yahoo finance
btcts = pd.DataFrame(yf.Ticker("BTC-USD").history(period="max")["Close"])
# Normallizando datas
btcts.index = pd.DatetimeIndex(btcts.index).strftime("%Y-%m-%d")
btcts.rename(columns={"Close":"Close_btc"},inplace=True)
# Cotação do Dólar/Yuan
# Obtendo dados de fechamento do Dólar/Yuan através do yahoo finance
usdts = pd.DataFrame(yf.Ticker("CNY=X").history(period="max")["Close"])
usdts.rename(columns={"Close":"Close_usd"},inplace=True)
# Normallizando datas
usdts.index = pd.DatetimeIndex(usdts.index).strftime("%Y-%m-%d")
# Obtendo dados da EPU US
EPU_US_TS = pd.read_excel("/content/USEPUINDXD.xls")
EPU_US_TS["Data"]=pd.DatetimeIndex(EPU_US_TS["year"]).strftime("%Y-%m-%d")
EPU_US_TS.set_index("Data",inplace=True)
# Obtendo dados da taxa de juros overnight FED e ajustando base
interest_rate_FED = pd.read_excel("/content/DFF (1).xls")
interest_rate_FED.columns=["Data","DFF"]
interest_rate_FED = interest_rate_FED[10:]
interest_rate_FED["Data"]=pd.DatetimeIndex(interest_rate_FED["Data"]).strftime("%Y-%m-%d")
interest_rate_FED.set_index("Data",inplace=True)
interest_rate_FED["DFF"]=interest_rate_FED["DFF"].astype(float)
# Juntando bases do FEB, bitcoin e EPU US (normlizando pra mesma data)
geral = btcts.join([interest_rate_FED,EPU_US_TS,spxts,usdts])
# Vizualizando a base
geral
# Checando missing e removendo-os.
print(geral.isna().sum())
geral.dropna(inplace=True)
Close_btc 0
DFF 4
year 1
USEPUINDXD 1
Close_spx 975
Close_usd 900
dtype: int64
geral
# Checando se a base foi limpada corretamente
print(geral.isna().sum())
Close_btc 0
DFF 0
year 0
USEPUINDXD 0
Close_spx 0
Close_usd 0
dtype: int64
# Renomeando as colunas
geral = geral.rename(columns={"Close_btc":"Bitcoin","Close_spx":"S&P500", "USEPUINDXD":"EPU_US","DFF":"Juros_FED","Close_usd":"Dolar"}).drop(columns=["year"])
# Existem diversas quebras estruturais previamente identificadas em outros testes
# Portanto criaremos algumas dummies
# Criando dummy para quebra estrutural BTC para cima 1
geral.loc[(geral.index>"2020-09-23") & (geral.index<"2021-05-08"), "dummy_Bitcoin_Alta1"]=1
geral["dummy_Bitcoin_Alta1"].fillna(0,inplace=True)
# Criando dummy para quebra estrutural BTC para baixo 1
geral.loc[(geral.index>"2021-05-08") & (geral.index<"2021-07-20"), "dummy_Bitcoin_Baixa1"]=1
geral["dummy_Bitcoin_Baixa1"].fillna(0,inplace=True)
# Criando dummy para quebra estrutural BTC para cima 2
geral.loc[(geral.index>"2021-07-20") & (geral.index<"2021-11-08"), "dummy_Bitcoin_Alta2"]=1
geral["dummy_Bitcoin_Alta2"].fillna(0,inplace=True)
# Criando dummy para quebra estrutural BTC para baixo 2
geral.loc[geral.index>"2021-07-20", "dummy_Bitcoin_Baixa2"]=1
geral["dummy_Bitcoin_Baixa2"].fillna(0,inplace=True)
# Criando uma variavel tempo para observar checar tendencia
geral["Tempo"] = np.arange(1,len(geral)+1,1)
# Criando dummy para quebra estrutural interest rate para baixo
geral.loc[(geral.index>"2020-03-01") & (geral.index<"2022-03-15"), "dummy_Juros_Baixa"]=1
geral["dummy_Juros_Baixa"].fillna(0,inplace=True)
# Pegando retorno das séries
geral["lnBitcoin_df1"] = np.log(geral["Bitcoin"]/geral["Bitcoin"].shift(1))
geral["lnDolar_df1"] = np.log(geral["Dolar"]/geral["Dolar"].shift(1))
geral["lnSpx_df1"] = np.log(geral["S&P500"]/geral["S&P500"].shift(1))
# Regressão original
smf.ols(formula='lnBitcoin_df1~lnBitcoin_df1.shift(1)+dummy_Bitcoin_Alta1+dummy_Bitcoin_Baixa1+Juros_FED+dummy_Juros_Baixa+lnDolar_df1+lnDolar_df1.shift(1)+lnSpx_df1+lnSpx_df1.shift(1)+EPU_US+Tempo', data=geral).fit().summary()
# Cotação do Dólar/Real
# Obtendo dados de fechamento do Dólar através do yahoo finance
realts = pd.DataFrame(yf.Ticker("BRL=X").history(period="max")["Close"])
realts.rename(columns={"Close":"Close_brl"},inplace=True)
# Normallizando datas
realts.index = pd.DatetimeIndex(realts.index).strftime("%Y-%m-%d")
# Juntando bases do FEB, bitcoin e EPU US (normlizando pra mesma data)
geral = btcts.join([interest_rate_FED,EPU_US_TS,spxts,realts])
# Checando missings e removendo-os
print(geral.isna().sum())
geral.dropna(inplace=True)
Close_btc 0
DFF 4
year 1
USEPUINDXD 1
Close_spx 975
Close_brl 899
dtype: int64
geral = geral.rename(columns={"Close_btc":"Bitcoin","Close_spx":"S&P500", "USEPUINDXD":"EPU_US","DFF":"Juros_FED","Close_brl":"Real"}).drop(columns=["year"])
geral
# Criando dummy para quebra estrutural BTC para cima 1
geral.loc[(geral.index>"2020-09-23") & (geral.index<"2021-05-08"), "dummy_Bitcoin_Alta1"]=1
geral["dummy_Bitcoin_Alta1"].fillna(0,inplace=True)
# Criando dummy para quebra estrutural BTC para baixo 1
geral.loc[(geral.index>"2021-05-08") & (geral.index<"2021-07-20"), "dummy_Bitcoin_Baixa1"]=1
geral["dummy_Bitcoin_Baixa1"].fillna(0,inplace=True)
# Criando dummy para quebra estrutural BTC para cima 2
geral.loc[(geral.index>"2021-07-20") & (geral.index<"2021-11-08"), "dummy_Bitcoin_Alta2"]=1
geral["dummy_Bitcoin_Alta2"].fillna(0,inplace=True)
# Criando dummy para quebra estrutural BTC para baixo 2
geral.loc[geral.index>"2021-07-20", "dummy_Bitcoin_Baixa2"]=1
geral["dummy_Bitcoin_Baixa2"].fillna(0,inplace=True)
# Criando uma variavel tempo para observar checar tendencia
geral["Tempo"] = np.arange(1,len(geral)+1,1)
# Criando dummy para quebra estrutural interest rate para baixo
geral.loc[(geral.index>"2020-03-01") & (geral.index<"2022-03-15"), "dummy_Juros_Baixa"]=1
geral["dummy_Juros_Baixa"].fillna(0,inplace=True)
# Pegando retorno das séries
geral["lnBitcoin_df1"] = np.log(geral["Bitcoin"]/geral["Bitcoin"].shift(1))
geral["lnReal_df1"] = np.log(geral["Real"]/geral["Real"].shift(1))
geral["lnSpx_df1"] = np.log(geral["S&P500"]/geral["S&P500"].shift(1))
# Regressão para o real
smf.ols(formula='lnBitcoin_df1~lnBitcoin_df1.shift(1)+dummy_Bitcoin_Alta1+dummy_Bitcoin_Baixa1+Juros_FED+dummy_Juros_Baixa+lnReal_df1+lnReal_df1.shift(1)+lnSpx_df1+lnSpx_df1.shift(1)+EPU_US+Tempo', data=geral).fit().summary()