QuantBrasil

Criando um Screening dos Ativos no 'Éden dos Traders' Utilizando Python

Andressa Quintanilha
Por Andressa Quintanilha
30 junho, 2021
Compartilhar:

VEJA TAMBÉM NO YOUTUBE:

A nomenclatura Éden do Traders foi criada pelo trader Stormer (Alexandre Wolwacz), para indicar quando ambas médias móveis exponenciais de 8 e 80 períodos estão apontando para a mesma direção.

Sendo assim, se as MMEs estiverem voltadas para cima, diz-se que o papel está no Éden dos Traders de compra, ao passo que se ambas estiverem viradas para baixo, o papel se encontra no Éden dos Traders de venda. Caso as médias estejam apontadas para direções contrárias, o ativo não está direcional.

Em outras palavras, o Éden dos Traders ajuda a avaliar a tendência de um ativo, e a tendência, por sua vez, é um grande aliado na análise técnica de um trader.

Quando falamos de análise técnica no mercado de ações, estamos nos referindo a um conjunto de ferramentas, como reconhecimento de padrões gráficos, indicadores e filtros, que facilitam a leitura gráfica de um ativo. Assim, somos capazes de estudar as melhores combinações entre essas ferramentas através dos backtests, buscando uma estratégia com boa taxa de retorno e baixo drawdown.

No artigo de hoje, aprenderemos a calcular quais ativos, dos 200 ativos mais líquidos da bolsa brasileira, se encontram no Éden dos Traders.

Web scraping dos 200 ativos mais líquidos da bolsa

Como de costume, o primeiro passo é importar todas as bibliotecas necessárias para o nosso código:

# %%capture means we suppress the output
%%capture

import pandas as pd
import requests

!pip install yfinance
import yfinance as yf

import sqlalchemy
from sqlalchemy import create_engine

!pip install psycopg2-binary
import psycopg2

Em seguida, vamos realizar o web scraping dessa tabela do site Fundamentus, que ordena os ativos da bolsa brasileira por diversos critérios, dentre eles, sua liquidez em 2 meses.

Para isso utilizaremos a biblioteca request para fazer a requisição HTTP (mesma biblioteca que utilizamos no artigo Determinando as BDRs Mais Líquidas do Ibovespa Utilizando Python). A única diferença é que o site Fundamentus exige a especificação do User-Agent, que nada mais é do que fazer a identificação do navegador para o site.

O último passo do web scraping será ler a tabela html em um dataframe através da função read_html. Perceba que importaremos somente as colunas com os símbolos de cada papel e sua respectiva liquidez.

url = "https://www.fundamentus.com.br/resultado.php"
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Safari/537.36"}
r = requests.get(url, headers=headers)

df = pd.read_html(r.text, decimal=",", thousands=".")[0][["Papel", "Liq.2meses"]]

df.head()
PapelLiq.2meses
0IVTT30.0
1PORP40.0
2MNSA30.0
3CSTB30.0
4CFLU40.0

Quando fazemos a leitura em dataframe, perdemos a ordenação encontrada no HTML. Por conta disso, utilizaremos a função sort_values para organizar os papeis em ordem decrescente de liquidez.

Por fim, filtraremos os 200 mais líquidos (sorted_per_liquidity) e adicionaremos o sufixo .SA necessário para baixar os preços da biblioteca do Yahoo Finance.

df.sort_values("Liq.2meses", ascending=False, inplace=True)

sorted_per_liquidity = df["Papel"].copy()[:200]

tickers = [ticker + ".SA" for ticker in sorted_per_liquidity.to_list()]
print(tickers)

['VALE3.SA', 'PETR4.SA', 'ITUB4.SA', 'BBDC4.SA', 'B3SA3.SA', 'PETR3.SA', 'VVAR3.SA', 'GGBR4.SA', 'CSNA3.SA', 'ABEV3.SA', 'BBAS3.SA', 'BPAC11.SA', 'SUZB3.SA', 'MGLU3.SA', 'LREN3.SA', 'USIM5.SA', 'ITSA4.SA', 'BRFS3.SA', 'JBSS3.SA', 'NTCO3.SA', 'ELET3.SA', 'RENT3.SA', 'BIDI11.SA', 'AZUL4.SA', 'WEGE3.SA', 'GNDI3.SA', 'CSAN3.SA', 'LAME4.SA', 'PRIO3.SA', 'BRDT3.SA', 'BRKM5.SA', 'LWSA3.SA', 'KLBN11.SA', 'BTOW3.SA', 'RDOR3.SA', 'EMBR3.SA', 'MRFG3.SA', 'BBDC3.SA', 'BRML3.SA', 'COGN3.SA', 'SULA11.SA', 'BRAP4.SA', 'GOLL4.SA', 'GOAU4.SA', 'CVCB3.SA', 'RAIL3.SA', 'ELET6.SA', 'EQTL3.SA', 'CYRE3.SA', 'HAPV3.SA', 'RADL3.SA', 'BIDI4.SA', 'MULT3.SA', 'PCAR3.SA', 'BPAN4.SA', 'CCRO3.SA', 'IRBR3.SA', 'ASAI3.SA', 'CASH3.SA', 'TOTS3.SA', 'BBSE3.SA', 'UGPA3.SA', 'POSI3.SA', 'SBSP3.SA', 'ENEV3.SA', 'CMIG4.SA', 'CMIN3.SA', 'CIEL3.SA', 'SANB11.SA', 'IGTA3.SA', 'HYPE3.SA', 'FHER3.SA', 'OIBR3.SA', 'VIVT3.SA', 'ETER3.SA', 'ALPA4.SA', 'PETZ3.SA', 'CRFB3.SA', 'EZTC3.SA', 'YDUQ3.SA', 'TAEE11.SA', 'ENGI11.SA', 'BEEF3.SA', 'QUAL3.SA', 'RRRP3.SA', 'AMAR3.SA', 'LCAM3.SA', 'SLCE3.SA', 'VIVR3.SA', 'LAME3.SA', 'TIMS3.SA', 'HGTX3.SA', 'CXSE3.SA', 'ENBR3.SA', 'ECOR3.SA', 'MRVE3.SA', 'EGIE3.SA', 'WIZS3.SA', 'PSSA3.SA', 'CPLE6.SA', 'LINX3.SA', 'RAPT4.SA', 'DTEX3.SA', 'CPFE3.SA', 'PTBL3.SA', 'ARZZ3.SA', 'INTB3.SA', 'TASA4.SA', 'ALSO3.SA', 'CESP6.SA', 'UNIP6.SA', 'STBP3.SA', 'FLRY3.SA', 'NEOE3.SA', 'SOMA3.SA', 'MOVI3.SA', 'LJQQ3.SA', 'SMTO3.SA', 'HBSA3.SA', 'AERI3.SA', 'SAPR11.SA', 'LIGT3.SA', 'SBFG3.SA', 'VIVA3.SA', 'MDIA3.SA', 'JHSF3.SA', 'MYPK3.SA', 'GMAT3.SA', 'AGRO3.SA', 'TRPL4.SA', 'TUPY3.SA', 'CSMG3.SA', 'VAMO3.SA', 'ROMI3.SA', 'ANIM3.SA', 'ESPA3.SA', 'SIMH3.SA', 'SEQL3.SA', 'ENAT3.SA', 'MOSI3.SA', 'LEVE3.SA', 'BKBR3.SA', 'TEND3.SA', 'OMGE3.SA', 'BMOB3.SA', 'LUPA3.SA', 'BRSR6.SA', 'ALUP11.SA', 'DASA3.SA', 'CPLE11.SA', 'GFSA3.SA', 'RANI3.SA', 'DIRR3.SA', 'FESA4.SA', 'AMBP3.SA', 'BIDI3.SA', 'CEAB3.SA', 'AURA33.SA', 'ENJU3.SA', 'POMO4.SA', 'PNVL3.SA', 'MODL11.SA', 'MEAL3.SA', 'TPIS3.SA', 'ITUB3.SA', 'GRND3.SA', 'BRPR3.SA', 'RECV3.SA', 'AALR3.SA', 'MILS3.SA', 'NGRD3.SA', 'GUAR3.SA', 'HBOR3.SA', 'SAPR4.SA', 'AESB3.SA', 'SEER3.SA', 'SOJA3.SA', 'EVEN3.SA', 'DEXP3.SA', 'JPSA3.SA', 'MTRE3.SA', 'PGMN3.SA', 'PMAM3.SA', 'CAML3.SA', 'LOGN3.SA', 'BLAU3.SA', 'LAVV3.SA', 'SQIA3.SA', 'CPLE3.SA', 'GGPS3.SA', 'ABCB4.SA', 'DMMO3.SA', 'ODPV3.SA', 'LOGG3.SA', 'TRIS3.SA', 'BBRK3.SA', 'KEPL3.SA', 'IFCM3.SA', 'TCSA3.SA', 'BOAS3.SA']

OBS: Para quem está acompanhando nossa série sobre Banco de Dados, um passo extra seria salvar esses ativos em um portfólio "Top 200 Liquidez", uma vez que eles podem ser utilizados para diversos backtests. O artigo Determinando as BDRs Mais Líquidas do Ibovespa Utilizando Python ensina o passo a passo de como fazer isso.

Baixando os dados necessários

Baixaremos os preços de fechamento dos últimos 4 meses (2021-02-26 a 2021-06-26) da lista de ativos adquirida acima (tickers).

start="2021-02-26"
end="2021-06-26"

df = yf.download(tickers=tickers, start=start, end=end).copy()["Close"]
df

[*********************100%***********************] 200 of 200 completed

AALR3.SAABCB4.SAABEV3.SAAERI3.SAAESB3.SAAGRO3.SAALPA4.SAALSO3.SAALUP11.SAAMAR3.SAAMBP3.SAANIM3.SAARZZ3.SAASAI3.SAAURA33.SAAZUL4.SAB3SA3.SABBAS3.SABBDC3.SABBDC4.SABBRK3.SABBSE3.SABEEF3.SABIDI11.SABIDI3.SABIDI4.SABKBR3.SABLAU3.SABMOB3.SABOAS3.SABPAC11.SABPAN4.SABRAP4.SABRDT3.SABRFS3.SABRKM5.SABRML3.SABRPR3.SABRSR6.SABTOW3.SACAML3.SACASH3.SACCRO3.SACEAB3.SACESP6.SACIEL3.SACMIG4.SACMIN3.SACOGN3.SACPFE3.SA...PSSA3.SAPTBL3.SAQUAL3.SARADL3.SARAIL3.SARANI3.SARAPT4.SARDOR3.SARECV3.SARENT3.SAROMI3.SARRRP3.SASANB11.SASAPR11.SASAPR4.SASBFG3.SASBSP3.SASEER3.SASEQL3.SASIMH3.SASLCE3.SASMTO3.SASOJA3.SASOMA3.SASQIA3.SASTBP3.SASULA11.SASUZB3.SATAEE11.SATASA4.SATCSA3.SATEND3.SATIMS3.SATOTS3.SATPIS3.SATRIS3.SATRPL4.SATUPY3.SAUGPA3.SAUNIP6.SAUSIM5.SAVALE3.SAVAMO3.SAVIVA3.SAVIVR3.SAVIVT3.SAVVAR3.SAWEGE3.SAWIZS3.SAYDUQ3.SA
Date
2021-02-269.0115.36000014.02000010.19NaN22.01000034.93000023.43000023.5900005.0723.0900009.2871.320000NaN53.50000040.59999818.10000028.04999918.71818220.9090901.8725.4300009.7052.63000117.73333417.0066668.83NaN25.80999910.52102.33999613.89000062.86000119.92000021.63999931.2600008.358.1412.6482.00000010.4328.20000111.2511.0227.2800013.6010.7267558.933.7428.860001...43.5900008.69000031.59000023.23000018.1000005.9613.0469.099998NaN58.00000026.79999935.97000137.61999919.7400003.9622.36000136.79999912.29000030.12999937.54999940.98000031.219999NaN13.41000022.0000005.7931.16580873.16999830.76000018.9900007.6625.54999912.8031.3799991.709.3623.90000021.25000019.32000056.79000116.24000094.51999734.50000023.7500001.0144.00000011.8739.0250026.2630.120001
2021-03-019.0315.55000013.7700009.83NaN22.58000035.34999822.79999923.4900005.0822.9500018.9571.19999771.40000253.65000240.04999918.11666727.86000118.10909120.2181821.8324.7999999.6555.86333518.82000018.6266659.00NaN26.00000010.38102.70999914.55000064.58000219.69000121.70000131.7800018.177.9311.9880.73000310.3728.59000010.9210.8326.4900003.3810.3410948.953.6128.049999...43.0999988.89000031.79999922.78000118.0800006.1012.6570.220001NaN59.16000028.35000038.91000037.25999819.5300013.9122.36000135.43000011.52000030.37999936.98000042.75999830.650000NaN13.29000021.4900005.9031.06207874.48999830.41000019.0700007.1925.90000012.7231.4800001.709.1823.52000020.94000118.75000054.04000116.85000098.57000033.34999823.8500000.9743.31000112.1139.0000006.4928.730000
2021-03-029.0215.76000013.9900009.63NaN22.86000135.45999922.90000023.1700005.1022.7999998.5471.83000272.50000057.50000038.79000118.67000028.93000018.40909020.7454551.7524.7900019.6154.85333318.29999918.1399998.89NaN25.2800019.79102.30000314.53000066.19000219.38999921.59000030.5100008.238.1712.1078.58999610.6327.82000010.8810.5626.8600013.3610.6460358.803.6328.680000...43.6899998.95000032.29000122.87999918.2999996.1012.9069.230003NaN58.59999831.12000141.59000038.38999919.7500003.9822.26000036.29000111.37000029.65000037.45000143.79999930.209999NaN13.56000021.6500005.8331.13752073.52999930.48000019.0700007.2425.69000112.7431.0200001.699.3123.71999921.70000118.69000155.20000117.230000101.59999834.18999923.7600000.9443.48000012.0238.5299996.2627.889999
2021-03-038.8215.66000014.1700009.93NaN22.93000035.52999922.93000023.1100015.1622.7000018.3470.90000271.30000357.70000138.56000118.86333328.99000018.78181820.9272731.7724.6200019.6154.05666718.68666618.4433338.93NaN26.1500009.85100.93000013.87000064.82000019.00000021.70999929.5100008.158.0912.1876.15000211.2328.29999911.0310.6426.7999993.4010.5563478.493.6729.040001...43.5800029.15000032.88999923.20999918.4900006.1113.1468.050003NaN58.82000028.49000040.59999837.83000219.9599994.0521.96999936.98000011.59000029.54999936.41000044.41999830.290001NaN13.27000020.9200005.6630.72260373.50000030.50000019.6800007.1925.50000012.8630.9300001.649.2423.84000022.51000018.21999953.15000217.320000100.34999833.75000022.4000000.9444.18999911.9238.5000006.2327.680000
2021-03-048.9215.66000014.7800009.52NaN22.85000036.09999823.85000023.7099995.1423.1500008.5273.00000073.19999758.29999938.50000018.49666630.04000119.40909021.7363621.7324.5000009.9152.66666417.87999917.6700008.97NaN25.2099999.7998.25000013.51000062.81000120.29000122.73000030.1299998.388.3412.6774.68000011.2227.04000111.6310.5227.2400003.4610.8971638.453.7029.500000...43.4800008.91000033.75000023.60000019.8500006.1413.0167.919998NaN60.91999827.99000041.50999838.63000120.4500014.1322.30999938.29000111.73000029.51000036.09000042.86000131.160000NaN13.00000020.8600015.6530.49628673.59999832.36999920.5700007.6525.12999913.0530.6100011.709.2924.54999923.09000019.35000052.54000116.80999998.86000134.00000021.9500010.9344.00999812.1136.6150027.2227.680000
..................................................................................................................................................................................................................................................................................................................
2021-06-2111.3317.73000018.73000010.4814.4530.79000149.61999931.86000127.1299999.8038.50000013.1595.93000086.45999968.50000048.29000117.07000034.58000223.37999927.6700002.1125.4699999.7269.01999722.70000123.26000012.1445.63000121.04999911.31122.98000323.92000068.15000227.58000028.83000055.11000111.309.5214.1770.4899989.8045.22000113.9815.3124.6500003.8813.0700009.444.8028.790001...55.00000016.62000128.33000025.75000020.0599999.3114.0166.90000219.29000163.22000125.79999948.86000143.88999920.9599994.2438.84000038.18000019.05999926.79999956.45000148.91000037.79000115.1116.78000122.3500009.3036.02999958.50000039.47000122.6399998.5925.75000012.6736.7599983.2010.3726.75000023.68000019.71999994.48999818.160000110.11000153.54999933.9700014.7845.13999915.7535.25000013.1934.980000
2021-06-2211.1917.50000018.29000110.3514.3230.82000050.00000031.45000126.79000110.0139.65000213.3295.00000086.40000268.59999847.43000016.99000033.84999823.10000027.1600002.4025.5400019.7070.25000023.15000023.88999912.3746.50000021.54999911.40120.93000024.48000069.20999927.75000028.79999954.88999911.029.6714.0169.8300029.7844.34999813.5714.7724.5200003.7612.8100009.394.6928.549999...54.72000116.62000128.54000126.00000019.8600019.7213.8069.75000018.95000163.00000025.19000148.09999843.750000NaN4.2338.50000037.93999918.90000026.70999955.00000049.23000037.50000014.9716.54999922.1100019.2535.95000158.700001NaN23.0200008.5325.61000112.0537.6500023.1410.0626.20999923.63999919.53000193.91999818.230000111.40000253.75000034.0499995.8943.90000215.9334.29000113.8634.570000
2021-06-2311.6317.29000117.99000010.3114.3230.65000049.32000030.79000126.9200009.2540.18000013.8093.70999986.00000069.25000047.50000017.02000033.84999823.05999927.0400014.0024.7000019.6171.66999823.73000024.21999912.1747.45999922.32000011.58121.20999925.58000069.73000327.12000128.57000056.43999910.899.4113.8968.2900019.8045.99000213.6014.5924.4200003.7312.7000009.374.7428.030001...54.34000015.85000028.50000025.35000019.7099999.5713.6568.80000318.94000164.00000025.24000047.70999943.189999NaN4.2237.68999937.59000019.18000027.20000155.29999948.79999937.25000014.6216.29000122.5700009.3035.52000058.110001NaN22.9599998.9425.15000011.9437.8800013.5410.0726.11000123.65000019.15000094.25000018.620001113.07000054.79000133.6199999.8143.47000115.8033.95000115.6835.400002
2021-06-2411.7417.28000117.95000110.1114.3230.33000049.91999830.79999926.7999999.2039.20999913.8294.30000387.30999867.90000247.00000016.99000033.91999823.05999927.2400002.5924.4000009.8469.19999722.66000023.45999912.2549.18999922.20000111.75120.40000224.45000170.07000027.62999928.65000056.90000210.999.4413.8470.3700039.8448.38999913.7214.7224.4300003.7412.7500009.384.7528.250000...53.79999915.76000028.54999925.60000019.9300009.2413.7368.19000219.86000164.50000025.20000146.61000143.099998NaN4.2836.95999937.88999918.91000026.50000054.99000248.75000036.99000214.8916.74000022.8099999.3335.99000259.849998NaN22.9900009.0526.05999911.9537.5400013.3810.3126.11000123.76000019.34000095.57000019.100000111.02999955.77999933.5400014.8043.70000115.7734.33000216.0035.500000
2021-06-2511.3016.99000016.9500019.8614.1129.59000049.49000229.80999926.2999999.4239.63000113.6292.79000184.88999967.69999745.97000116.69000132.90000222.46999926.3899992.5923.9200009.7170.00000022.75000023.45000112.1648.49000221.71999911.91118.26999723.37000173.07000027.58000028.48000055.41999810.609.2013.5668.0999989.6951.29999913.3414.6624.2300003.6712.5300009.364.5927.530001...52.00999815.58000028.44000124.71999919.5400019.1013.7068.66999819.59000063.59999824.99000046.25000042.099998NaN4.2636.20999937.79000118.21999926.29999954.47000147.73000035.90000214.8716.11000122.7600009.1534.59999858.410000NaN22.4400018.8726.03000111.7736.8600013.3610.0825.88999923.45000118.99000092.58000218.840000112.40000255.31000132.4900025.4542.93000015.7233.56000116.3534.009998

