exerc cio de programa˘c~ao 2: deten˘c~ao de tend^encias em ... · exerc cio de programa˘c~ao 2:...

20
Exerc´ ıcio de programa¸ ao 2: Deten¸ ao de tendˆ encias em s´ eries temporais utilizando redes complexas 1 Objetivo: Implementar uma adapta¸c˜ao do m´ etodo de detec¸c˜ ao de tendˆ encias em s´ eries temporais proposto por Anghinoni [1, 2]. Neste documento apresento um detalhamento do m´ etodo empregado no artigo, com algumas adapta¸c˜ oes e ajustes de nota¸c˜ao. As principais adapta¸c˜oes aqui empregadas em rela¸c˜ ao aos tra- balhos originais foram: Nos trabalhos originais, os autores n˜ ao discutem a separa¸c˜ ao entre conjunto de treinamento e de teste. Aqui deixo esta separa¸c˜ ao mais expl´ ıcita; Os autores fazem uso de m´ etodos de aprendizado supervisionado externos para identificar arela¸c˜ ao entre as caracter´ ısticas extra´ ıdas da s´ erie temporal e os r´ otulos das tendˆ encias. Apresento uma abordagem capaz de utilizar a informa¸c˜ ao contida na rede complexa para a classifica¸c˜ ao de novas instˆancias; Apresento tamb´ em uma vers˜ao simplificada de um procedimento de backtest que simula e avalia a aplica¸c˜ ao do modelo sobre o conjunto de teste. 2 Descri¸ ao do m´ etodo O m´ etodo adaptado ´ e dividido em cinco etapas: 1. Obten¸c˜ao e tratamento da s´ erie temporal; 2.Extra¸c˜aodecaracter´ ısticas a partir da s´ erie temporal; 3.Gera¸c˜aodarede; 4.Detec¸c˜aodascomunidades; 5. Rotulagem de cada comunidade e de cada dia da s´ erie temporal; 6. Previs˜ao das tendˆ encias; 7.Avalia¸c˜ ao de desempenho do m´ etodo atrav´ es de um backtest. 1

Upload: others

Post on 12-Feb-2020

2 views

Category:

Documents


0 download

TRANSCRIPT

Exercıcio de programacao 2:

Detencao de tendencias em series temporais utilizando

redes complexas

1 Objetivo:

Implementar uma adaptacao do metodo de deteccao de tendencias em series temporais propostopor Anghinoni [1, 2].

Neste documento apresento um detalhamento do metodo empregado no artigo, com algumasadaptacoes e ajustes de notacao. As principais adaptacoes aqui empregadas em relacao aos tra-balhos originais foram:

• Nos trabalhos originais, os autores nao discutem a separacao entre conjunto de treinamentoe de teste. Aqui deixo esta separacao mais explıcita;

• Os autores fazem uso de metodos de aprendizado supervisionado externos para identificara relacao entre as caracterısticas extraıdas da serie temporal e os rotulos das tendencias.Apresento uma abordagem capaz de utilizar a informacao contida na rede complexa para aclassificacao de novas instancias;

• Apresento tambem uma versao simplificada de um procedimento de backtest que simula eavalia a aplicacao do modelo sobre o conjunto de teste.

2 Descricao do metodo

O metodo adaptado e dividido em cinco etapas:

1. Obtencao e tratamento da serie temporal;

2. Extracao de caracterısticas a partir da serie temporal;

3. Geracao da rede;

4. Deteccao das comunidades;

5. Rotulagem de cada comunidade e de cada dia da serie temporal;

6. Previsao das tendencias;

7. Avaliacao de desempenho do metodo atraves de um backtest.

1

Essas etapas sao representadas na figura abaixo (adaptada de [2]):

2.1 Obtencao e tratamento dos dados

Os dados utilizados neste projeto sao precos diarios de fechamento do ındice Bovespa, no perıodo dejan/1995 a set/2019 (planilha disponıvel na pagina da disciplina). A serie temporal e denotada porum vetor p = [p(1), p(2), p(3), . . . , p(D)], onde p(d) denota o preco de fechamento do IBOVESPAno dia d, d ∈ {1, 2, . . . , D}, e D e o tamanho total da serie.

Para diminuir a influencia de ruıdos, os autores consideram uma serie suavizada s em que s(d)corresponde a media movel dos precos nos j ultimos dias:

s(d) =p(d) + p(d− 1) + . . .+ p(d− j + 1)

j, d ∈ {j, j + 1, . . . , D}. (1)

No trabalho [2], os autores consideraram j = 5, que e o valor que considero razoavel para nossa

2

implementacao.

Note que, como nao e possıvel computar as medias moveis para os primeiros j − 1 dias (poisneste caso a Equacao 1 envolveria ındices menores ou iguais a zero), o vetor s sera computado doj-esimo dia em diante. Isto sera discutido na proxima subsecao.

2.2 Extracao das caracterısticas

A extracao das caracterısticas consiste em dois passos: (i) o calculo de seis indicadores sobre aserie temporal suavizada e (ii) a padronizacao e discretizacao desses indicadores.

2.2.1 Calculo dos indicadores

Os seguintes indicadores sao considerados:

