Friday, February 24, 2023

Backtest online com Python

Olá a todos!
Vi um negócio interessante no youtube, e consegui copiar alguns trechos de código através do video e adpatei pra minha necessidade, e não é que o negócio funciona mesmo, baixou cotações dos ativos, até do CDI do site do BC, acho que vou estudar um pouco disso futuramente. 

Confiram o código que adaptei:

!pip install bt

!pip -q install yfinance

import yfinance as yf
import pandas as pd
import numpy as np
import plotly.express as px
from datetime import date
import bt
import matplotlib
matplotlib.style.use('seaborn-darkgrid')
%matplotlib inline

#baixar dados cdi 
def consulta_bc(codigo_bcb):
  url = 'http://api.bcb.gov.br/dados/serie/bcda.sgs.{}/dados?formato=json'.format(codigo_bcb)
  df = pd.read_json(url)
  df['data'] = pd.to_datetime(df['data'], dayfirst=True)
  df.set_index('data', inplace= True)
  return df

def cdi_acumulado (data_iniciodata_fim):
  cdi = consulta_bc(12)
  cdi_acumulado = (
      1+cdi[data_inicio : data_fim]/100
    ).cumprod()
  cdi_acumulado.iloc[0] = 1
  return cdi_acumulado

data_inicio = '2021-01-20'
data_fim = '2023-01-20'

cdi = cdi_acumulado(data_inicio = data_inicio, data_fim = data_fim)

cdi

tickers_carteira_acoes = ['PIBB11.SA''IVVB11.SA']

carteira_acoes = yf.download(tickers_carteira_acoes, start = data_inicio, end=data_fim)['Adj Close']

carteira_acoes

carteira_acoes['renda_fixa'] = cdi

carteira_acoes

rebalanceamento_acoes = bt.Strategy(
    'rebalanceamento_acoes',
    [bt.algos.RunMonthly(run_on_end_of_period=True),
     bt.algos.SelectAll(),
     bt.algos.WeighEqually(),
     bt.algos.Rebalance()]
)

buy_and_hold = bt.Strategy(
    'Buy&Hold',
    [bt.algos.RunOnce(),
     bt.algos.SelectAll(),
     bt.algos.WeighEqually(),
     bt.algos.Rebalance()
     ]
)

bt_acoes_1 = bt.Backtest(rebalanceamento_acoes, carteira_acoes)
bt_acoes_2 = bt.Backtest(buy_and_hold, carteira_acoes)

resultados_acoes = bt.run( bt_acoes_1, bt_acoes_2)

resultados_acoes.display()

resultados_acoes.display_monthly_returns()

resultados_acoes.plot()



Resultados

Então, interessante né?! Compartilhei esse código no link https://colab.research.google.com/drive/1NaR28o0J_4dvQ_y3siZ3b7VD9OIPS5Ad?usp=sharing