Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #SEÇÃO 1 = CARREGAR A PORRA TODA
- import datetime
- import pandas as pd
- import matplotlib.pyplot as plt
- from matplotlib import style
- #dados yahoo
- import pandas_datareader.data as web
- import seaborn as sns
- import random
- import numpy as np
- #corrigir bug do yahoo finance
- !pip install yfinance --upgrade --no-cache-dir
- import yfinance as yf
- yf.pdr_override()
- #SEÇÃO 2 = PEGAR OS DADOS DE COTAÇÕES E VOLUME DO YAHOO
- start = "2000-01-01"
- end="2020-08-15"
- # LISTA SÓ DE AÇÕES ON
- # ATENÇÃO: EXISTEM ERROS NO YAHOO FINANCE PARA BRAP3, ENGI3 E TIET3, FORAM REMOVIDAS MANUALMENTE NA LISTAGEM ABAIXO
- tickers_ibov = "ITUB3.SA ODER3.SA BAUH3.SA MAPT3.SA SPRI3.SA RANI3.SA TASA13.SA TASA3.SA LREN3.SA HETA3.SA EEEL3.SA BRSR3.SA PATI3.SA GOAU3.SA PNVL3.SA LUXM3.SA CGRA3.SA KEPL3.SA FNCN3.SA STTR3.SA RCSL3.SA UCAS3.SA SANB3.SA MNPR3.SA GRND3.SA KLBN3.SA LUPA3.SA SLCE3.SA RAPT3.SA PTNT3.SA POMO3.SA MNDL3.SA FRAS3.SA HBTS3.SA JOPA3.SA FRTA3.SA MTSA3.SA RSUL3.SA SHUL3.SA MWET3.SA DOHL3.SA TUPY3.SA WEGE3.SA CLSC3.SA PTBL3.SA TXRX3.SA EALT3.SA CTKA3.SA TEKA3.SA CASN3.SA POSI3.SA MTIG3.SA HGTX3.SA INEP3.SA OIBR3.SA SAPR3.SA CPLE3.SA CRFB3.SA CYRE3.SA TEND3.SA BEEF3.SA VIVR3.SA RDNI3.SA CAML3.SA PINE3.SA AHEB13.SA AHEB3.SA CGAS3.SA RADL3.SA REDE3.SA ITSA3.SA DASA3.SA BALM3.SA AZEV3.SA AMAR3.SA APTI3.SA MYPK3.SA ETER3.SA CAMB3.SA ESTR3.SA ALPA3.SA NAFG3.SA RSID3.SA MGEL3.SA IDVL3.SA CALI3.SA CESP3.SA USIM3.SA NORD3.SA BDLL3.SA FLRY3.SA BRIV3.SA BBDC3.SA MSPA3.SA NEMO3.SA JBDU3.SA JPSA3.SA SLED3.SA LEVE3.SA PMAM3.SA PPAR3.SA WHRL3.SA ODPV3.SA BMKS3.SA ROMI3.SA EUCA3.SA TOTS3.SA JSLG3.SA PLAS3.SA SMTO3.SA IGTA3.SA NUTR3.SA VULC3.SA CSAN3.SA BOBR3.SA LLIS3.SA HBOR3.SA MGLU3.SA PCAR3.SA BAHI3.SA PFRM3.SA CEAB3.SA SBSP3.SA EVEN3.SA IGBR3.SA AALR3.SA BTTL3.SA WIZS3.SA LOGN3.SA BRKM3.SA BRQB3.SA QUSW3.SA BRDT3.SA BMIN3.SA UNIP3.SA CEGR3.SA VIVA3.SA GGBR3.SA VALE3.SA TKNO3.SA RPMG3.SA SOND3.SA IRBR3.SA UGPA3.SA WLMM3.SA HOOT3.SA VLID3.SA TCNO3.SA MOAR3.SA CBEE3.SA CSNA3.SA VVAR3.SA MERC3.SA JFEN3.SA FCAP3.SA LAME3.SA PETR3.SA NTCO3.SA HAGA3.SA BPAC3.SA SULA3.SA NRTQ3.SA SCAR3.SA BEES3.SA MILS3.SA CTNM3.SA FHER3.SA MOVI3.SA CTSA3.SA OFSA3.SA GNDI3.SA CATA3.SA PARD3.SA PRNR3.SA RLOG3.SA BBSE3.SA MEAL3.SA CSMG3.SA CEDO3.SA BRGE3.SA BMEB3.SA CRIV3.SA RPAD3.SA MEND3.SA MMAQ3.SA CMIG3.SA RENT3.SA DIRR3.SA ARZZ3.SA SUZB3.SA BSEV3.SA CSAB3.SA FESA3.SA CEEB3.SA CRPG3.SA CORR3.SA SNSY3.SA ELEK3.SA BKBR3.SA CNTO3.SA BGIP3.SA MDNE3.SA QUAL3.SA APER3.SA ENAT3.SA BPHA3.SA FLEX3.SA CEPE3.SA CVCB3.SA PRIO3.SA ADHM3.SA AFLT3.SA LCAM3.SA INNT3.SA B3SA3.SA TECN3.SA ANIM3.SA OMGE3.SA OSXB3.SA LOGG3.SA DMMO3.SA TRIS3.SA YDUQ3.SA CCPR3.SA MSRO3.SA GSHP3.SA BBRK3.SA PTCA3.SA GPAR3.SA RNEW3.SA CEED3.SA CPRE3.SA GUAR3.SA ALUP3.SA MRVE3.SA CSRN3.SA EZTC3.SA JHSF3.SA IGSN3.SA LPSB3.SA TCSA3.SA CCXC3.SA MTRE3.SA TAEE3.SA CRDE3.SA MULT3.SA SGPS3.SA EMBR3.SA AGRO3.SA SMFT3.SA ABEV3.SA CNSY3.SA BNBR3.SA MDIA3.SA COCE3.SA CTCA3.SA BRPR3.SA BRML3.SA LINX3.SA ALSO3.SA TESA3.SA SMLS3.SA HAPV3.SA SEER3.SA BPAR3.SA BAZA3.SA EQPA3.SA FRIO3.SA BIOM3.SA ENEV3.SA ECOR3.SA SQIA3.SA LIQO3.SA ENBR3.SA MRFG3.SA ENMT3.SA LIGT3.SA DTCY3.SA EQTL3.SA TPIS3.SA TRPL3.SA GEPA3.SA PDGR3.SA HYPE3.SA JBSS3.SA SHOW3.SA CCRO3.SA COGN3.SA STBP3.SA MMXM3.SA VIVT3.SA TIMP3.SA EGIE3.SA CPFE3.SA RAIL3.SA IDNT3.SA LMED3.SA LWSA3.SA TGMA3.SA EKTR3.SA EMAE3.SA GPCP3.SA PSSA3.SA ECPR3.SA PEAB3.SA CARD3.SA BRFS3.SA FIGE3.SA GFSA3.SA BBML3.SA LIPR3.SA NEOE3.SA CIEL3.SA VSPT3.SA BTOW3.SA STKF3.SA BIDI3.SA ATOM3.SA TELB3.SA CMSA3.SA CEBR3.SA ELET3.SA BSLI3.SA BBAS3.SA"
- # SOBRE VIÉS DE SOBREVIVÊNCIA: PODE SER TANTO NEGATIVO QUANTO POSITIVO (DIVERSAS EMPRESAS EXCELENTES SAÍRAM DA BOLSA NESSE PERÍODO, COMO REDECARD, CETIP, SOUZA CRUZ, ETC, PAGANDO BEM AO ACIONISTA)
- cotacoes_yahoo = web.get_data_yahoo(tickers = tickers_ibov,start = start, end = end)["Adj Close"]
- volume_yahoo = web.get_data_yahoo(tickers = tickers_ibov,start = start, end = end)["Volume"]
- #SEÇÃO 3 = PEGAR OS DADOS DO ÍNDICE BOVESPA E CALCULAR RETORNO
- #ibov = web.get_data_yahoo(tickers = "BOVA11.SA" , start = start, end=end)["Adj Close"]
- ibov = web.get_data_yahoo(tickers = "^BVSP" , start = start, end=end)["Adj Close"]
- retorno_ibov = ibov.pct_change()
- retorno_acum_ibov = (1+retorno_ibov).cumprod()
- retorno_acum_ibov.iloc[0]=1
- ibov = ibov/ibov.iloc[0]
- #SEÇÃO 4 = MANIPULAR OS OS DADOS CONFORME NECESSIDADE
- #removedor de cotações em dias que não tem volume, para funcionar as dimensões das matrizes devem ser as mesmas
- linhas=len(cotacoes_yahoo)
- colunas=len(cotacoes_yahoo.columns)
- k=0
- j=0
- for k in range (linhas):
- for j in range (colunas):
- if (volume_yahoo.iloc[k,j] > 0): continue
- else:
- cotacoes_yahoo.iloc[k,j] = np.nan
- #end if
- j=j+1
- end
- k=k+1
- end
- #removedor dos que tem menos que TANTOS dias de dados, setado abaixo
- dados_yahoo = cotacoes_yahoo.dropna(axis='columns', thresh = 2000)
- cotacoes_yahoo.dropna(how ="all", inplace=True)
- #SEÇÃO 5 = CALCULAR RETORNO DAS AÇÕES
- retorno = cotacoes_yahoo.pct_change()
- print (retorno)
- #removedor de erros do yahoo de mudança de escala/ordem de grandeza
- linhas=len(retorno)
- colunas=len(retorno.columns)
- k=0
- j=0
- for k in range (linhas):
- for j in range (colunas):
- if (retorno.iloc[k,j] < 5) and ((retorno.iloc[k,j] > -0.99)): continue
- else:
- retorno.iloc[k,j] = 0
- #end if
- j=j+1
- end
- k=k+1
- end
- retorno_acum = (1+retorno).cumprod()
- retorno_acum.iloc[0]=1
- tamanhopop = len(list(cotacoes_yahoo.columns))
- print ("A população é",tamanhopop,".")
- #salvar em CSV para usar em excel ou referência
- #retorno_acum.to_csv('retorno_acumulado.csv', sep=";", decimal=",")
- #cotacoes_yahoo.to_csv('cotacoes_yahoo.csv', sep=";", decimal=",")
- #volume_yahoo.to_csv('volumes_yahoo.csv', sep=";", decimal=",")
- #SEÇÃO FINAL = CALCULAR RETORNO DAS CARTEIRAS E MOSTRAR OUTPUT
- sns.set()
- ativos = 20
- macacos = 1000
- contador = 0
- for i in range (macacos):
- #nao repetem os ativos
- carteira = random.sample(list(cotacoes_yahoo.columns), k=ativos)
- carteira = retorno_acum.loc[ : , carteira]
- carteira["saldo"] = carteira.mean(axis=1)
- carteira["saldo"].plot(figsize=(22,8))
- if (carteira['saldo'].iloc[-1]> retorno_acum_ibov.iloc[-1]):
- contador = contador + 1
- mediageral = retorno_acum.mean(axis=1)
- mediageral.plot(label = "ibov",color = "black")
- ibov.plot(label = "ibov",color = "yellow")
- print ("\033[1m","Percentual de macacos que bateram o IBOVESPA: {} %".format(contador/macacos*100))
- print ("\033[0m","Teste com",macacos,"macacos entre",start,"e",end,".")
- print (" Cada macaco escolheu aleatoriamente",ativos,"ativos de uma base de",colunas,"empresas.")
- print (" Gráfico de retorno comparativo dos macacos (linhas coloridas) com IBOV (linha preta):")
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement