Python para ajudar a testar produtos estruturais

Inspirado pela publicidade de produtos estruturais em Habré , adaptou o script python para seus testes independentes. A idéia principal é que esses produtos ofereçam 100% de proteção de capital. E, com 10 anos de mercado em alta, o desempenho histórico desses produtos é estupefato com um paraíso sem riscos.

Este artigo será interessante para programadores iniciantes de python interessados ​​em gerenciar seu dinheiro. Bem, para alguns, essa ferramenta pode ser útil para criar essas estratégias por conta própria. Mas tenha cuidado, os corretores escrevem que isso não é para todos.

O código é publicado no GitHub como um bloco de notas Jupyter. Vamos lá!

Algumas palavras para introduzir


Vou testar em ações americanas e aí o rendimento será menor do que em rublos. O mercado russo em termos absolutos nas paradas é mais interessante, mas há mais riscos nele. A essência dos testes não muda disso.

Tomamos os dados do Alpha Advantages gratuito, onde você primeiro precisa obter a chave compartilhando o endereço de email. Breve instrução em um caderno. Você pode cotar títulos russos na Finam.

Carisma estrutural do produto


Resumidamente, seu capital é seguro e o rendimento é maior que o depósito bancário (títulos do governo). Aqui estão apenas alguns elementos da equação ausentes:

  • Sempre há renda em um depósito bancário, mas existe o risco de jogar zero;
  • Você obterá lucro, mas o corretor reivindica uma parte significativa da torta;
  • Há uma restrição no uso de dinheiro investido;
  • O corretor praticamente não assume riscos e participa apenas dos lucros.

Estratégia


Considere a estratégia mais simples:

  • Compramos 90% dos títulos do capital de curto prazo;
  • Para o restante, compramos um ativo de alto risco;
  • Paramos 10% do preço no início do período.

No centro da estratégia: os títulos do tesouro fornecem 1-3% ao ano, praticamente excluindo o rebaixamento (se houver um rendimento). 10% do levantamento de um ativo comprado com 10% do capital será o próprio risco que os títulos cobrirão. Durante os períodos de alta do mercado, algumas ações podem crescer várias vezes, o que nos dará felicidade.

Para repetir manualmente essa estratégia, você deve executar as seguintes etapas:

  • Compre títulos. Por exemplo, na forma de ETF.
  • Compre ações.
  • Coloque uma ordem de parada.

Como testar


Descreverei brevemente algumas soluções com trechos de código que tornaram o teste bastante flexível e conveniente.

Horário


Você pode reequilibrar nos seguintes períodos: semana, mês, ano. E também em qualquer dia do período: o primeiro, o enésimo, o último. A classe `Schedule ()` é responsável por isso:

#         df = pd.DataFrame([], index=pd.date_range(start, end, freq='B')) # ... #      ,   df = df[df.index.isin(dates)].copy() # ... #    # ... elif freq == 'week': groupby = ['year', 'week'] elif freq == 'month': groupby = ['year', 'month'] elif freq == 'year': groupby = ['year'] #      grouped = df.groupby(groupby) for idx, grp in grouped: if len(grp) >= abs(day): df.loc[grp.iloc[day].name, 'allow'] = True 

Ciclo de dados


 StructuredProductMill().run() 

Conforme descrito em um dos artigos , podemos ignorar apenas as datas de reequilíbrio em um ciclo e pular todos os outros dias. Mas então perdemos as estatísticas de alterações nos ativos no período, não veremos lucratividade e rebaixamentos a cada dia. Esse script, em detrimento da velocidade, circula todos os dias, o que permite ver o valor de mercado das posições em aberto e aplicar uma verificação de ordem de parada.

Rebalanceamento


 StructuredProductMill().rebalance() 

Aqui, os ativos que podem ser abertos são alocados ao capital disponível. Após comparar o cálculo com as posições em aberto, as transações são executadas para o número necessário:

 #  :       balance = self._cash + self.position_balance(day) #         df = day.merge(self._positions[['quantity']], how='left', left_index=True, right_index=True) # ... #              day.loc[is_allow, 'size_order'] = day[is_allow]['size'] / day[is_allow]['size'].sum() #        day['position_to'] = (balance * day['size_order']) // day['open'] #     day['order'] = day['position_to'] - day['position'] # ... #   for symbol, row in day[fltr].iterrows(): self.trade(row['dt'], symbol, row.order, row.open, 'O' if row.order > 0 else 'C') 