85 rows × 200 columns


Como utilizaremos os preços mais recentes para avaliar a direção das médias móveis, temos que verificar se há algum valor NaN nas últimas linhas do nosso dataframe.

Para conseguirmos verificar todas as colunas do dataframe, usaremos a função de exibiçãooptions.display.max_columns.

pd.options.display.max_columns = 200
df.iloc[-2:]
AALR3.SAABCB4.SAABEV3.SAAERI3.SAAESB3.SAAGRO3.SAALPA4.SAALSO3.SAALUP11.SAAMAR3.SAAMBP3.SAANIM3.SAARZZ3.SAASAI3.SAAURA33.SAAZUL4.SAB3SA3.SABBAS3.SABBDC3.SABBDC4.SABBRK3.SABBSE3.SABEEF3.SABIDI11.SABIDI3.SABIDI4.SABKBR3.SABLAU3.SABMOB3.SABOAS3.SABPAC11.SABPAN4.SABRAP4.SABRDT3.SABRFS3.SABRKM5.SABRML3.SABRPR3.SABRSR6.SABTOW3.SACAML3.SACASH3.SACCRO3.SACEAB3.SACESP6.SACIEL3.SACMIG4.SACMIN3.SACOGN3.SACPFE3.SACPLE11.SACPLE3.SACPLE6.SACRFB3.SACSAN3.SACSMG3.SACSNA3.SACVCB3.SACXSE3.SACYRE3.SADASA3.SADEXP3.SADIRR3.SADMMO3.SADTEX3.SAECOR3.SAEGIE3.SAELET3.SAELET6.SAEMBR3.SAENAT3.SAENBR3.SAENEV3.SAENGI11.SAENJU3.SAEQTL3.SAESPA3.SAETER3.SAEVEN3.SAEZTC3.SAFESA4.SAFHER3.SAFLRY3.SAGFSA3.SAGGBR4.SAGGPS3.SAGMAT3.SAGNDI3.SAGOAU4.SAGOLL4.SAGRND3.SAGUAR3.SAHAPV3.SAHBOR3.SAHBSA3.SAHGTX3.SAHYPE3.SAIFCM3.SAIGTA3.SAINTB3.SAIRBR3.SAITSA4.SAITUB3.SAITUB4.SAJBSS3.SAJHSF3.SAJPSA3.SAKEPL3.SAKLBN11.SALAME3.SALAME4.SALAVV3.SALCAM3.SALEVE3.SALIGT3.SALINX3.SALJQQ3.SALOGG3.SALOGN3.SALREN3.SALUPA3.SALWSA3.SAMDIA3.SAMEAL3.SAMGLU3.SAMILS3.SAMODL11.SAMOSI3.SAMOVI3.SAMRFG3.SAMRVE3.SAMTRE3.SAMULT3.SAMYPK3.SANEOE3.SANGRD3.SANTCO3.SAODPV3.SAOIBR3.SAOMGE3.SAPCAR3.SAPETR3.SAPETR4.SAPETZ3.SAPGMN3.SAPMAM3.SAPNVL3.SAPOMO4.SAPOSI3.SAPRIO3.SAPSSA3.SAPTBL3.SAQUAL3.SARADL3.SARAIL3.SARANI3.SARAPT4.SARDOR3.SARECV3.SARENT3.SAROMI3.SARRRP3.SASANB11.SASAPR11.SASAPR4.SASBFG3.SASBSP3.SASEER3.SASEQL3.SASIMH3.SASLCE3.SASMTO3.SASOJA3.SASOMA3.SASQIA3.SASTBP3.SASULA11.SASUZB3.SATAEE11.SATASA4.SATCSA3.SATEND3.SATIMS3.SATOTS3.SATPIS3.SATRIS3.SATRPL4.SATUPY3.SAUGPA3.SAUNIP6.SAUSIM5.SAVALE3.SAVAMO3.SAVIVA3.SAVIVR3.SAVIVT3.SAVVAR3.SAWEGE3.SAWIZS3.SAYDUQ3.SA
Date
2021-06-2411.7417.28000117.95000110.1114.3230.3349.91999830.79999926.7999999.2039.20999913.8294.30000387.30999867.90000247.00000016.99000033.91999823.05999927.2400002.5924.409.8469.19999722.6623.45999912.2549.18999922.20000111.75120.40000224.45000170.0727.62999928.6556.90000210.999.4413.8470.3700039.8448.38999913.7214.7224.433.7412.759.384.7528.25000030.4699995.826.1721.62999925.19000116.21999944.59999828.20603213.0223.53000162.06000143.40000215.020.9722.7412.3040.70000145.88999946.23000019.61000114.9018.57000017.4947.70000110.6125.43000019.12000124.29999910.8032.4843.43999919.85000026.6200014.9130.7717.1100018.0687.37999714.2024.7800019.9521.12999915.789.426.2235.20000136.56000120.11000143.48000029.5400016.0211.7628.1631.80999929.1600007.8435.54000157.00999826.37000121.61000122.3799998.8027.88999933.27000016.11000137.50000023.95000133.84999818.82000045.6699986.9427.08000032.684.3621.6500008.4816.2519.60000019.50000018.95999916.98000012.0425.18000015.9717.7000016.0657.27000013.051.5738.13999939.79999929.88999929.6524.45000111.7116.05999921.253.4613.1219.45000153.79999915.7628.54999925.60000019.9300009.2413.7368.19000219.86000164.50000025.20000146.61000143.099998NaN4.2836.95999937.88999918.91000026.50000054.99000248.7536.99000214.8916.74000022.8099999.3335.99000259.849998NaN22.9900009.0526.05999911.9537.5400013.3810.3126.11000123.76000019.3495.57000019.10111.02999955.77999933.5400014.8043.70000115.7734.33000216.0035.500000
2021-06-2511.3016.99000016.9500019.8614.1129.5949.49000229.80999926.2999999.4239.63000113.6292.79000184.88999967.69999745.97000116.69000132.90000222.46999926.3899992.5923.929.7170.00000022.7523.45000112.1648.49000221.71999911.91118.26999723.37000173.0727.58000028.4855.41999810.609.2013.5668.0999989.6951.29999913.3414.6624.233.6712.539.364.5927.53000130.0100005.676.1121.38999924.73000016.04999943.54999927.65000012.9422.87000160.98000042.91999814.710.9423.0011.8840.13000144.32000044.54999919.10000016.4818.21999917.0946.70000110.5625.44000118.79999923.37999910.5531.5742.84999817.94000126.0599994.6530.8416.7999997.8185.05999814.2724.0000009.9320.70999915.348.956.0533.91999835.29999920.35000042.02999928.9100005.9911.4827.4130.79999928.5400017.5934.66000057.13999925.86000120.91000021.9400018.5727.55999932.66999815.75000037.40000223.45000132.61000118.45000145.0999986.8026.30999932.274.3021.3899998.4517.2419.20000119.20999919.09000016.80999911.8024.04000115.9017.7700006.0156.31000112.971.5338.41999838.79999929.41000029.1024.87000111.5015.92000021.353.3912.5619.08000052.00999815.5828.44000124.71999919.5400019.1013.7068.66999819.59000063.59999824.99000046.25000042.099998NaN4.2636.20999937.79000118.21999926.29999954.47000147.7335.90000214.8716.11000122.7600009.1534.59999858.410000NaN22.4400018.8726.03000111.7736.8600013.3610.0825.88999923.45000118.9992.58000218.84112.40000255.31000132.4900025.4542.93000015.7233.56000116.3534.009998