• Os indicadores f1(d) e f2(d) correspondem aos ruıdos de curto prazo e longo prazo, respecti-vamente Para cada ponto d da serie temporal, o ruıdo e calculados como o desvio percentualda observacao s(d) em relacao a media movel de s(d):

noiseq(d) =s(d)−MAq(d)

MAq(d)=

s(d)

MAq(d)− 1 (2)

onde MAq(d) e a media movel de s(d) nos ultimos q dias:

MAq(d) =s(d) + s(d− 1) + . . .+ s(d− q + 1)

q. (3)

Neste projeto, utilizaremos qs = 10 para o ruıdo de curto prazo e ql = 5.qs = 50 para o ruıdode longo prazo1. Assim, f1(d) = noise10(d) e f2(d) = noise50(d).

• Os indicadores f3(d) e f4(d) correspondem aos gradientes de curto e longo prazos: paracada ponto d da serie, os gradientes de curto e longo prazo sao calculados como a variacaopercentual da media movel no dia d em relacao a media movel no dia d− 1:

gradientq(d) =MAq(d)−MAq(d− 1)

MAq(d− 1)=

MAq(d)

MAq(d− 1)− 1. (4)

Considerando os valores de q indicados no item acima, teremos f3(d) = gradient10(d) ef4(d) = gradient50(d).

1Embora os autores do artigo tenham considerado qs = 25 para a janela movel de curto prazo e ql = 5.qs = 125para a janela de longo prazo, minha recomendacao para este EP e adotarmos janelas menores, para que o modeloconsiga capturar melhor as mudancas de tendencias. Naturalmente, estes parametros deveriam ser calibradosadequadamente, mas esta calibracao esta fora do escopo deste projeto.

3

• Os indicadores f5(d) e f6(d) correspondem as posicoes relativas maxima-mınima (rhl(d))de curto e longo prazos: para cada ponto da serie, a posicao relativa maxima-mınima ecalculada como a posicao da observacao (s(d)) em relacao a amplitude do preco na janelamovel:

hrlq(d) =s(d)−min(s[(d− q + 1) : d])

max(s[(d− q + 1) : d])−min(s[(d− q + 1) : d]), (5)

onde s[(d− q + 1) : d] denota o subvetor [s(d− q + 1), s(d− q + 2), . . . , s(d)]

De forma analoga aos itens anteriores, teremos f5(d) = hrl10(d) e f6(d) = hrl50(d).

Note que, apos o alisamento da serie inicial de precos (Equacao 1) e apos a extracao das ca-racterısticas f1, f2, f3, f4, f5, f6 (Equacoes 2, 4, 5), os pontos iniciais d = 1, 2, . . . , (j + ql − 1) daserie devem ser descartados, ja que nao e possıvel calcular todos os indicadores para esses pontos(ver figura abaixo). Assim, com os valores de j e q adotados neste projeto, somente a partir ded = j + ql = 55 e que teremos os vetores completos com as seis caracterısticas.

Por conveniencia, passarei a indexar os dias correspondentes a serie temporal apos o descarte dospontos iniciais por t = 1, 2, . . . , T , onde t = d− j− ql + 1. No nosso projeto, t = 1 corresponde aodia d = 55 na serie original, t = 2 corresponde ao dia d = 56, e assim por diante.

2.2.2 Padronizacao e discretizacao

Cada caracterıstica fi (i = 1, 2, 3, 4, 5, 6) e padronizada e discretizada da seguinte maneira:

• Padronizacao: calcula-se o z-score sobre cada valor da caracterıstica:

zi(t) =fi(t)− avg(fi)

sd(fi)(6)

Fzi(t) = Φ(zi(t)), (7)

onde avg(fi) e sd(fi) correspondem a media e desvio padrao de fi calculados sobre toda aserie historica (mas eliminando-se as primeiras 54 linhas, pelo motivo apontado na subsecaoanterior) e Φ denota a funcao de distribuicao acumulada da normal padrao (ou seja, adistribuicao normal com media 0 e desvio-padrao 1). Note que este procedimento faz comque cada Fzi tenha seus valores confinados no intervalo (0, 1). A figura abaixo ilustra zi(t)e Fzi(t).

4

No R, para calcular a Φ(zi(t)), basta chamar a funcao pnorm passando apenas zi(t) comoargumento.

• Discretizada em valores fixos no intervalo (0, 1) da seguinte forma:

a) Fixam-se intervalos de mesmo tamanho α no intervalo (0, 1); (note que α ∈ (0, 1) e 1/αdeve ser inteiro);

b) Cada valor do vetor Fzi e arredondado para o limite superior do respectivo intervalo,o que e facilmente obtido pela equacao

xi(t) =dFzi(t)/αe

1/α(8)

Embora este parametro devesse, em princıpio, ser calibrado, meus experimentos considera-ram α = 0.2, o que resulta nos intervalos (0.0, 0.2], (0.2, 0.4], (0.4, 0.6], (0.6, 0.8] e (0.8, 1.0).Assim, todos os valores de Fzi no intervalo (0.0, 0.2] sao aproximados para 0.2, os valoresde Fzi no intervalo (0.2, 0.4] sao aproximados para 0.4, e assim por diante.

Apos a extracao, normalizacao e discretizacao das caracterısticas, teremos uma matriz de dimensaoT × 6:

