!pip install xlrd
!pip install yfinance==0.1.77
!pip install statsmodels
!pip install openpyxl
# 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)
geral
# Checando se a base foi limpada corretamente
print(geral.isna().sum())
# 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)
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()