Como podemos observar, os ativos SAPR11 e TAEE11 não possuem os preços de fechamento mais recentes. Para evitar quaisquer erros na hora de calcular as médias móveis, vamos excluir esses papeis do dataframe através da função drop.

df.drop(df["SAPR11.SA"], axis="columns", inplace=True)
df.drop(df["TAEE11.SA"], axis="columns", inplace=True)

Com o dataframe pronto, o próximo passo é calcular as médias móveis exponenciais de curto e longo prazo para então classificarmos os ativos entre Éden dos Traders de compra e venda.

Calculando as médias móveis e determinando o Éden dos Traders

Nesse próximo passo faremos um for loop para iterar sobre cada ativo do dataframe. Nessa iteração, realizaremos as seguintes tarefas:

  • Calcularemos as médias móveis exponenciais a partir de duas funções combinadas, ewm e mean, que serão armazenas nas variáveis mme8 e mme80;
  • Classificaremos os ativos de acordo com o Éden dos Traders para compra e venda, a partir da simples lógica:
    • O ativo estará no Éden dos Traders de compra (long = 1), se ambas médias móveis atuais (mme8[-1] e mme80[-1]) forem maiores que as respectivas médias móveis anteriores (mme8[-2] e mme80[-2]);
    • Se forem menores, o ativo se encontra no Éden dos Traders de venda (short = 1);
    • Se nenhuma das alternativas anteriores for verdade, o ativo não se encontra no Éden dos Traders (long = 0 e short = 0).
  • Armazenaremos as informações acima em um dicionário: traders_eden.