X =

x1(1) x2(1) x3(1) x4(1) x5(1) x6(1)x1(2) x2(2) x3(2) x4(2) x5(2) x6(2)

......

......

......

x1(T ) x2(T ) x3(T ) x4(T ) x5(T ) x6(T )

(9)

Denotarei por x(t) o vetor de caracterısticas (ou estado) no instante t. Tambem denotarei porX(t1, t1 + 1, . . . , t2) as linhas t1, t1 + 1, . . . , t2 de X (onde t1 ≤ t2).

A discretizacao permite que estados similares possam ser identificados e agrupados. Por exemplo,se x(543) = x(1289) = x(4231) = [0.6, 0.4, 0.2, 0.8, 1.0, 0.2], isso significa que esses quatro dias

5

possuem valores iguais de ruıdo de curto e longo prazo, gradiente de curto e longo prazo, posicaorelativa maxima-mınima de curto e longo prazo.

Para facilitar a depuracao e conferencia das funcoes para calculo dos indicadores acima, dispo-nibilizei na pagina da disciplina a planilha indicadores ep2.xlsx, contendo a serie original deprecos e todos os indicadores calculados nesta secao.

2.2.3 Separacao dos dados de treinamento e de validacao

Como mencionado anteriormente, os trabalhos de Anghinoni [1, 2] parecem utilizar o mesmoconjunto de dados tanto para a construcao do modelo como tambem para avaliacao de seu desem-penho. Isso usualmente resulta em subestimacao dos erros, impedindo que se avalie efetivamenteo poder de generalizacao do modelo (ou seja, sua capacidade de classificar bem novas instancias).

Em problemas ligados a classificacao e previsao sobre series temporais, e necessario separar osconjuntos de dados em pelo menos duas partes: um subconjunto de dados para construcao etreinamento dos modelos (que corresponde a um perıodo mais antigo na serie) e outro para teste(correspondendo ao perıodo mais recente)2.

Assim, neste trabalho, particionaremos nossos dados (series de precos, indicadores e matriz X)em duas partes: o perıodo t = 1, 2, . . . , Ttr para construcao das redes, deteccao das comunidadese rotulagem das tendencias (onde Ttr denota o ultimo dia do perıodo de treinamento), e o perıodot = Ttr + 1, Ttr + 2, . . . , T para avaliacao. Neste projeto, utilizaremos os dados de 1995 a 2017para treinamento (Ttr = 5638), e os dados de 2018 a 2019 para teste.

Quando conveniente, denotarei por Xtr a matriz X restrita a X(1, . . . , Ttr) e por Xts a matriz Xrestrita a X(Ttr + 1, Ttr + 2, . . . , T ). Analogamente, ptr, str corresponderao aos vetores de precos(originais e suavizados) restritos ao perıodo de treinamento, e pts, sts corresponderao aos vetoresde precos restritos ao perıodo de teste.

2.3 Geracao da rede

Neste passo, construımos uma rede (grafo) a partir de Xtr, que consiste essencialmente em doispassos:

1. Crie um no para cada estado distinto (ou seja, para cada vetor distinto) encontrado em Xtr.

2. Para t = 1 ate Ttr − 1:

2.1 Sejam w(t) e w(t+1) os nos correspondentes aos estados descritos em xtr(t) e xtr(t+1),respectivamente.

2Observacao: Quando ocorre a etapa de calibracao de parametros dos modelos, um terceiro subconjunto paracalibracao e necessario, usualmente localizado entre o perıodo de treinamento e o perıodo de teste; como naoconsideraremos a calibracao dos parametros neste EP, adotaremos apenas a separacao em dois subconjuntos.

6

2.2 Se w(t) 6= w(t+ 1):

• Se houver uma aresta de w(t) a w(t + 1), incremente o peso da aresta em umaunidade; se nao houver, crie uma aresta direcionada de w(t) a w(t + 1) com peso1.

Este procedimento resulta em uma matriz de adjacencia A de dimensao n×n, onde n e o numerode nos da rede formada.

A condicao w(t) 6= w(t+1) no passo 2.2 evita que sejam criados self loops, ou seja, arestas ligandoum vertice a si mesmo, uma vez que tais arestas sao irrelevantes para a deteccao de comunidades.

Espera-se que o numero de nos no grafo seja consideravelmente menor do que o numero de linhasem Xtr para se evitar o overfitting, razao pela qual e utilizada a discretizacao descrita na secaoanterior.

2.4 Deteccao de comunidades

A ideia do uso de redes e que estados similares entre si na serie temporal (representadas pelosrespectivos vetores de caracterısticas) possuem conexoes densas, e consequentemente, podem seragrupados em uma mesma comunidade. Como as arestas sao geradas considerando a ordemtemporal dos nos (ou seja, o no correspondente ao instante t e ligado ao no correspondente aoinstante t+ 1), espera-se que as tendencias sejam representadas pelas diferentes comunidades.

O metodo basico de deteccao de comunidades utilizado por Anghinoni [1] e baseado na medidade modularidade, que corresponde a diferenca entre a fracao observada de arestas intra-clusters3