Ofertas


 StructuredProductMill().trade() 

E aqui, por velocidade, você pode sacrificar detalhes e controlar apenas a mudança na lucratividade de cada posição. Mas o script leva em consideração as comissões e o valor dos ativos, além de manter um histórico de transações, o que permite calcular transações e executar uma ordem de parada em qualquer dia do teste. Este método atualiza a posição e o tamanho do cache livre.

Lançamento


Para executar, você deve especificar um conjunto de ativos com compartilhamentos e parâmetros de teste. Testaremos os produtos estruturais para o ano civil:

 #   portfolio = {'MINT': 0.9, 'AAPL': 0.1,} #   SYMBOLS = list(portfolio.keys()) df = prices(SYMBOLS) params = { 'benchmark': 'SPY', #     'balance': 100_000, #   'portfolio': portfolio, 'rebalance_day': -1, #      'freq': 'year', #    'stop_loss': 0.1, # -  10% #          'reset_position_prices': True, 'allow_method': allow_default, 'start': pd.to_datetime('2011-01-01'), #   } #  ,      pm = StructuredProductMill(params, prices=prices(SYMBOLS + [params['benchmark']]), show_progress=True) pm.check_params().prepare() #   pm.run() #   pm.print_results(); #   pm.charts() 

Na parte inferior do caderno, existem gráficos com rentabilidade e rebaixamentos nas datas de reequilíbrio (no final do ano), que confirmam os rebaixamentos extremamente baixos de capital na época do relatório e o constante crescimento do rendimento. Embora essa lucratividade perca para o amplo índice de empresas americanas S&P 500.

Resultados


Os testes envolveram instrumentos americanos negociados livremente desde 2011:

  • BIL - ETF para títulos do tesouro de curto prazo com um rendimento de 2% ao ano no momento da redação deste documento. Lembre-se que no período de 2009 a 2017, as taxas foram próximas de zero. Uma alternativa é usar o MINT (um fundo para instrumentos de renda fixa de curto prazo).
  • AAPL - estoque da Apple.
  • MSFT - estoque da Microsoft.
  • TSLA - ações da Tesla.

Aapl


Esse projeto gerou uma receita de 24% em 8 anos (média anual de 2,6%), com um rebaixamento entre reequilíbrios de -6%. Mas, na virada dos anos, o rebaixamento é de cerca de zero. A parada não foi tocada, o mercado com 180% da receita perdeu ordem.

Rentabilidade e rebaixamento para todos os dias

Rentabilidade e rebaixamento para cada dia (rentabilidade à esquerda, rebaixamento à direita).

Rentabilidade e rebaixamento na virada dos anos

Rentabilidade e rebaixamento na junção de anos (rentabilidade à esquerda, rebaixamento à direita).

Msft


Esse projeto gerou uma receita de 26% em 8 anos (média anual de 2,75%), com uma redução entre os reequilíbrios de -2%. No cruzamento dos anos, não há rebaixamento.

Rentabilidade e rebaixamento para todos os dias

Rentabilidade e rebaixamento na virada dos anos

TSLA


Esse projeto gerou uma receita de 45% em 8 anos (média anual de 4,6%) com um rebaixamento entre reequilíbrios de até -15%. Mas tudo isso em 2013, quando Tesla cresceu quase 5 vezes. Na virada do ano, o saque é de até -2%. O passageiro mais agitado, mas também rentável.

Rentabilidade e rebaixamento para todos os dias

Rentabilidade e rebaixamento na virada dos anos

Conclusão


O bloco de notas permite testar qualquer composição de portfólio. Estes podem ser fundos humeral ou várias empresas. Embora geralmente sem um ativo protetor.

Repositório do GitHub .

Source: https://habr.com/ru/post/pt461583/


All Articles