traders_eden = {}

for ticker in tickers:

    mme8 = df[ticker].ewm(span=8).mean()
    mme80 = df[ticker].ewm(span=80).mean()

    if (mme8[-1] > mme8[-2]) & (mme80[-1] > mme80[-2]):
        traders_eden[ticker] = {"long": 1, "short": 0}

    elif (mme8[-1] < mme8[-2]) & (mme80[-1] < mme80[-2]):
        traders_eden[ticker] = {"long": 0, "short": 1}
        
    else:
        traders_eden[ticker] = {"long": 0, "short": 0}

Para uma melhor visualização dos dados, transformaremos nosso dicionário em um dataframe através da função from_dict, onde estabeleceremos que as chaves (no nosso caso, os ativos) representarão as linhas do dataframe (orient='index').

traders_eden = pd.DataFrame.from_dict(traders_eden, orient='index')
traders_eden
longshort
VALE3.SA10
PETR4.SA10
ITUB4.SA00
BBDC4.SA00
B3SA3.SA01
.........
BBRK3.SA10
KEPL3.SA10
IFCM3.SA10
TCSA3.SA10
BOAS3.SA10

200 rows × 2 columns

Pronto! Temos um dataframe classificando os 200 ativos mais líquidos da bolsa entre Éden dos Traders de compra e venda. Podemos utilizá-lo para filtrar os ativos que estão mais propensos a traders de compra/venda, nos auxiliando na hora de efetuar uma operação.