e a fracao esperada de arestas intra-clusters em uma rede aleatoria. Dada uma clusterizacao (ouseja, uma particao) C = {C1, C2, . . . , Ck} dos vertices da rede, a modularidade para grafos naoponderados e definida pela equacao abaixo:

Q(C) =1

2m

∑w1,w2

A(w1, w2)I (c(w1) = c(w2))−1

(2m)2∑

w1,w2

deg(w1)deg(w2)I (c(w1) = c(w2)) (10)

onde:

• m e o numero de arestas no grafo;

• w1, w2 denotam vertices da rede;

• A(w1, w2) corresponde a posicao (w1, w2) da matriz de adjacencia A;

• deg(w1), deg(w2) denotam os graus de w1 e w2, respectivamente;

• c(w1), c(w2) denotam as comunidades atribuıdas as w1 e w2;

3Uma aresta e chamada intra-cluster se conecta dois nos pertencentes ao mesmo cluster.

7

• I (c(w1) = c(w2)) e uma funcao indicadora em que I (c(w1) = c(w2)) = 1 se a comunidade dew1 for a mesma comunidade de w2 e I (c(w1) = c(w2)) = 0 caso contrario.

O primeiro operando da Equacao 10 corresponde a fracao media observada de arestas intraclusters,enquanto o segundo corresponde a fracao esperada de arestas intraclusters em uma rede aleatoriaque preserve a mesma distribuicao dos graus na rede analisada4. A definicao apresentada acima eara grafos sem pesos nas arestas (nao ponderados), mas pode ser facilmente estendida para grafosponderados.

Brandes [4] demonstra que, para qualquer rede, existe uma clusterizacao que maximiza Q, eapresenta um metodo de otimizacao baseado em Programacao Linear Inteira. Este metodo estaimplementado na funcao cluster optimal do pacote igraph do R, mas e muito custoso compu-tacionalmente (em meus testes, nao consegui utilizar). Uma heurıstica gulosa (sub-otima) maisrapida e apresentada por Clauset [6] e implementada na funcao cluster fast greedy (tambemdisponıvel no pacote igraph). Minha recomendacao e usar a heurıstica gulosa, por questao detempo computacional.

No Python, uma implementacao para a heurıstica gulosa para deteccao de comunidades com basena medida de modularidade e dada pela funcao greedy modularity communities, disponıvelno modulo community do pacote networkx5. Outra implementacao disponıvel para deteccao decomunidades, baseada no algoritmo de Louvain, esta disponıvel no pacote community6 [3].

Em qualquer situacao, a funcao de deteccao de comunidades deve retornar um vetorc = {c(w1), c(w2), . . . , c(wn)}, em que c(wi) denota a comunidade atribuıda ao vertice wi.

Finalmente, apos a deteccao das comunidades, cada ponto t da serie temporal devera ser associadoa comunidade atribuıda ao seu respectivo no na rede. Por simplicidade, usarei a notacao c(t) ≡c(w(t)), de modo que o vetor c = [c(1), c(2), . . . , c(Ttr)] contera as comunidades atribuıdas a cadaponto da serie temporal de treinamento.

2.5 Rotulagem das tendencias

O proximo passo e rotular as comunidades de acordo com sua tendencia e, em seguida, atribuiros rotulos das comunidades aos respectivos pontos da serie de precos.

A ideia basica descrita nos trabalhos de Anghinoni [1, 2] e relativamente simples: dentro de cadacomunidade, calcula-se a media das variacoes diarias de precos sobre todos os pontos da seriepertencentes aquela comunidade. Uma comunidade e rotulada como +1 (alta) se a variacao diariamedia for positiva, e como −1 (baixa) se for negativa, e os pontos da serie pertencentes a estacomunidade recebem o mesmo rotulo.

4Uma explicacao mais intuitiva para a medida de modularidade e dada na nossa amiga wikipedia, https:

//en.wikipedia.org/wiki/Modularity_(networks)5https://networkx.github.io/documentation/stable/reference/algorithms/community.html6https://python-louvain.readthedocs.io/en/latest/api.html. (Agradecimentos ao Carlos Eduardo

Martinho e Wesley Santos pela indicacao.)

8

Este metodo e descrito no Algoritmo 1.

Algoritmo 1: Rotulagem das tendencias das comunidades e dos precos

Entrada:ptr = (ptr(1), . . . , ptr(Ttr)): Vetor de precos no perıodo de treinamentoc = (c(1), . . . , c(Ttr)): Vetor de comunidades atribuıdas a cada ponto da serie, ondec(t) ∈ {1, . . . , k}Saıda: ytr = (y(1), y(2), . . . , y(Ttr)): Vetor com os rotulos atribuıdos aos dias da serie de

treinamento1 inıcio2 Inicialize um vetor r de tamanho k; /* Vetor dos rotulos das comunidades */

3 Inicialize o vetor y de tamanho Ttr; /* Vetor dos rotulos das comunidades */

4 Inicialize um vetor vtr de tamanho Ttr − 1; /* Vetor de variac~oes de precos */

5 para cada t ∈ {1, . . . , Ttr − 1} faca6 v(t)← log(ptr(t+ 1))− log(ptr(t)) ; /* Log retorno diario */

