#1.Disclaimer
A vontade inicial foi fazer um trabalho relacionado a mercado financeiro e bolsa de valores. Busquei uma infinidade de bases de dados, com diferentes temas e pressupostos, mas todas estavam incompletas em algum sentido e depois de quatro dias de buscas, chegou a exaustão. Mudei meus planos. Resolvi fazer sobre qualquer séries. Depois sobre filmes. Sobre jogos. Não consegui encontrar uma base de dados que se adequasse ao que eu tinha real interesse. E então pensei em fazer o estudo de duas ações da bolsa eatravés do modelo de Long & Short de trade, que utiliza de base estatística para as operações.
#2.Introdução
Long & Short - o modelo O modelo de trade baseado em long (compra de um ativo financeiro) e short (venda de um ativo financeiro) é baseado em modelos estatísticos de correlação entre os ativos que serão trocados e desvio padrão (comportamento padrão). É feita uma análise histórica na variação dos preços em diferentes janelas de tempo para se ter a certeza que eles “caminham juntos”, independente do horizonte temporal. O modelo funciona da seguinte maneira: quando um ativo financeiro está muito distante, além do seu desvio padrão, estatisticamente ele tende a voltar para o seu ponto/preço normal. E a partir disso, busca-se proteção em um outro ativo que caminhe junto, mas não esteja tão distante do seu ponto central. Dessa maneira, se cria uma operação onde compra o ativo mais abaixo do seu preço ou vende o ativo que estiver mais acima do seu preço em relação ao desvio padrão; pois ele tende a voltar pro preço padrão, e faz a operação inversa em um ativo que tenha uma correlação alta e positiva e que esteja dentro do seu desvio padrão, de forma que estatisticamente esse tende a não se mover para fora do desvio enquanto o outro tende a se movimentar para a linha natural. Com isso, se cria duas operações inversas, onde o movimento do preço tende a mover muito, pro que está com a operação fora dos desvios e mover pouco pro ativo dentro do desvio, resultando em ganhos financeiros maiores no que movimentar mais, e perdas financeiras menores no que tende a movimentar menos. Como São operações inversas, acaba havendo uma limitação nas perdas, fazendo o trade ser mais seguro e mais acertivo.
#3.Metodologia
O objetivo inicial era calcular: - correlação entre os ativos, - seus desvio padrão, - a variância, - a matriz de correlação das variações
E em seguida fazer testes de hipóteses através de escolhas de dias aleatórios ou pontos de entrada específicos considerando os desvios observados, criando assim um backtest pro modelo. Mas o que acontece é que começaram os desafios. Muito por conta da exaustão de já estar no projeto há muitos dias e sem conseguir ter avanços.
Escolha dos ativos para o estudo: Para que ficasse mais bonito e acertivo (a considerar outros testes feitos), escolhi dois ativos que já são conhecidos na estratégia L&S. Mas o objetivo principal é criar um código capaz de analizar quaisquer pares de ativos para que se possa ser utilizada a estratégia.
#4.Estudos, tantativas e erros
Depois de fazer os testes no excel comecei a fazer no R. E aí os problemas começaram a surgir (aos montes). O primeiro foi pra juntar as duas tabelas (dois DF) em um só. Tentei o melt, o df.temp, tentei criar tabelas isoladas e unir os dados. Nada funcionou como eu realmente gostaria. Na hora de usar o as.Date para definir a primeira coluna petro3[,1] < as.Date não funcionou de maneira nenhuma também. Creio que esse foi o motivo pra que o restante não tenha dado tão certo.
library(dplyr)
##
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
library(readr)
PETR3_SA <- read_csv("C:/Users/tauan/Desktop/statistics 2021/trab final/PETR3.SA.csv")
##
## -- Column specification --------------------------------------------------------
## cols(
## Date = col_date(format = ""),
## Open = col_double(),
## High = col_double(),
## Low = col_double(),
## Close = col_double(),
## `Adj Close` = col_double(),
## Volume = col_double()
## )
library(readr)
PETR4_SA <- read_csv("C:/Users/tauan/Desktop/statistics 2021/trab final/PETR4.SA.csv")
##
## -- Column specification --------------------------------------------------------
## cols(
## Date = col_date(format = ""),
## Open = col_double(),
## High = col_double(),
## Low = col_double(),
## Close = col_double(),
## `Adj Close` = col_double(),
## Volume = col_double()
## )
Curiosidade: Pra fazer o estudo, não se pode usar o “Close” que é o preço de fechamento do dia. Isso por conta de variações que são externas ao preço. Por exemplo, se a ação paga dividendos, esses dividendos são descontados do preço da cotação. E por conta disso se usa o Adj Close, que leva em consideração apenas a variação dependente do preço e independente dos movimentos externos como dividendos, splips, merges etc.
Criação da tabela com as variáveis que serão necessárias:
tabajust <- table(PETR3_SA$`Adj Close`, PETR4_SA$`Adj Close`)
Uma vez com a tabela em mãos foi feita a correlação. A matriz de correlação chega a ser divertida: parece uma reta num gráfico. Veja:
library(corrplot)
## corrplot 0.90 loaded
corpet <- cor(tabajust)
corrplot.mixed(corpet)
Pra que a estratégia possa ser usada, é necessário que ambos os ativos tenham uma movimentação do preço parecida. Como PETR3 e PETR4 são a mesma empresa, e a diferença está apenas na tipologia da ação com tickers (preferenciais e ordinárias), a correlação é muito alta (acima de 90%). Existem ações com correlação negativa também, mas não não interessantes pra essa estratégia pois o índice de acerto e risco não compensa. Mas em estratégias de montagem de carteira a correlação é um dos fatores principais, junto com medias ponderadas e índices (como por exemplo o sharpe). Momento telecurso 2000: Em estatística, correlação ou dependência é qualquer relação estatística, causal ou não, entre duas variáveis aleatórias ou dados bivariados. No sentido mais amplo, correlação é qualquer associação estatística, embora geralmente se refira ao grau em que um par de variáveis está linearmente relacionado. Fonte: arial 12. (Brinks, é wikipedia).
Regressão linear Pra ficar mais visual a noção de correlação foi feita uma regressão linear.
# Ajuste Linear
par(bg="lightblue")
plot(PETR3_SA$`Adj Close`,PETR4_SA$`Adj Close`,
col = "Blue",
main = " Linearidade entre os ativos",
ylab = "PETR4",
xlab="PETR3")
abline(lsfit(PETR3_SA$`Adj Close`, PETR4_SA$`Adj Close`))
O gráfico de regressão ou ajuste linear serve pra identificar a relação estatística entre uma ou mais variáveis. De uma certa maneira ela indica o andamento de uma variável em função da outra. No exemplo aqui, pode-se observar o comportamento da Petr4 em função do movimento da Petr3. A reta angular positiva significa que elas caminham na mesma direção, ou seja, que são relacionadas, e que essa relação é positiva. Dependendo dos ativos ou variáveis estudadas, o método pode apresentar maior ou menor dispersão, positiva ou negativa, havendo ou não correlação.
Desvio Padrao De acordo com a estratégia de Long and Short, esse deveria ser o momento em que é criada uma nova variável. O Desvio Padrao. A ser calculado diariamente e assim apontar em qual momento está o preço, se muito longe da média ou se próximo da média. Esse desvio deveria aparecer em um gráfico, em relação a média móvel normal. E logo em seguida, criar mais duas variáveis, uma com o preço ajustado pra 2 desvios pra mais e outra com os desvios pra menos. E esse seria o ponto pra informar se o ativo deve ser vendido ou comprado. E repetir o processo pro segundo ativo.
Fiz no google sheet pra exemplificar: a linha inferior indica o desvio padrão de 2 desvios em relação ao preço médio a linha média é média móvel simples (pro caso do exemplo usei a de 7 dias) a linha superior representa que o desvio indicando que o preço está acima do desvio padrão esperado
Como pode ser observado, o preço do ativo se mantem na maior parte do tempo subindo e descendo em relação ao seu desvio médio. De forma que a acertividade é bastante alta nesse sistema de trade. A tendênciaé o preço sempre voltar para as médias. Estatísticamente, funciona em 90% dos casos [backtest feito em outras plataformas].
#5.Teste de hipótese
“É como falar sobre uma população através de uma amostra. É uma afirmativa sobre uma hipótese da população”. Esse procedimento permite, por exemplo tomar decisões. " - Prof Paulo Justiniano
O teste de hipótese que eu queria fazer inicialmente era em cima do gráfico acima. Mas como não consegui alcançar, mudei a estratégia. Peguei então novamente os dados dos ativos pra verificar se eles têm uma distribuição normal, ou se não, se a hipótese de funcionamento de relação dos ativos não é indicada. E a partir dos testes de hipótese decidir se eu posso fazer trades com esses ativos, essas ações, ou não.
Primeiramente é necessário verificar se as amostras seguem uma distribuição normal. Para verificar a normalidade usa-se o teste de shapiro. E a partir do resultado, normalidade ou não, por se tratar de uma variável quantitativa, usar os testes ou de Spearman (não) ou Pearson (sim).
O teste é feito definindo uma alternativa e confrontando com os dados se essa afirmativa é verdadeira ou não. No caso as hipóteses são: H0: os dados seguem uma distribuição normal H1: os dados NÃO seguem uma distribuição normal alpha = 0.05
O alpha é a margem. Significa que pra eu considerar a distribuição normal, a amostra precisa estar pelo menos 95% dentro da normalidade.
shapiro.test(PETR3_SA$`Adj Close`)
##
## Shapiro-Wilk normality test
##
## data: PETR3_SA$`Adj Close`
## W = 0.97411, p-value = 0.1974
shapiro.test(PETR4_SA$`Adj Close`)
##
## Shapiro-Wilk normality test
##
## data: PETR4_SA$`Adj Close`
## W = 0.96878, p-value = 0.1045
PETR3 p value = 0,19 o que é maior que 0,05, indicando que sim, há uma distribuição normal. PETR4 p value = 0,10 o que é maior que 0,05, indicando que sim, há uma distribuição normal.
Como pode ser visto com o teste de Shapiro acima, ambas as variáveis possuem distribuição normal. Por conta disso, o teste seguinte a ser feito o teste de Pearson.
O teste de Peason dará a resposta se há razoabilidade na escolha dos ativos para o trade, considerando a sua variação e distribuição normal correlacionada.
H0: A variancia entre PETR3 e PETR4 é igual H1: A variancia não é igual alpha = 0.05
cor.test(PETR3_SA$`Adj Close`, PETR4_SA$`Adj Close`, method = "pearson")
##
## Pearson's product-moment correlation
##
## data: PETR3_SA$`Adj Close` and PETR4_SA$`Adj Close`
## t = 42.795, df = 62, p-value < 2.2e-16
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
## 0.9728764 0.9899734
## sample estimates:
## cor
## 0.9834915
O resultado é que existe uma correlação muito forte entre as duas ações. O intervalo de confiança da amostra está entre 0.9728764 e 0.9899734. Pensei haver algo errado, pois o O p value está indicado como < 2.2e-16; o que é praticamente zero. Não sei se é uma alternativa realmente possível tal valor. Mas pesquisei na internet e pessoas com amostras pequenas ou muito próximas chegaram ao mesmo resultado. Então a interpretação é que valida a alternativa H0, que diz que a variancia é igual.
Observação Re-assistindo as aulas, na do dia 2 de setembro fala-se sobre o t.test. Pensei em usar ele pra verificar o preço em relação a média de preço. Mas se fosse num intervalo de tempo maior, já seria inviável, pois as empresas tendem a crescer ou falir no tempo; de maneira a cotação flutuar bastante pra mais ou pra menos. Dessa forma, o mais indicado seria mesmo fazer os dados em cima da variação percentual de preço. Coisa que não consegui fazer.
#6.Conclusão
Considerando o estudo feito sobre os preço dos ativos, em alinho com a estratégia e métodos explicados, é possível afirmar que dentro do sistema Long and Short de trade de ações baseado em correlação, o par PETR3 e PETR4 pode ser usado. É importante lembrar que não é um indicador de tomada de decisão sobre investimento (ainda), apenas estudo sobre um modelo de trade que precisa de mais algumas variáveis para se tornar completo e eficaz. O observado em relação ao comportamento dos dois ativos escolhidos não é encontrado de forma comum no mercado de ações. Há sim pares com forte correlação, mas não tanto quanto dois ativos da mesma empresa. É válido mudar os ativos a critério de teste.
#7.Bibliografia
LONG-TERM SECRETS TO SHORT-TERM TRADING - LARRY WILLIAMS https://riconnect.rico.com.vc/blog/long-short https://finance.yahoo.com/ https://pt.wikipedia.org/wiki/Covari%C3%A2ncia http://www.facom.ufu.br/~backes/pgc204/Aula06-Regressao.pdf Teste de Hipótese - aulas e vídeos complementares https://stats.stackexchange.com/questions/403343/what-is-the-interpretation-of-the-p-value-of-2-2e-16
#8.Extra
Depois de findado o trabalho consegui (não sei como) acessar a API diretamente do Yahoo finance e plotar o retorno diário. Através dos códigos
vale <- quantmod::getSymbols("VALE3.SA", src = "yahoo", auto.assign = FALSE)
## Registered S3 method overwritten by 'quantmod':
## method from
## as.zoo.data.frame zoo
## 'getSymbols' currently uses auto.assign=TRUE by default, but will
## use auto.assign=FALSE in 0.5-0. You will still be able to use
## 'loadSymbols' to automatically load data. getOption("getSymbols.env")
## and getOption("getSymbols.auto.assign") will still be checked for
## alternate defaults.
##
## This message is shown once per session and may be disabled by setting
## options("getSymbols.warning4.0"=FALSE). See ?getSymbols for details.
## Warning: VALE3.SA contains missing values. Some functions will not work if
## objects contain missing values in the middle of the series. Consider using
## na.omit(), na.approx(), na.fill(), etc to remove or replace them.
head(vale)
## VALE3.SA.Open VALE3.SA.High VALE3.SA.Low VALE3.SA.Close
## 2007-01-02 31.850 32.700 31.850 32.700
## 2007-01-03 32.255 32.400 30.795 31.100
## 2007-01-04 31.000 31.250 30.150 30.600
## 2007-01-05 30.540 30.595 29.100 29.300
## 2007-01-08 29.500 30.400 29.500 30.400
## 2007-01-09 30.430 30.700 29.155 29.625
## VALE3.SA.Volume VALE3.SA.Adjusted
## 2007-01-02 739800 17.44447
## 2007-01-03 4913000 16.59091
## 2007-01-04 2638600 16.32418
## 2007-01-05 3246000 15.63067
## 2007-01-08 2050600 16.21748
## 2007-01-09 2368200 15.80404
library(dygraphs)
## Warning: package 'dygraphs' was built under R version 4.1.1
daily_return <- PerformanceAnalytics::Return.calculate(vale$VALE3.SA.Close, method = "log")
dygraphs::dygraph(daily_return, main = "Retorno Diário da VALE3.SA") %>% dyRangeSelector()
Tinha tentado diversas vezes antes sem sucesso. É interessante pois dá pra fazer os estudos de mais ativos através do modelo já criado. Ou seja: o protótipo ainda pode evoluir bastante.
Informações inúteis:
Tempo total de pesquisa, tentativas e erros: >50horas Jarras de café de 500ml consumidas: > 10 Bases de dados descobertas: > 800 Vezes que parei pra chorar por não conseguir resolver os erros: >20