Filtrando os ativos pelo Éden dos Traders de compra ou venda

Para consultar nosso dataframe é fácil: basta utilizar um filtro (filter), onde a coluna desejada (long ou short) deverá ser igual a 1.

filter = traders_eden["long"] == 1
traders_eden[filter]
longshort
VALE3.SA10
PETR4.SA10
PETR3.SA10
VVAR3.SA10
MGLU3.SA10
BIDI11.SA10
BRDT3.SA10
MRFG3.SA10
BRAP4.SA10
CVCB3.SA10
EQTL3.SA10
BIDI4.SA10
CASH3.SA10
ALPA4.SA10
PETZ3.SA10
RRRP3.SA10
AMAR3.SA10
VIVR3.SA10
CXSE3.SA10
WIZS3.SA10
DTEX3.SA10
PTBL3.SA10
MOVI3.SA10
MDIA3.SA10
JHSF3.SA10
VAMO3.SA10
ANIM3.SA10
ENAT3.SA10
BKBR3.SA10
TEND3.SA10
BMOB3.SA10
DIRR3.SA10
FESA4.SA10
AMBP3.SA10
BIDI3.SA10
POMO4.SA10
PNVL3.SA10
MODL11.SA10
TPIS3.SA10
GRND3.SA10
RECV3.SA10
MILS3.SA10
SAPR4.SA10
BLAU3.SA10
SQIA3.SA10
DMMO3.SA10
LOGG3.SA10
BBRK3.SA10
KEPL3.SA10
IFCM3.SA10
TCSA3.SA10
BOAS3.SA10
short = traders_eden["short"] == 1
traders_eden[short]
longshort
B3SA3.SA01
ABEV3.SA01
SUZB3.SA01
JBSS3.SA01
WEGE3.SA01
.........
MTRE3.SA01
CAML3.SA01
LOGN3.SA01
CPLE3.SA01
TRIS3.SA01

64 rows × 2 columns

Conclusão

No artigo de hoje aprendemos não só a fazer o web scraping dos 200 ativos mais líquidos da bolsa, mas também a calcular se esse ativo está no Éden dos Traders.

Esse tipo de filtro é mais uma das diversas ferramentas que podemos utilizar para avaliar a tendência de um ativo. Além disso, você pode utilizar a lista dos ativos mais líquidos para estudar diferentes backtests de estratégias. Não se esqueça de rodar o código de tempos em tempos para atualizar a lista dos ativos de acordo com a liquidez.

Para facilitar a vida dos nossos leitores, estamos inaugurando o Éden dos Traders como nossa mais nova ferrameta, onde os dados são obtidos da plataforma MetaTrader e as informações são atualizadas periodicamente.

Se o conteúdo da QuantBrasil é revelante para você, não deixa de se inscrever na nossa newsletter e participar do nosso grupo no Telegram. Nele tiramos dúvidas dos nosso leitores, além de atender a pedidos de análises quantitativas sobre o mercado financeiro.