7 fim8 para cada comunidade i ∈ {1, 2, . . . , k} faca9 Selecione os valores de v correspondentes a comunidade i (ou seja, valores v(t) tais

que c(t) = i); armazene esses valores em um vetor auxiliar vaux;10 mv ← media dos valores de vaux;11 se mv ≥ 0 entao12 r(i)← +1 ; /* Rotulagem da comunidade com tendencia de alta */

13 fim14 senao15 r(i)← −1 ; /* Rotulagem da comunidade com tendencia de baixa */

16 fim17 para cada ponto t da serie tal que c(t) = i faca18 y(t)← r(i) ; /* Rotulagem de cada ponto da serie */

19 fim

20 fim

21 fim22 retorna y

Uma observacao importante e que, embora eu esteja usando a notacao ptr para o vetor de precos,e possıvel passar para o Algoritmo 1 tanto o vetor de precos originais (sem alisamento) como ovetor de precos suavizados s. Na Secao 3 discutiremos isso em mais detalhes.

2.6 Previsao das tendencias

De posse da matriz de caracterısticas Xtr e do vetor de classes/rotulos ytr, o proximo passoseria construir um classificador para novas instancias obtidas em um perıodo posterior ao detreinamento. Informalmente, um classificador pode ser definido como uma funcao ψ(x) que atribui,

9

para cada possıvel vetor de caracterısticas x, uma classe y. Em particular, estamos interessadosem aplicar a funcao ψ sobre os exemplos do conjunto de teste contidos na matriz Xts.

Anghinoni [1, 2] utiliza algoritmos externos de aprendizado supervisionado para esta tarefa. To-davia, um aspecto interessante e que a propria rede construıda e rotulada sobre o conjunto detreinamento pode ser usada imediatamente como um classificador para novas instancias.

A ideia e conceitualmente simples: partimos da premissa de que, se a distribuicao das carac-terısticas no conjunto de teste e similar (ou nao muito diferente) daquela no conjunto de treina-mento, entao cada vetor x em Xts devera ser identico ou muito parecido com um no x′ da redepreviamente construıda e rotulada; assim, poderıamos atribuir para x o mesmo rotulo y de x′.Isso significa, portanto, que podemos atribuir, para cada x em Xts, a mesma classe do seu vizinhomais proximo em Xtr.

A figura abaixo ilustra esta ideia. A tabela a esquerda representa o conjunto de treinamento,constituıdo pelos vetores de Xtr e suas respectivas classes, ytr. Para classificar o vetorx = (0.20, 0.20, 0.20, 0.80, 0.20, 0.40) pertencente a Xts (lado direito da figura), e atribuıda a classedo vetor em Xtr que seja identico ou o mais mais proximo a x.

O metodo k-NN (K-nearest neighbors) e a ferramenta natural para este procedimento. No R, ometodo k-NN esta implementado na funcao knn do pacote class. Para predizer as classes dasinstancias do conjunto de teste Xts, pode-se chamar a funcao knn com os argumentos train=Xtr,test=Xts, cl=ytr, k=1. Esta funcao retorna o vetor yts de classes preditas para as instancias deXts

2.7 Avaliacao de desempenho

Em problemas envolvendo classificacao e previsao em series temporais, uma das estrategias paraavaliar o desempenho de um modelo e simular a aplicacao das previsoes y geradas pelo modelo,mensurando-se os ganhos e perdas gerados por essas previsoes; no mercado financeiro, esse tipode simulacao e denominado backtest;

10

Aqui apresento uma versao bastante simplificada de backtest, que basicamente simula as operacoesque um trader hipotetico (humano ou automatico) deveria realizar a cada dia t de acordo com atendencia atribuıda pelo classificador (alta ou baixa). Este simulador mantera registro da operacaoem andamento e do patrimonio atual – em conta corrente e em investimentos.

Neste projeto, consideramos apenas duas operacoes possıveis sobre um ativo negociado em bolsa,de acordo com as indicacoes do classificador:

Compra: Quando o trader recebe um sinal de tendencia de alta, compra uma cota do tıtulo nabolsa e as mantem ao longo do tempo ate que um sinal de queda da tendencia seja recebido.Se uma posicao “comprada” ja estiver em andamento (ou seja, se o trader ja tem uma cotacomprada), ela e simplesmente mantida.

Esta operacao sera lucrativa se a tendencia real confirmar a tendencia prevista, ou seja, seo preco de venda for maior do que o preco de compra.

Venda: Quando o trader recebe um sinal de tendencia de baixa, ele aluga uma cota do ativo deterceiros (mediante uma taxa de aluguel e um deposito de garantia) e vende esta cota nabolsa. Esta operacao e denominada short selling. A posicao “vendida” e mantida ate que otrader receba um sinal de tendencia de alta. Para encerrar esta operacao, o trader precisacomprar na bolsa uma cota equivalente do tıtulo que havia alugado, para poder devolve-laao dono original.

Esta estrategia gera lucro se a tendencia real da serie confirmar a tendencia prevista, ouseja, se o preco do ativo.

O procedimento e detalhado no Algoritmo 2. As entradas sao: (i) o vetor de precos diarios noperıodo de teste, pts = (pts(1), . . . , pts(Tts)), onde Tts e o numero de dias neste perıodo; e (ii) ovetor de tendencias diarias previstas pelo modelo, yts = (yts(1), . . . , y(Tts)). A saıda e um vetorcom os balancos diarios ao longo do perıodo de teste, balts = (balts(1), . . . , balts(Tts)).

