Ciência de Dados e Aprendizado de Máquina (Parte 04): Previsão de um crash no mercado de ações
Introdução
Na parte 02 desta série de artigos nós criamos um modelo logístico simples baseado nos dados do Titanic, hoje nós vamos construir um modelo logístico que pode nos ajudar a prever um crash do mercado
Neste artigo, nós vamos fazer uma aplicação útil de nossos modelos logísticos fazendo um modelo preditivo do crash do mercado de ações, para testar o nosso modelo, nós vamos usar os dados de teste do crash do mercado de ações atual, acho que isso será relevante para todos nós.
Crash do mercado de ações
Um crash do mercado de ações é uma queda acentuada e rápida no valor total do mercado, com os preços geralmente caindo mais de 10% em poucos dias, exemplos famosos de um grande crash do mercado de ações é a Segunda-feira negra de 1987 e a bolha do mercado imobiliário de 2008. Um crash é geralmente atribuível ao estouro de uma bolha de preços e é devido a uma venda maciça que ocorre quando a maioria dos participantes do mercado de ações tenta vender seus ativos ao mesmo tempo.
Antes de nos aprofundarmos nisso, eu quero dar um aviso sobre isso:
Este não é um conselho financeiro ou de negociação. Espero que você acredite que eu não sou o Sr. Buffet ou Charlie Munger, ou um investidor profissional do mercado de ações, eu sou apenas um cientista de dados encontrando uma maneira de relacionar os modelos científicos à negociação, não leve as coisas a sério neste artigo como a maioria desses pontos de vista foram coletados on-line e de várias fontes confiáveis com suas referências no final do artigo faça sua pesquisa antes de decidir usar qualquer uma das abordagens discutidas neste artigo para a tomada de decisões de negociação
Agora que nós tiramos isso do caminho, vamos seguir em frente.
Em primeiro lugar, nós vamos ver os fatores que afetam os preços das ações, uma vez que nós entendemos esses fatores, nós teremos por onde começar, pois esses fatores podem ser usados como nossos dados (variáveis independentes) para o nosso modelo logístico.
Fatores que afetam os preços das ações
há muitos fatores que afetam o mercado de ações, a seguir temos alguns. Lembre-se de que nunca houve um indicador claro de como os mercados se comportam da maneira como se comportam, então eu usarei os seguintes fatores:
- Oferta e Demanda
- Fatores relacionados à empresa
- Taxa de juros
- Eventos atuais
- Inflação
01: Oferta e Demanda
Existem muitos fatores que afetam o mercado de ações, mas se você tirar tudo o que está do lado de fora e olhar para o fator básico, é simples, oferta e demanda, um desequilíbrio entre a oferta e demanda aumentará e diminuirá o preço da ação
Se houver uma escassez repentina de maçãs, mais e mais pessoas farão fila para comprá-las, e o preço das maçãs disparará imediatamente.
da mesma forma, se a empresa está indo bem e todos querem comprar as ações da mesma empresa, haverá uma escassez de ações levando à disparada dos seus preços, e o oposto é verdadeiro, se houver muitas ações, mas ninguém quer comprá-las, o preço das ações cairá.
É impossível (eu poderia dizer) para obtermos todos os dados de oferta e demanda que nós podemos usar em nosso modelo, então vamos deixar esse fator para trás em nosso conjunto de dados, mas eu acredito que qualquer pessoa que possa obter esses dados com precisão está um passo mais próximo de construir o santo graal
02: Fatores relacionados à empresa
Qualquer coisa que aconteça dentro da empresa afetará diretamente o preço das ações, se a empresa estiver em alta, com lançamentos de produtos bem-sucedidos, aumento da receita, dívida reduzida e mais influxo de investidores, o preço de uma empresa aumentará porque todos vão querer comprar as ações dessa empresa que está indo de um pico ao outro
No entanto, se uma empresa está registrando perdas, tendo falhas de produtos e aumento da dívida, a maioria dos acionistas irá despejar as ações da empresa, reduzindo assim o preço delas.
Um bom exemplo para deixar esse ponto claro é a Netflix e a Apple,
Vimos a Netflix perder mais de 200.000 assinantes de serviço nos primeiros 3 meses de 2022, devido ao aumento das sanções de preços para alguns dos membros e muitas outras situações que ocorreram dentro da empresa que levaram diretamente o preço das ações da Netflix a cair
A Apple, por outro lado, é uma empresa de sucesso há muito tempo por conta dos lançamentos de produtos bem-sucedidos, boa liderança e outras situações positivas dentro da empresa que levaram a uma alta do preço da ação nos últimos anos
Para determinar a saúde da empresa, nós usaremos uma métrica chamada de índice preço/lucro (P/L)
Índice preço/lucro
Índice preço/lucro avalia uma empresa que mede o preço atual da ação em relação ao lucro por ação (LPA). O índice P/L pode ser usado como um indicador do quão saudável está uma empresa. Aqui está a aparência dos gráficos com base nos preços das ações e no índice P/L para a Apple e Netflix
APPLE:
fonte de dados: macrotrends.net
NETFLIX
fonte de dados:macrotrends.net
Parece que o índice P/L é calculado trimestralmente em um ano, então, neste caso, parece que isso era tudo o que as fontes gratuitas de dados podiam oferecer, acho que há mais fontes pagas, nós podemos considerar que nossos dados têm algumas falhas, pois nós precisamos ter o mesmo número de linhas em todas as colunas do nosso conjunto de dados para que nossos cálculos em nossos modelos funcionem de forma eficaz, esses são os dados para a APPLE:
se os dados forem calculados a cada trimestre de um ano, no restante do trimestre nós usaremos os mesmos dados que foram pré-calculados até o próximo trimestre, então, neste caso, nós vamos duplicar os dados:
As mesmas ações serão realizadas para a NETFLIX.
03: Taxas de Juros
Os acontecimentos no banco Federal Reserve afetam diretamente os preços das ações, os bancos centrais continuam mudando as taxas em intervalos regulares para estabilizar a economia. Naturalmente, uma taxa de juros mais alta significa que as empresas terão que pagar mais pelos empréstimos, resultando em lucros menores. fazendo um lucro maior, neste caso, os preços das ações vão subir
> O Fed está recentemente aumentando as taxas para destruir a demanda e forçar as empresas a diminuir seus preços e, finalmente, ajudar a inflação a cair.
O gráfico da taxa de juros do fed de 2010 até hoje é assim:
04: Eventos Atuais
os eventos em curso pelo país ou pelo mundo, em geral, podem ter um impacto enorme no mercado de ações também, ninguém pode negar que a pandemia do covid-19 teve um efeito negativo muito forte no mercado de ações no final de 2019 e 2020, e os motins pela igualdade nos EUA no mesmo ano,
outros eventos que afetam o preço do mercado de ações incluem guerras e ataques terroristas
Todos esses eventos devem fazer com que os preços das ações caiam drasticamente e afetem a volatilidade do mercado
Não vou coletar nenhum dado desse fator, pois exigiria muito trabalho e mais modelos para treinar para esses eventos, isso está além do escopo do que já abordamos nesta série de artigos.
05: Inflação
A inflação é o declínio do poder de compra de uma determinada moeda ao longo do tempo. Uma estimativa quantitativa da taxa em que ocorre o declínio do poder de compra pode ser refletida no aumento do nível médio dos preços de uma cesta de bens e serviços selecionados em uma economia durante um determinado período de tempo. O aumento do nível geral de preços, muitas vezes expresso em porcentagem, significa que uma unidade de moeda compra menos do que nos períodos anteriores.
Leia mais sobre a inflação aqui https://www.investopedia.com/terms/i/inflation.asp
Então, basicamente, existem dois tipos de inflação, o Core CPI e o CPI:
- Core CPI - é tudo menos os preços da energia e dos alimentos
- CPI - é tudo dentro da economia; energia, preços dos alimentos, educação, entretenimento, etc. Tudo o que existe no dia a dia das pessoas de uma economia específica
Como a inflação corrói o valor de um dólar ganho, pode ser difícil para o mercado avaliar o valor atual das empresas que compõem os índices de mercado. Além disso, o aumento dos preços de materiais, estoque e mão de obra podem afetar os lucros à medida que as empresas se ajustam. Como resultado, os preços das ações podem flutuar, e isso causa volatilidade.
A boa notícia é que, embora o aperto do Fed possa impactar negativamente os investimentos em renda fixa, as ações historicamente se saíram bem durante esses ciclos.
Vamos olhar para o gráfico do CPI dos EUA desde 1970.
Agora, vamos coletar todos os dados necessários e armazená-los em um arquivo CSV.
Começando com a APPLE:
Coletando os dados
Os dados que vamos coletar para o nosso arquivo CSV são Core CPI, CPI, taxa de juros do Fed, LPA e P/L. Eu tenho todos esses dados disponíveis
Falta apenas um dado em nosso conjunto de dados, e essa é nossa variável dependente, mas temos apenas os valores brutos dos preços das ações. Vamos criar um script que possa nos dizer se um mês específico teve ou não um crash na bolsa
dentro do CrashClassifyScript.mq5
void DetectCrash(double &prices[], int& out_binary[]) { double prev_high = prices[0]; ArrayResize(out_binary,ArraySize(prices)-1); //we reduce the size by one since we ignore the current we predict the previous one for (int i=1; i<ArraySize(prices); i++) { int prev = i-1; if (prices[i] >= prev_high) prev_high = prices[i]; //grab the highest price double percent_crash = ((prev_high - prices[i]) / prev_high) * 100.0; //convert crash to percentage printf("crash percentage %.2f high price %.4f curr price %.4f ", percent_crash,prev_high,prices[i]); //based on the definition of a crash; markets has to fall more than 10% percent if (percent_crash > 10) out_binary[prev] = 0; //downtrend (crash) else out_binary[prev] = 1; //uptrend (no crash ) } }
se você prestar atenção no primeiro prev_high você notará que eu defini o valor do preço anterior porque eu copiei os valores da Apple de 1º de dezembro de 2009, em vez de 1º de janeiro de 2010, eu queria ter um espaço para detectar a falha no primeiro cálculo e adicionando esse mês, tornou-se possível, mas ignoramos esse mês em nosso conjunto de dados de saída porque não precisamos mais dele, é por isso que o índice prev dentro de out_binary[prev] é basicamente um i-1, porque fazemos um loop começando no índice igual a 1
aqui está a saída quando imprimimos a saída binária da matriz
CrashClassifyScript DATE 1/1/2010 TREND 1
CrashClassifyScript DATE 2/1/2010 TREND 1
.........
CrashClassifyScript DATE 4/1/2022 TREND 0
CrashClassifyScript DATE 5/1/2022 TREND 0
Ao adicionamos todas as colunas de dados para um arquivo csv em excel, resultará em um arquivo csv parecido com este
ÓTIMO, agora está tudo pronto, vamos começar a trabalhar com mais código.
Todos nós sabemos que nos bastidores do nosso modelo logístico, existe um algoritmo de regressão linear e antes de podermos usar qualquer dado em um modelo linear nós temos que verificar se ele se correlaciona com a sua variável independente. Vamos, verificá-lo chamando o método corrcoeff que eu adicionei à nossa Biblioteca LinearRegression, criada no artigo anterior.
dentro do TestScript.mq5
m_lr = new CMatrixRegression; Print("Matrix multiple regression"); m_lr.Init(8,"2,4,5,6,7",file_name,",",0.7); m_lr.corrcoeff(); m_lr.MultipleMatLinearRegMain(); delete m_lr;
A saída certamente será:
Matriz de regressão múltipla
TestScript Init, number of X columns chosen =5
TestScript "2" "4" "5" "6" "7"
TestScript All data Array Size 740 consuming 52 bytes of memory
TestScript Correlation Coefficients
TestScript Independent Var Vs Trend = 0.225
TestScript Independent Var Vs CPI = -0.079
TestScript Independent Var Vs Core CPI = -0.460
TestScript Independent Var Vs EPS($) = -0.743
TestScript Independent Var Vs PE Ratio = -0.215
Parece que todos os dados que eu acabei de coletar em lugares diferentes não se correlacionam com o preço da ação, apesar de muitas pessoas online gritarem que esses são os fatores que afetam o mercado de ações, entendo que as fontes deram um aviso inicialmente que não há um indicador claro de como os mercados fazem o que fazem, mas os números para um modelo linear mostrar uma história muito diferente, por exemplo, o CPI versus o preço da Apple, eu esperava ter uma correlação negativa muito forte aqui, mas parece que a correlação é muito fraca para ser usada em regressão linear, apenas o Core CPI está mostrando uma correlação negativa promissora de cerca de -0,46. O mais forte de todos é o LPA (Lucro por ação) mostrando a correlação negativa de cerca de 0,743 que pode ser convertida em -74,3%
Não vamos parar por aí, é super importante visualizar os dados em python e verificar se está faltando algo nos números ou em nossos cálculos:
saída
Acho que até este ponto, está muito claro que não há uma relação muito forte entre a maioria dos dados que coletamos, vamos filtrar os nossos dados,
Nós vamos usar apenas as três variáveis independentes para construir o nosso modelo que são,
- Core CPI (corresponde cerca de -46%, próximo da metade)
- LPA (corresponde cerca de -74,2%, melhor correlacionado do que todos os dados)
- Por último, a taxa de juros do FED (corresponde a cerca de -33%, a menor correlacionada. Eu não recomendaria isso quando você está construindo um modelo sério)
Ok, agora vamos inicializar a nossa biblioteca apenas com as colunas que queremos:
log_reg.Init(file_name,delimiter,2,"3,5,6",0.7);
Para aqueles que perderam a funcionalidade básica da regressão logística devem consultar este Artigo.
Melhorias adicionais na biblioteca
//These should be called before the Init void FixMissingValues(string columns); void LabelEncoder(string columns, string members);
os modelos logísticos são sensíveis a valores ausentes e por ser um modelo classificador de aprendizado de máquina, ele trata os dados zerados que podem indicar que os dados estão faltando como uma classe de classificação, ele também pode tratar os valores nan e strings como zeros dependendo de como lemos os arquivos em MQL5, por isso eu fiz algumas melhorias na biblioteca,
A função para substituir os valores ausentes pela média e a função para codificar as strings em rótulos,
essas funções devem ser chamadas antes da função Init
Agora nossa biblioteca de logística herda, os componentes de nossa biblioteca MatrixRegression que criamos no Artigo anterior
class CLogisticRegression: protected CMatrixRegression
vamos para a parte boa e ver o quão bom é o nosso modelo,
A saída será
Confusion Matrix [ 0 13 ] [ 0 31 ] Tested model accuracy =0.7045
A precisão do nosso modelo é de 70,45% no conjunto de dados de teste 😲 Estou pasmo neste momento
Eu pensei que por causa da desvantagem dos dados que eu tinha anteriormente eu não conseguiria atingir nem a marca de 50%, eu pensei que deveria haver um erro em algum momento até tentar a mesma coisa em python apenas para obter o mesmo resultado
B A M
tenha em mente que nossa variável dependente é a coluna Trend que nós coletamos com o nosso script para detectar a falha, no início deste artigo, a coluna price foi usada apenas para mostrar os coeficientes de correlações para os nossos modelos lineares, porque não podemos usar os valores binários de 0 e 1 que indicam a tendência para baixo e para cima, respectivamente. Para encontrar as correlações, é necessário utilizar os preços reais da ação
Agora, vamos mudar o foco para a NETFLIX
Aqui está como os números do coeficiente de correlação se parecem para este irmão aqui,
Correlation Coefficients Independent Var Vs Trend = 0.071 Independent Var Vs rate (FEDs rate) = 0.310 Independent Var Vs CPI = 0.509 Independent Var Vs Core CPI = 0.607 Independent Var Vs EPS = 0.917 Independent Var Vs PE Ratio = -0.213
Parece que a maioria dos fatores que nós discutimos abaixo afeta a NETFLIX positivamente apenas o P/L que foi negativa, o fator mais forte foi o lucro por ação (LPA) com correlação de cerca de 92% com o preço das ações, os outros foram o core CPI e CPI, então para a NETFLIX nós vamos usar apenas os três dados para construir o nosso modelo:
- LPA
- Core CPI
- e CPI
Vamos visualizar novamente os nossos dados.
Parece muito melhor no NETFLIX do que na Apple da última vez,
Resumindo,
log_reg = new CLogisticRegression(); Print("NETFLIX"); file_name = "Netflix Dataset.csv"; log_reg.Init(file_name,delimiter,2,"4,5,6",0.7); log_reg.LogisticRegressionMain(accuracy); printf("Tested model accuracy =%.4f",accuracy); delete log_reg;
a saída
FN 0 07:54:45.106 TestScript NETFLIX PN 0 07:54:45.108 TestScript ==== TRAINED LINEAR REGRESSION MODEL COEFFICIENTS ==== ED 0 07:54:45.108 TestScript [ RO 0 07:54:45.108 TestScript 1.43120 -0.05632 -0.54159 0.48957 EE 0 07:54:45.108 TestScript ] CQ 0 07:54:45.108 TestScript columns = 4 rows = 1 PH 0 07:54:45.108 TestScript ========= LINEAR REGRESSION MODEL TESTING STARTED ========= QP 0 07:54:45.108 TestScript Tested Linear Model R square is = -0.35263665822405277 GR 0 07:54:45.108 TestScript Confusion Matrix EE 0 07:54:45.108 TestScript [ 0 18 ] HN 0 07:54:45.108 TestScript [ 0 26 ] MJ 0 07:54:45.108 TestScript Tested model accuracy =0.5909
Apesar de ter dados com forte correlação linear com o preço das ações, o modelo da NETFLIX tem uma precisão menor de cerca de 60% em comparação com a precisão do modelo da Apple, que é de 70%. Você pode brincar com o restante do conjunto de dados por conta própria e ver como o modelo pode ficar
Testes do mercado de ações em tempo real
para poder testar no mercado em tempo real dentro do nosso Expert Advisor nós precisamos fazer algumas modificações em nossa função LogisticRegression principal, precisamos fazer com que a função armazene os valores previstos com as suas respectivas datas em um arquivo CSV que usaremos na estratégia do testador para obter os sinais para onde o mercado irá de acordo com o nosso modelo.
Aqui está como nós vamos reunir os dados e armazená-los em um arquivo csv:
WriteToCSV(TestPredicted,dates,"Predicted "+m_filename,m_delimiter);
Lembre-se, nós estamos apenas coletando os resultados do conjunto de dados de teste.
Aqui está uma breve visão de como os dados são armazenados em um arquivo csv:
NETFLIX Predicted, date_time 1,8/1/2018 1,9/1/2018 1,10/1/2018 1,11/1/2018 1,12/1/2018 1,1/1/2019 APPLE Predicted, date_time 1,9/1/2018 1,10/1/2018 1,11/1/2018 1,12/1/2018 1,1/1/2019 1,2/1/2019
Se você prestou atenção na parte da matriz de confusão, você notará que o nosso modelo é um bom preditor da tendência ascendente, O TP (verdadeiro positivo teve um grande número de todas as linhas da matriz na Matrix).
EA que testa o preço das ações em tempo real
O primeiro passo para criar o nosso EA é coletar os dados do nosso arquivo CSV, mas antes disso, nós queremos que o nosso testador de estratégia saiba que nós usaremos esse arquivo durante o teste.
#property tester_file "Predicted Apple Dataset.csv"
Agora, apenas uma breve visão geral das funções que eu codifiquei e as chamei na função OnInit
GetColumnDatatoArray(1,Trend); GetColumnDatatoArray(2,dates);
Essas funções são muito comuns, nós as usamos muito em nossa biblioteca, basicamente nós coletamos os dados da primeira coluna e os armazenamos na matriz Trend[], o mesmo processo se aplica para a matriz dates[].
A próxima coisa importante é converter, a hora que nós reunimos de um arquivo csv para um formato de hora padrão que pode ser entendido em MQL5
ConvertTimeToStandard();
Segue abaixo o que tem dentro dessa função:
void ConvertTimeToStandard() { // A one time attempt to convert the date to yy.mm.dd ArrayResize(date_datetime,ArraySize(dates)); for (int i=0; i<ArraySize(dates); i++) { StringReplace(dates[i],"/","."); //replace comma with period in each and every date //Print(dates[i]); string mm_dd_yy[]; ushort sep = StringGetCharacter(".",0); StringSplit(dates[i],sep,mm_dd_yy); //separate month, day and year //Print("mm dd yy date format"); //ArrayPrint(mm_dd_yy); string year = mm_dd_yy[2]; string day = mm_dd_yy[1]; string month = mm_dd_yy[0]; dates[i] = year+"."+month+"."+day; //store to a yy.mm.dd format date_datetime[i] = StringToTime(dates[i]); //lastly convert the string datetime to an actual date and time } }
Essas são as funções que eu acho que vale a pena explicar, o que foi feito na função Init().
A próxima coisa é testar as previsões do modelo na função Ontick, aqui está o pilar do nosso Expert Advisor:
datetime today[1]; int trend_signal = -1; //1 is buy signal 0 is sell signal CopyTime(Symbol(),PERIOD_D1,0,1,today); if (isNewBar()) for (int i=0; i<ArraySize(date_datetime); i++) { if (today[0] == date_datetime[i]) //train in that specific day only { if ((int)Trend[i] == 1) trend_signal = 1; else trend_signal = 0; // close all the existing positions since we are coming up with new data signals ClosePosByType(POSITION_TYPE_BUY); ClosePosByType(POSITION_TYPE_SELL); break; } if (MQLInfoInteger(MQL_TESTER) && today[0] > date_datetime[ArrayMaximum(date_datetime)]) { Print("we've run out of the testing data, Tester will be cancelled"); ExpertRemove(); } } //--- Time to trade MqlTick tick; SymbolInfoTick(Symbol(),tick); double ask = tick.ask , bid = tick.bid; //--- if (trend_signal == 1 && PositionCounter(POSITION_TYPE_BUY)<1) { m_trade.Buy(Lots,Symbol(),ask,0,0," Buy trade "); ClosePosByType(POSITION_TYPE_SELL); //if the model predicts a bullish market close all sell trades if available } if (trend_signal == 0 && PositionCounter(POSITION_TYPE_SELL)<1) { m_trade.Sell(Lots,Symbol(),bid,0,0,"Sell trade"); ClosePosByType(POSITION_TYPE_BUY); //vice versa if the model predicts bear market } }
O principal motivo para eu ter escolhido treinar o modelo naquele dia específico e no manipulador de eventos NewBar é para reduzir o custo de testar a nossa aplicação, para reduzir ainda mais esse custo, eu também codifiquei a condição de que o testador de estratégia deve ser interrompido assim que ficarmos sem o conjunto de dados de teste
É isso, veja o código completo no link abaixo, agora é hora de testar o modelo no testador de estratégia
Resultados do teste da APPLE
Gráfico
Netflix por outro lado... relatório do testador
Gráfico do testador
Ótimo, como você pode ver o modelo da Apple teve uma precisão de cerca de 70%, e fez um bom modelo preditivo até agora com um bom gráfico no testador de estratégia em comparação com a NETFLIX
Conclusão
A coisa boa sobre os modelos logísticos é que eles são fáceis de construir e treinar, mas fazem um bom trabalho na classificação de nossos dados, embora encontrar os dados a serem encontrados em nosso modelo seja algo que não deve ser dado como certo, pois está entre os passos mais cruciais que, uma vez equivocados, podem levar a um modelo ineficiente.
Você ainda pode fazer mais melhorias em nossa biblioteca e coletar os dados novamente porque eu ainda acredito que a maneira como eu coletei os dados e os classifiquei dentro do script Crashclassify não é uma maneira eficaz de observar o crash, de qualquer maneira, isso é para leitura.
Repositório do Github para este artigo com o link aqui > https://github.com/MegaJoctan/LogisticRegression-MQL5-and-python.
Traduzido do Inglês pela MetaQuotes Ltd.
Artigo original: https://www.mql5.com/en/articles/10983
- Aplicativos de negociação gratuitos
- 8 000+ sinais para cópia
- Notícias econômicas para análise dos mercados financeiros
Você concorda com a política do site e com os termos de uso