Na pagina seguinte ao algoritmo apresento algumas explicacoes mais detalhadas.

11

Algoritmo 2: Backtest

Entrada: pts = (pts(1), . . . , pts(Tts)); yts = (yts(1), . . . , y(Tts))Saıda: balts = (balts(1), . . . , balts(Tts))

1 Inicialize um vetor cash de tamanho Tts; /* Saldos diarios em conta corrente */

2 Inicialize um vetor inv de tamanho Tts; /* Saldos de investimentos diarios */

3 cash(1)← pts(1); /* Saldo inicial em conta e o preco no 1o dia */

4 inv(1)← 0; /* Investimento inicial e zero */

5 cur state← 0;6 para cada t ∈ {2, . . . , Tts} faca7 op price← (pts(t) + pts(t− 1))/2;8 se yts(t) = 1 entao /* Dia atual rotulado com tendencia de alta */

9 se cur state = 0 entao10 cur state← 1; /* Inicia posic~ao de compra */

11 cash(t)← cash(t− 1)− op price; /* Debita na conta corrente */

12 inv(t)← inv(t− 1) + op price; /* Credita na conta investimento */

13 fim14 senao se cur state = +1 entao15 cash(t)← cash(t− 1); /* Mantem saldo do dia anterior */

16 inv(t)← op price; /* Atualiza conta invest. com preco atual */

17 fim18 senao /* Estado corrente e −1 */19 cur state← 0; /* Encerra a posicao de short-selling */

20 cash(t)← cash(t− 1)− op price; /* Debita na conta corrente */

21 inv(t)← 0; /* Zera na conta investimento */

22 fim

23 fim24 senao /* Dia atual rotulado com tendencia de baixa */

25 se cur state = 0 entao26 cur state← −1; /* Inicia posic~ao de short-selling */

27 cash(t)← cash(t− 1) + op price; /* Credita na conta corrente */

28 inv(t)← inv(t− 1)− op price; /* Debita na conta investimento */

29 fim30 senao se cur state = +1 entao31 cur state← 0; /* Encerra a posicao de compra */

32 cash(t)← cash(t− 1) + op price; /* Credita na conta corrente */

33 inv(t)← 0; /* Zera na conta investimento */

34 fim35 senao /* Estado corrente e −1 */36 cash(t)← cash(t− 1); /* Mantem saldo do dia anterior */

37 inv(t)← −op price; /* Atualiza conta invest. com preco atual */

38 fim

39 fim

40 fim41 balts ← cash + inv;42 retorna balts 12

Dois vetores auxiliares sao criados nas linhas 1–2: cash, que armazena os saldos diarios disponıveisem conta corrente, e inv, que armazena os saldos diarios em investimento. Duas outras variaveissao utilizadas no laco principal. A variavel curr state indica se ja ha havia, no dia anterior, umaoperacao de compra (+1) ou de venda(−1) em andamento. Se nao havia, seu valor e 0. A variavelauxiliar op price (linha 7) contem o preco estimado de uma operacao de compra ou venda no diat; aqui assumimos que e possıvel comprar ou vender uma cota do tıtulo pela media entre o precode fechamento do dia anterior e o preco de fechamento do dia atual. Dentro do laco principal, saotratados os dois tipos de tendencia predita pelo modelo em cada dia t:

• Se o modelo prever uma tendencia de alta no dia t (linhas 9–23), verifica-se o estado corrente:se nao ha nenhuma operacao em andamento (cur state = 0), compra-se um lote do tıtulo;se ja ha uma operacao de compra em andamento (cur state = +1), ela e mantida; se hauma operacao short selling em andamento (cur state = −1), ela e encerrada (ver explicacoesabaixo).

• Se o modelo prever uma tendencia de baixa no dia t (linhas 24–39), verifica-se o estado cor-rente: se nao ha nenhuma operacao em andamento (cur state = 0), inicia-se uma operacaode short selling (ver explicacoes abaixo); se ha uma operacao de compra em andamento(cur state = +1), ela e encerrada; se ja ha uma operacao short selling em andamento(cur state = −1), ela e mantida.

Quando uma operacao de compra e iniciada (linhas 10–12), os vetores cash e inv sao atualizadosda forma intuitiva: debita-se o preco de compra de um lote do ativo na conta corrente e credita-seeste valor na conta investimento. Analogamente, quando a operacao e encerrada com a vendado lote (linhas 31–33), seu valor de venda e creditado na conta corrente e retirado da containvestimento.

Ja em uma operacao de short selling, quando esta e iniciada (linhas 26–29), credita-se o valor dopreco de venda do lote na conta corrente (lembre-se que, no short selling, primeiro se vende umlote alugado de terceiros para posteriormente recompra-lo); por outro lado, debita-se este valorna conta investimento (deixando seu saldo negativo), para se ter registro do debito que o tradertem com o dono original do lote. Quando a operacao de short selling e encerrada (linhas 19–21),debita-se da conta corrente o preco pago pelo trader para comprar o lote, e zera-se o saldo queestava negativo na conta investimento.

O balanco diario do trader e dado pela soma do saldo em conta corrente com o saldo na containvestimento em cada dia t.

2.7.1 Limitacoes do backtest apresentado

O procedimento de backtest aqui descrito e bastante simplificado, especialmente em dois aspectos:o primeiro e que ele nao leva em consideracao os custos envolvidos nas operacoes (corretagempelas ordens de compra e venda, insumos, aluguel do ativo, etc); esses custos podem impactar

13

fortemente a rentabilidade se a frequencia de operacoes for alta e o ganho por operacao for baixo.O segundo aspecto e que aqui assumimos que e possıvel fixar qual sera o preco de compra ou devenda de um tıtulo somente com base no preco de fechamento do dia anterior (que e conhecido)e o preco de fechamento do dia atual (que nao se conhece em uma situacao real); em perıodosde alta volatilidade do mercado, pode-se precisar pagar um preco mais alto do que se esperaem uma compra, e receber um valor mais baixo do que se espera em uma venda, o que impactadiretamente nas margens e na rentabilidade das operacoes. Nao obstante, esse modelo simplificadofoi apresentado para fins didaticos e pode servir de base para a elaboracao de backtests maissofisticados.

2.7.2 Algumas estatısticas de desempenho

Existem varias formas de avaliar o desempenho de um modelo com base no backtest. Algumasdessas sao7:

Resultado percentual: E o indicador mais simples e direto de calcular, e consiste em medir avariacao percentual do patrimonio no final do perıodo de teste e o patrimonio no inıcio:

%∆bal = 100×[balts(Tts)

balts(1)− 1

](11)

Este sera o indicador utilizado neste projeto (ver Secao 3).

Fator lucro: consiste na razao entre os ganhos e prejuızos obtidos no perıodo.

FatLucro =Soma dos resultados nas operacoes com lucros

Soma dos resultados nas operacoes com prejuızo(12)

Por exemplo, um fator lucro de 2, 21 indicaria que, para cada R$1, 00 de prejuızo, houveR$2, 21 de lucro.

% de ganhos : serve para estimar a taxa de acerto nas operacoes realizadas:

%Ganho = 100× Qt. de operacoes com lucro

Qt. total de operacoes(13)

Lucro medio por operacao : como o nome sugere, corresponde ao resultado lıquido divididopelo numero de operacoes:

LucroOp =balts(Tts − balts(1)

Qt. total de operacoes(14)

7https://www.bussoladoinvestidor.com.br/como-avaliar-um-trading-system/

14

3 Entrega do trabalho

O experimento considerado neste projeto consistira em reproduzir o metodo aqui descrito, emtodas as etapas descritas na Secao 2. Os valores recomendados para todos os parametros parao pre-processamento dos dados, calculos dos indicadores e rotulagem das comunidades foramapresentados na Secao 2, mas aqui reapresento sua lista:

• j = 5: parametro para alisamento da serie de precos (Equacao 1)

• qs = 10; ql = 5.qs = 50: janelas de curto e longo prazo para calculo dos indicadores (Equacoes2, 4, 5)

• α = 0.2: tamanho de cada intervalo para a discretizacao de Fzi (Equacao 8)

• Perıodo de treinamento (construcao e rotulagem da rede): jan/1995 a dez/2017

• Perıodo de teste (previsao das tendencias, back test): jan/2018 a set/2019

A rotulagem das tendencias (Subsecao 2.5) e o backtest (Subsecao 2.7) deverao ser realizados sobduas condicoes:

• Passando os precos originais (sem alisamento) como argumentos para os Algoritmos 1 e 2;

• Passando os precos alisados como argumentos para os Algoritmo 1 e 2;

A ideia dessas duas variantes e verificar como os resultados do modelo sao impactados em cadauma dessas duas condicoes.

3.1 Resultados a serem gerados:

Elenco abaixo os relatorios a serem incluıdos no relatorio, sendo os itens 1 e 2 os mais relevantes.Uma implementacao correta do metodo e um relatorio adequado que contenha os itens 1 e 2 masnao os itens 3 e 4 podera ter nota ate 8.0. Para obtencao de nota 10.0, os itens 3 e 4 sao necessarios.

1. Uma tabela contendo, para cada condicao de teste (rotulagem/previsao com precos originaise com precos alizados), os seguintes indicadores:

(a) O resultado percentual %∆bal obtido pelo modelo (Equacao 11);

(b) A variacao percentual dos precos no perıodo, dada pela equacao abaixo:

%∆pr = 100×[prts(Tts)

prts(1)− 1

](15)

15

(c) A diferenca entre %∆bal e %∆pr.

A tabela abaixo apresenta um exemplo com os resultados obtidos em minha implementacao.

Rotulos com precos originais Rotulos com precos alisados%∆bal 4.2 82.4%∆pr 34.1 36.5

%∆bal −%∆pr -29.9 45.9

2. Um grafico de linhas com os resultados do back test para cada condicao de teste. Nestegrafico, devera ser plotada a curva de precos no perıodo de teste, bem como a curva deevolucao do patrimonio (vetor bal descrito no Algoritmo 2). Se possıvel, plotar tambem ospontos de previsoes de alta (+1) e de baixa (−1) com cores diferentes.

Apresento abaixo os graficos que obtive em minha implementacao. A linha preta representaos precos do Ibovespa, e a linha pontilhada em azul e vermelho representa o balanco obtidono back test. Os pontos azuis e vermelhos correspondem, respectivamente, as previsoes detendencia de alta e de baixa.

16

3. Um histograma (ou tabela de frequencias) para cada coluna de X (Equacoes 8 e 9). Vocepode tanto usar a matriz X completa ou somente a matriz Xtr.

Este diagnostico e recomendavel para verificar se nao ha concentracoes elevadas de casos emalguns valores. Como essas caracterısticas sao resultantes da padronizacao dos indicadoresoriginais e sua transformacao pela funcao de distribuicao acumulada na Normal padrao,espera-se que a distribuicao de frequencias seja razoavelmente uniforme entre os valores.

O grafico abaixo apresenta as distribuicoes obtidas em minha implementacao com a matrizX completa. As caracterısticas x1 a x4 apresentam uma distribuicao razoavelmente uni-forme, conforme esperado. Ja as caracterısticas x6 e x6 apresentam maior concentracao nosextremos.

17

4. Um histograma (ou tabela de frequencias) da quantidade de dias pertencentes a cada comu-nidade encontrada na rede.

Voce pode apresentar um histograma apenas para o conjunto de treinamento (que foi uti-lizado para a construcao da rede) ou pode tambem, opcionalmente, incluir um histogramareferente ao conjunto de teste. Neste caso, para atribuir uma comunidade a cada dia doconjunto de teste, aplica-se procedimento similar ao usado na Subsecao 2.6.

O grafico abaixo apresenta as distribuicoes das comunidades no conjunto de treinamentoe no conjunto de teste. E possıvel observar algumas comunidades com poucos elementos.Isso poderia impactar a acuracia do modelo, ja que essas comunidades podem ter baixacapacidade preditiva por terem sido rotuladas com amostras muito pequenas. Para mitigareste problema, futuras melhorias no modelo (que nao fazem parte deste projeto) poderiamdesconsiderar as comunidades com proporcoes muito baixas no conjunto de dados.

Nos graficos que apresento, e possıvel notar tambem que a distribuicao de frequencias noconjunto de teste e diferente da distribuicao no conjunto de treinamento.

18

Um ponto importante e que nao necessariamente os resultados obtidos em sua implementacaoserao os mesmos do que os que obtive em minha implementacao. Uma possıvel fonte de variacao eo algoritmo de deteccao de comunidades utilizada. Assim, a avaliacao nao levara em consideracaoos valores numericos em si, mas a consistencia dos resultados. Por outro lado, tome cuidado comcertos resultados que possam sugerir erros de implementacao. Alguns exemplos de resultadosespurios sao: recomendacoes de apenas um tipo; curva relativa ao patrimonio identica a curvados precos; resultados obtidos sobre os precos originais identicos aos resultados obtidos sobre osprecos alisados.

3.2 Entrega:

• O trabalho pode ser realizado em duplas.

• Devera ser entregue o codigo-fonte e um relatorio (em formato PDF) com os resultados.

• O relatorio deve ser enviado em um arquivo zipado (extensao .zip), nomeado com a se-guinte sintaxe: EP 2 NUSP1 NUSP2.zip, onde NUSP1 e NUSP2 sao os numeros USP doscomponentes da dupla.

• A entrega devera ser feita por e-mail para [email protected], com assunto: “ACH2138- EP2”. No corpo do e-mail, informe os nomes completos dos componentes da dupla.

• O prazo final para entrega sera 24/01/2020, mas para todo relatorio que eu receber antesdeste prazo, atualizarei a nota dos respectivos alunos no Sistema Jupiter em no maximo doisdias do recebimento.

19

Referencias

[1] L.Anghinoni. Classificacao e previsao de series temporais atraves de redes complexas. Dis-sertacao de Mestrado, Universidade de Sao Paulo, 2018. Disponıvel em http://www.teses.

usp.br/teses/disponiveis/59/59143/tde-11122018-095106/en.php

[2] L.Anghinoni, L.Zhao, D.Ji, H.Pan. Time series trend detection and forecasting using complexnetwork topology analysis. Neural Networks, 117, pp 295-306, 2019. Disponıvel em https:

//www.sciencedirect.com/science/article/pii/S0893608019301583?via%3Dihub#b9

[3] V.D.Blondel, J-L.Guillaume, R.Lambiotte, E.Lefebvre. Fast unfolding of communities in largenetworks. Journal of Statistical Mechanics: Theory and Experiment 10008, 2008. Disponıvelem https://doi.org/10.1088%2F1742-5468%2F2008%2F10%2Fp10008

[4] U.Brandes, D.Delling, M.Gaertler, R.Gorke, M.Hoefer, Z.Nikoloski, D.Wagner. On ModularityClustering. IEEE Transactions on Knowledge and Data Engineering 20(2):172-188, 2008.

[5] L.Breiman. Random Forests. Machine Learning 45(1), 5-32, 2001.

[6] A.Clauset, M.E.J.Newman, C.Moore. Finding community structure in very large networks.Physical Review E 70, 066111, 2004. Disponıvel em https://journals.aps.org/pre/

abstract/10.1103/PhysRevE.70.066111

20