Este artigo é sobre as funções de banco de dados Oracle, PL / SQL, SQL, MATCH_RECOGNIZE, MODEL, agregate e pipelined.
A análise técnica (AT) dos mercados foi utilizada como área funcional. Primeiro, uma pequena e superficial nota introdutória sobre a negociação nos mercados, depois os cálculos.
Análise técnica - um conjunto de ferramentas para prever mudanças prováveis nos preços com base nos padrões das mudanças passadas nos preços. Teoricamente, a Análise Técnica é aplicável em qualquer mercado. Mas a análise técnica mais difundida foi em mercados livres de alta liquidez, por exemplo, em bolsas.
Muitas instruções, procedimentos e gráficos SQL foram desenvolvidos. Parte - abaixo, código completo - no GitHub no link na parte inferior do artigo.
Indicadores Técnicos de Mercado (TIRs) - gráficos adicionais para gráficos de preços,
formados com base na conversão de valores contidos no gráfico de preços base . Geralmente, esses são tipos diferentes de média (o próximo ponto do gráfico é calculado como o valor médio de um determinado número de valores de preços anteriores, por exemplo, uma média móvel), relacionamentos (o próximo ponto é o resultado da comparação de um determinado número de preços anteriores - sua diferença, derivada de uma alteração ao longo de um período) ou atrasos ( atrasos). Os indicadores mostram claramente algumas informações não óbvias contidas nas estatísticas de alterações de preço e podem formar recomendações sobre ordens de compra - COMPRA / VENDA. Os indicadores têm pelo menos um parâmetro variável, do valor em que o resultado será alterado.
Para abrir transações reais, geralmente vários indicadores são usados em combinação, além de informações adicionais, a critério do trader.Um dos princípios da análise técnica é "a história se repete": os participantes do mercado em circunstâncias semelhantes se comportam aproximadamente da mesma maneira, formando uma dinâmica semelhante de mudanças de preço. E é natural supor que o comportamento do mercado no futuro repita principalmente os padrões que surgiram no passado. Após esta declaração, o investidor pode escolher entre os possíveis parâmetros TIR aqueles que se mostraram melhores em períodos anteriores.
Este artigo cria um gráfico do desempenho comercial ao usar cada indicador no valor do parâmetro TIR, em uma representação bidimensional. Mas, de fato, construirei uma representação tridimensional para avaliar também o efeito do atraso na execução da ordem no resultado, de modo que o parâmetro será o eixo X (abcissa), o atraso será o eixo Y (ordenada), o resultado será o eixo Z (aplicável). Esta é uma tentativa de avaliar o efeito de "derrapagem", o que, infelizmente, sempre acontece. Em vez de uma "derrapagem" real ao longo do eixo Y, adio a execução da ordem de COMPRA / VENDA por um período de 1 a 5 períodos.
Se um máximo global estiver destacado neste gráfico e o próprio gráfico parecer um chapéu (em geral, é chamado de "distribuição normal", mas assume simetria estrita sobre o eixo vertical), o cone e a pirâmide também são adequados - significa que você pode escolher um determinado valor de parâmetro para isso. , que mostrará o resultado mais alto e, com esse indicador, você pode tentar negociar. Se o gráfico de desempenho, dependendo do parâmetro, se assemelhar a uma "paliçada", é impossível escolher o valor ideal do parâmetro e não faz sentido usar esse
TIR no comércio.
Podemos dizer que, neste artigo, apenas calculo a "porcentagem de acertos" dos indicadores. O problema, para avaliar quanto você pode "ganhar", não ousei.A conclusão bem-sucedida do teste descrito é um dos fatores necessários, mas não suficientes, para uma negociação eficaz.Para informações ... Em contraste com a Análise Técnica, Análise Fundamental (AF) é um termo para designar métodos para prever o valor de mercado (troca) de instrumentos com base na análise de indicadores de desempenho financeiro e de produção.
O “valor intrínseco” da
FA na maioria dos casos não coincide com o preço das ações da empresa, que é determinado pela razão de oferta e demanda no mercado de ações. Os investidores que utilizam a
FA em suas atividades estão principalmente interessados em situações em que o "valor intrínseco" das ações da empresa excede o preço das ações na bolsa. Essas ações são consideradas subvalorizadas, o que significa que seu preço aumentará e são possíveis metas de investimento.
Um dos investidores mais conhecidos que usam a Análise Fundamental é Warren Buffett.
Confira o trailer:
https://www.youtube.com/watch?v=SqE8fnvmV1YAssim, temos duas abordagens diametralmente opostas -
AT e
FA .
A FA normalmente interessa investidores de longo prazo, AT - curto e médio prazo e é usada para transações de natureza especulativa, quando o objeto de negociação não está interessado no profissional.
E os objetivos deste artigo são dois ...
Além das discussões sobre
TA e
FA descritas acima, eu
queria explorar e mostrar os recursos do Oracle Database para realizar cálculos dos indicadores técnicos do mercado .
Apresento essas oportunidades ao julgamento dos leitores.
Se você decidir repetir meus cálculos, baixe o código do GitHub no link na parte inferior do artigo. Código verificado na versão 12.2.0.1.
Primeiro, crie objetos compartilhados. O primeiro são as tabelas e a visualização. No mesmo arquivo abaixo, há um pacote de modelagem de transações.
O segundo passo é a criação de funções que realizam o cálculo do
TIR .
O terceiro passo são os cálculos.
Todas as funções de cálculo de todos os
TIRs retornarão um cursor com os seguintes campos: STOCK_NAME, ADATE, ACLOSE (preço de fechamento do dia), AACTION (ordem de venda / compra)
O pacote contém três funções de modelagem tabular que usam um cursor de entrada das funções de cálculo
TIR descritas acima, deslocamento (atraso na execução da ordem, atraso) e capital inicial; por padrão, é de 1000 USD. As funções do pacote são chamadas assim:
select * from HABR_TRADEMODELLING_P.TRADE_LOG (cursor (select STOCK_NAME, ADATE, ACLOSE, AACTION from table (HABR_MARKETINDEXES_XXXXXXXX_F_CALC (10))), p_lag => 1) order by 1, 2; select * from HABR_TRADEMODELLING_P.CALC_ACTIONS (cursor (select STOCK_NAME, ADATE, ACLOSE, AACTION from table (HABR_MARKETINDEXES_XXXXXXXX_F_CALC (10))), p_lag => 1); select * from HABR_TRADEMODELLING_P.CALC_ACTIONS_TOTALS (cursor (select STOCK_NAME, ADATE, ACLOSE, AACTION from table (HABR_MARKETINDEXES_XXXXXXXX_F_CALC (10))), p_lag => 1);
onde XXXXXXXX é o nome do
TIR .
Todas as funções calculam o resultado da negociação sujeito a reinvestimento total dos lucros, excluindo custos e impostos de transação e excluindo inflação e desconto.A primeira função
TRADE_LOG
forma um log de transações do trader simplificado. A função permite rastrear toda a cadeia de transações. Se no final do período o investidor estiver “em títulos”, para calcular o saldo em moeda (resultado financeiro), a função simula a venda de todos os títulos pelo último preço de fechamento e forma a marca correspondente no campo IN_STOCK.
A segunda função
CALC_ACTIONS
retorna as mesmas colunas que o cursor de cálculo chamado
TIR , além de adicionar as seguintes colunas:
AACTION_LAG
(ordem com compensação),
BALANCE_CURRENCY
(saldo da conta do trader em dinheiro),
BALANCE_STOCK
(número de instrumentos em posições abertas). Dependendo do valor do campo
AACTION_LAG
, uma compra ou venda a um preço de fechamento é simulada e, portanto, o saldo na moeda e a quantidade de posições em aberto são alteradas.
Na última linha de cada instrumento, você pode ver o resultado da negociação de cada instrumento, bem como na função anterior, se o investidor estiver “em valores mobiliários”, uma venda é simulada para calcular o saldo em moeda estrangeira
A terceira função
CALC_ACTIONS_TOTALS
faz o mesmo que a segunda, mas retorna apenas a última linha - o resultado da negociação para cada instrumento. Será usado na modelagem.
Baixar dados
Os cálculos são fornecidos para esses mercados e índices: S & P500, NYSE, Brent, BTCUSD, EURUSD.
Os quatro primeiros foram baixados do Yahoo Finance, o último de outra fonte. Os resultados dos cálculos para cursos de outras fontes podem variar.
Observe que os períodos dos cursos de cada instrumento são diferentes, a saber:
- S & P500 - 03/01/1950 ... 29/01/2019, 69 anos;
- NYSE - 31/12/1965 ... 22/03/2019, 54 anos;
- Brent - 17/05/1991 ... 02/02/2019, 28 anos;
- BTCUSD - 16/07/2010 ... 29/01/2019, 9 anos;
- EURUSD - 16/02/2001 ... 27/05/2019, 18 anos.
Portanto, é impossível comparar a rentabilidade alcançada dos instrumentos entre si, mas é possível comparar a lucratividade de cada um dos instrumentos usando indicadores diferentes.
O arquivo de download (SQL * Loader) também pode ser obtido no GitHub no link na parte inferior do artigo.
Médias móveis
Existem pelo menos três tipos principais de médias móveis:
- linear (média móvel simples, SMA),
- Média Móvel Exponencial (EMA) e
- ponderada linearmente (média móvel ponderada, WMA).
Eles diferem nos pesos de suas partes constituintes. Para uma média móvel linear, os pesos são iguais; para pesos exponenciais e ponderados linearmente, eles diminuem à medida que o componente se afasta da borda direita da janela - exponencial ou linearmente.
A média móvel linear é a mais fácil de calcular. No Oracle, esta é a função
avg (VALUE) over (partition by STOCK_NAME order by ADATE rows between 9 preceding and current row)
- uma média móvel com uma janela média de 10 valores.
A média móvel linear tem desvantagens. Em primeiro lugar, essas médias respondem lentamente às reversões do mercado. Como muitos valores são calculados como média, cada um dos quais com o mesmo peso, a resposta média geralmente ocorre vários períodos de tempo após uma reversão do preço do ativo.
Além disso, a média móvel linear não é muito eficaz, porque responde ao sinal duas vezes: quando o indicador entra na janela deslizante e sai. O restante reage apenas à entrada do indicador e o remove suavemente do cálculo à medida que você se move da borda direita da janela para a esquerda.
No cálculo da
TIR , todos os três tipos de médias móveis são usados. Para exponencial e ponderada linearmente neste artigo, são desenvolvidas as funções agregadas
EMA
e
WMA
, utilizadas de forma analítica. Além disso, essas médias móveis podem ser calculadas por recursão ou modelo (frase
MODEL
).
O cálculo da EMA e WMA, sem recursão ou modelka, apenas por análises, no Oracle Database, aparentemente, é impossível.
Mas ainda há reservas em relação às médias móveis:
- quanto menor o período médio e mais sensível o método reage às curvas, mais ele fornece sinais falsos;
- quanto menor o período médio, mais sinais são gerados, maior a sobrecarga da transação, que pode se tornar muito significativa.
Indicadores Técnicos de Mercado
Para quase todos os indicadores, vários métodos de cálculo serão fornecidos: CALC - cálculo usando o código PL / SQL, SIMP - cálculo por um operador ou RECU - cálculo por recursão, AGRF - cálculo usando a função agregada, MODE - cálculo por modelo.
Existem razões para desenvolver vários métodos. Primeiramente, calculando o
TIR usando vários métodos e comparando os indicadores, se os indicadores forem iguais, você pode ter certeza de que os cálculos foram realizados corretamente (levando em consideração os diferentes métodos de arredondamento e processamento dos valores NULL e "0"). Neste artigo, compararei os hashes de amostras de diferentes métodos, garantindo a correspondência de bits e o mesmo processamento de todos os algoritmos.
Acredito que a Oracle precisa começar a desenvolver
TIR com o método SIMP - cálculo por um operador. Quando isso é feito, o oracleoide possui um algoritmo de planejamento e cálculo e pode ser facilmente transferido para PL / SQL ou para outra linguagem processual.
Observo que o método de cálculo CALC para PL / SQL aqui é mais rápido que o método SIMP (com um operador) se todo o cálculo puder ser executado em uma passagem ao longo do cursor. Mas se para o cálculo você tiver que criar tabelas ou coleções temporárias ou mais de uma passagem no cursor - acho que o método de um operador acabará sendo mais rápido e menos intensivo em recursos.
Para todos os métodos, incluindo o método SIMP (“um operador”), colocarei os operadores em funções para que o cálculo possa ser chamado com um parâmetro para selecionar o valor ideal.
Os cálculos são apresentados para sete
TIRs : interseção da média móvel (EMASIMPLE), cruzes de ouro e morte (CROSSES), volume de balanço (OBV), canal de Keltner (KELTNER), tendência de preço e volume (PVT), indicador de facilidade de movimento de armas (EMV) ), Índice de Canais de Mercadorias (CCI).
Para os sete indicadores desses dois artigos, haverá um parâmetro "tamanho médio da janela" e o segundo parâmetro - shift (lag). O turno indica quantas barras você precisa para adiar a execução da ordem de COMPRA / VENDA - quantas barras para alterar o preço de fechamento (todos os pedidos são feitos no preço de fechamento da barra). Isso é semelhante a "derrapagem", mas não é exatamente "derrapagem". A derrapagem geralmente não é a favor do cliente, e nosso atraso pode acabar sendo não a favor do cliente e a favor. No entanto, o uso da modelagem com um atraso de 1 a 5 barras para alguns indicadores mostra que a derrapagem tem um efeito significativo no resultado. E para alguns indicadores, atraso e derrapagem não são tão importantes.
Os
MATCH_RECOGNIZE
SIMP ("operador único") e RECU ("recursão") usam ativamente a frase
MATCH_RECOGNIZE
para gerar o sinal de negociação de COMPRA / VENDA com base na entrada / saída do
TIR calculado no intervalo especificado ou no seu comportamento em relação à sua média móvel.
Descrições detalhadas de todos os TIRs podem ser encontradas na Wikipedia ou no livro de Robert Colby, Encyclopedia of Technical Market Indicators.A interseção da média móvel exponencial
O método de interseção de médias móveis exponenciais é o
TIR mais simples.
O método envolve: comprar (abrir uma posição comprada) se o valor do preço ultrapassar sua média móvel exponencial de baixo para cima (ESA); vender (fechar uma posição comprada) se o preço cruzar seu ESS de cima para baixo.
As posições curtas, bem como as margens de negociação em geral, não são consideradas neste artigo.
No futuro, é esse indicador que pode ser usado como padrão para comparação com outros. Uma comparação com esse
TIR é melhor do que uma comparação com a estratégia Buy and Hold, porque essa estratégia não é lucrativa em mercados em queda.
O único parâmetro
TIR é o comprimento da média móvel.
Cálculo usando PL / SQL
create or replace function HABR_MARKETINDEXES_EMASIMPLE_F_CALC (p_averaging_window_width integer) return HABR_MARKETINDEXES_RESULT_LIST_T pipelined is l_result HABR_MARKETINDEXES_RESULT_LIST_T; EMA number; prev_EMA number; prev_TYPICAL_PRICE number; retval HABR_MARKETINDEXES_RESULT_T := HABR_MARKETINDEXES_RESULT_T (null, null, null, null, null, null, null, null, null); prev_STOCK_NAME varchar2(256); l_alpha number; begin l_alpha := 2 / (p_averaging_window_width + 1); for c1 in (select STOCK_NAME, ADATE, TYPICAL_PRICE, ACLOSE from LOAD_YAHOO_V order by 1, 2) loop retval.ADATE := c1.ADATE; retval.ACLOSE := c1.ACLOSE; if prev_STOCK_NAME is null or prev_STOCK_NAME <> c1.STOCK_NAME then retval.STOCK_NAME := c1.STOCK_NAME; EMA := c1.TYPICAL_PRICE; prev_EMA := null; else EMA := round (c1.TYPICAL_PRICE * l_alpha + EMA * (1 - l_alpha), 20); end if; if prev_TYPICAL_PRICE < prev_EMA and c1.TYPICAL_PRICE > EMA then retval.AACTION := 'BUY'; elsif prev_TYPICAL_PRICE > prev_EMA and c1.TYPICAL_PRICE < EMA then retval.AACTION := 'SELL'; else retval.AACTION := null; end if; retval.IND_VALUE := EMA; pipe row (retval); prev_STOCK_NAME := c1.STOCK_NAME; prev_EMA := EMA; prev_TYPICAL_PRICE := c1.TYPICAL_PRICE; end loop; end;
Cálculo por um operador recursivo
create or replace function HABR_MARKETINDEXES_EMASIMPLE_F_RECU (p_averaging_window_width integer) return HABR_MARKETINDEXES_RESULT_LIST_T is l_result HABR_MARKETINDEXES_RESULT_LIST_T; begin with T1 (STOCK_NAME, ADATE, TYPICAL_PRICE, EMA, ACLOSE, RN) as (select STOCK_NAME, ADATE, TYPICAL_PRICE, round (TYPICAL_PRICE, 20), ACLOSE, RN from LOAD_YAHOO_V where RN = 1 union all select b.STOCK_NAME , b.ADATE , b.TYPICAL_PRICE , round (b.TYPICAL_PRICE * 2 / (p_averaging_window_width + 1) + a.EMA * (1 - 2 / (p_averaging_window_width + 1)), 20) , b.ACLOSE , b.RN from T1 a, LOAD_YAHOO_V b where b.RN = a.RN + 1 and b.STOCK_NAME = a.STOCK_NAME) select HABR_MARKETINDEXES_RESULT_T (STOCK_NAME, ADATE, ACLOSE, EMA, null, null, null, null, AACTION) bulk collect into l_result from T1 match_recognize (partition by STOCK_NAME order by ADATE measures classifier() as AACTION all rows per match with unmatched rows pattern (BUY+ | SELL+) define BUY as (prev (TYPICAL_PRICE) < prev (EMA) and TYPICAL_PRICE > EMA) , SELL as (prev (TYPICAL_PRICE) > prev (EMA) and TYPICAL_PRICE < EMA) ) MR; return l_result; end;
Cálculo usando a frase MODEL
Texto da função HABR_MARKETINDEXES_EMASIMPLE_F_MODE create or replace function HABR_MARKETINDEXES_EMASIMPLE_F_MODE (p_averaging_window_width integer) return HABR_MARKETINDEXES_RESULT_LIST_T is l_result HABR_MARKETINDEXES_RESULT_LIST_T; begin with T1 as (select * from LOAD_YAHOO_V model dimension by (STOCK_NAME, RN) measures (ADATE, TYPICAL_PRICE, ACLOSE, to_number(null) as EMA) rules (EMA[any, any] = round (TYPICAL_PRICE [cv(), cv()] * 2 / (p_averaging_window_width + 1) + nvl(EMA [cv(), cv() - 1], TYPICAL_PRICE [cv(), cv()]) * (1 - 2 / (p_averaging_window_width + 1)), 20))) , T2 as (select STOCK_NAME, ADATE, ACLOSE , TYPICAL_PRICE, LAG (TYPICAL_PRICE) over (partition by STOCK_NAME order by ADATE) as PREV_TYPICAL_PRICE , EMA, lag (EMA) over (partition by STOCK_NAME order by ADATE) as PREV_EMA from T1) select HABR_MARKETINDEXES_RESULT_T (STOCK_NAME, ADATE, ACLOSE, EMA, null, null, null, null , case when prev_TYPICAL_PRICE < prev_EMA and TYPICAL_PRICE > EMA then 'BUY' when prev_TYPICAL_PRICE > prev_EMA and TYPICAL_PRICE < EMA then 'SELL' end) bulk collect into l_result from T2 order by STOCK_NAME, ADATE; return l_result; end;
Cálculo usando a função agregada
O texto da função agregada EMA e a função HABR_MARKETINDEXES_EMASIMPLE_F_AGRF create or replace type EMA_DATA_T as object (AVALUE number, AVERAGING_WINDOW integer); create or replace type EMA_IMPL_T as object ( l_window_width integer, l_ema number, static function ODCIAggregateInitialize (sctx in out EMA_IMPL_T) return number, member function ODCIAggregateIterate (self in out EMA_IMPL_T, value in EMA_DATA_T) return number, member function ODCIAggregateMerge (self in out EMA_IMPL_T, ctx2 in EMA_IMPL_T) return number, member function ODCIAggregateTerminate (self in EMA_IMPL_T, returnValue out number, flags in number) return number ); create or replace type body EMA_IMPL_T is static function ODCIAggregateInitialize (sctx in out EMA_IMPL_T) return number is begin sctx := EMA_IMPL_T (null, null); return ODCIConst.Success; end; member function ODCIAggregateIterate (self in out EMA_IMPL_T, value in EMA_DATA_T) return number is begin if value.AVALUE is not null then if l_window_width is null then l_window_width := value.AVERAGING_WINDOW; self.l_ema := value.AVALUE; else self.l_ema := round (value.AVALUE * 2 / (l_window_width + 1) + self.l_ema * (1 - 2 / (l_window_width + 1)), 20); end if; end if; return ODCIConst.Success; end; member function ODCIAggregateMerge(self in out EMA_IMPL_T, ctx2 in EMA_IMPL_T) return number is begin return ODCIConst.Error; end; member function ODCIAggregateTerminate(self in EMA_IMPL_T, returnValue out number, flags in number) return number is begin returnValue := self.l_ema; return ODCIConst.Success; end; end; create or replace function EMA (input EMA_DATA_T) return number aggregate using EMA_IMPL_T; create or replace function HABR_MARKETINDEXES_EMASIMPLE_F_AGRF (p_averaging_window_width integer) return HABR_MARKETINDEXES_RESULT_LIST_T is l_result HABR_MARKETINDEXES_RESULT_LIST_T; begin with T1 as (select STOCK_NAME, ADATE, TYPICAL_PRICE, ACLOSE , round (EMA (EMA_DATA_T (TYPICAL_PRICE, p_averaging_window_width)) over (partition by STOCK_NAME order by ADATE), 20) as EMA from LOAD_YAHOO_V) select HABR_MARKETINDEXES_RESULT_T (STOCK_NAME, ADATE, ACLOSE, EMA, null, null, null, null, AACTION) bulk collect into l_result from T1 match_recognize (partition by STOCK_NAME order by ADATE measures classifier() as AACTION all rows per match with unmatched rows pattern (BUY+ | SELL+) define BUY as (prev (TYPICAL_PRICE) < prev (EMA) and TYPICAL_PRICE > EMA) , SELL as (prev (TYPICAL_PRICE) > prev (EMA) and TYPICAL_PRICE < EMA) ) MR; return l_result; end;
Compare os resultados do cálculo com um parâmetro:
select COLUMN_VALUE as ALG, dbms_sqlhash.gethash (COLUMN_VALUE, 2) as RECORDSET_HASH from table (sys.odcivarchar2list ('select * from table (HABR_MARKETINDEXES_EMASIMPLE_F_CALC (15)) order by 1, 2' , 'select * from table (HABR_MARKETINDEXES_EMASIMPLE_F_RECU (15)) order by 1, 2' , 'select * from table (HABR_MARKETINDEXES_EMASIMPLE_F_MODE (15)) order by 1, 2' , 'select * from table (HABR_MARKETINDEXES_EMASIMPLE_F_AGRF (15)) order by 1, 2'));
Todos os hashes devem corresponder aos quatro métodos.
Se os hashes não corresponderem, você poderá descobrir exatamente onde a discrepância se formou, usando este operador (substitua os nomes das funções que deseja comparar):
select coalesce (a.STOCK_NAME, b.STOCK_NAME) as STOCK_NAME, coalesce (a.ADATE, b.ADATE) as ADATE , a.ACLOSE as CALC_ACLOSE, b.ACLOSE as AGRF_CLOSE , a.IND_VALUE as CALC_EMA, b.IND_VALUE as AGRF_EMA , a.AACTION as CALC_AACTION, b.AACTION as AGRF_AACTION from table (HABR_MARKETINDEXES_EMASIMPLE_F_CALC (15)) a full outer join table (HABR_MARKETINDEXES_EMASIMPLE_F_AGRF (15)) b on a.STOCK_NAME = b.STOCK_NAME and a.ADATE = b.ADATE
Seleção de parâmetrosO próprio
TIR usa um parâmetro, para este e para todos os outros
TIRs eu o altero no intervalo de 1 a 200, mas para calcular uma imagem tridimensional para dependência e também para o atraso, introduziremos um segundo parâmetro que varia de 1 a 5.
O operador abre 200 * 5 = 1000 cursores, portanto, o Oracle
OPEN_CURSORS pode precisar ser alterado
A consulta abaixo executa o produto cartesiano de uma tabela com números de 1 a 200, com uma tabela com números de 1 a 5, e o Cartesiano multiplica tudo isso chamando a função de tabela
HABR_TRADEMODELLING_P.CALC_ACTIONS_TOTALS
.
Após algumas manipulações adicionais no MATLAB, obteremos ainda uma matriz 200 * 5, onde nas células da matriz haverá um valor total de capital para cada valor de cada um dos dois parâmetros. Em seguida, no MATLAB, construímos uma imagem tridimensional.
rollback; delete HABR_MARKETINDEXES_PARMSEL_RESULTS where INDICATOR_NAME = 'HABR_MARKETINDEXES_EMASIMPLE_F_CALC'; commit; insert into HABR_MARKETINDEXES_PARMSEL_RESULTS (INDICATOR_NAME, PARM1, PARM2, STOCK_NAME, ADATE_MIN, ADATE_MAX, DEALS_COUNT, BALANCE_RESULT, DEALS_PROFIT_AMOUNT, DEALS_LOSS_AMOUNT, DEALS_PROFIT_COUNT, DEALS_LOSS_COUNT, IN_STOCK) with TP1 as (select rownum as PARM1 from dual connect by level <= &&AVERAGING_INTERVAL) , TP2 as (select rownum as PARM2 from dual connect by level <= &&LAG_MODELLING_DEPTH) select
Parm2, STOCK_NAME, ADATE_MIN, ADATE_MAX, DEALS_COUNT, BALANCE_RESULT, DEALS_PROFIT_AMOUNT, DEALS_LOSS_AMOUNT, DEALS_PROFIT_COUNT, DEALS_LOSS_COUNT, IN_STOCK) rollback; delete HABR_MARKETINDEXES_PARMSEL_RESULTS where INDICATOR_NAME = 'HABR_MARKETINDEXES_EMASIMPLE_F_CALC'; commit; insert into HABR_MARKETINDEXES_PARMSEL_RESULTS (INDICATOR_NAME, PARM1, PARM2, STOCK_NAME, ADATE_MIN, ADATE_MAX, DEALS_COUNT, BALANCE_RESULT, DEALS_PROFIT_AMOUNT, DEALS_LOSS_AMOUNT, DEALS_PROFIT_COUNT, DEALS_LOSS_COUNT, IN_STOCK) with TP1 as (select rownum as PARM1 from dual connect by level <= &&AVERAGING_INTERVAL) , TP2 as (select rownum as PARM2 from dual connect by level <= &&LAG_MODELLING_DEPTH) select
Todos os cálculos neste artigo são realizados lentamente, em até 20 minutos, devido à abertura de um grande número de cursores.
Também desenvolvi um método de simulação mais rápido com um cursor, sem abrir 1000 cursores, mas é tão volumoso que levaria metade do artigo. Portanto, não o trarei aqui.
O resultado da modelagem da interseção da média móvel (todos os gráficos são clicáveis):

A segunda linha de gráficos é a mesma que a primeira linha, mas os gráficos são ligeiramente girados, gráficos com atrasos diferentes são organizados um após o outro. Isso permite avaliar o efeito do atraso no resultado.
Em geral, o indicador não é muito sensível a atrasos. Para os mercados S & P500 e NYSE, o parâmetro
TIR deve ser selecionado quanto mais, melhor. Para o mercado Brent - cerca de 25. Nos outros dois mercados, não há correlação entre lucratividade e o parâmetro.
Cruzes mortais e douradas
Na implementação no Oracle, esse indicador é muito semelhante ao anterior, apenas aqui duas médias móveis são usadas, e não uma. Portanto, darei apenas uma opção de cálculo.
O Wiki descreve o indicador Ichimoku. Este é um indicador complexo. "Cruzamentos" são uma das partes constituintes. Mas o indicador é mal descrito no Wiki, em particular, observe que as linhas Tenkan e Kijun são descritas em palavras completamente diferentes, embora na verdade seja a mesma coisa, mas com períodos diferentes.
No livro de Robert Colby, esse indicador também não é descrito.
Analistas japoneses chamam a interseção de médias, quando a média de curto prazo cruza o longo prazo de baixo para cima, a Cruz de Ouro (Golden Cross) e a situação oposta, quando a média móvel de curto prazo cruza o longo prazo de baixo para baixo, é a Cruz Morta.
O autor notou que esse indicador é descrito no artigo
"Os futuros do petróleo americano formaram uma" cruz mortal "" e começaram a pesquisar sua descrição e uso.
Esse indicador é considerado sério no mercado de ações, em parte porque emite sinais raramente.
As mais usadas são as médias móveis de 50 e 200 períodos.
Ao modelar o desempenho abaixo, consideraremos o período da média móvel longa igual ao período quádruplo da média móvel curta e simularemos a duração do curto de 1 a 200 dias (será de 4 a 800 dias para o longo).
Código para cálculo no GitHub.

O indicador não é muito sensível a atrasos. Para o mercado S & P500, existem valores máximos em 48 (192 para um SS longo) e 98 dias (392 para um SS longo). Observe que o primeiro máximo está muito próximo dos números 50x200. Pode-se supor que, se você escolher esses parâmetros 1 e 2 a menos que outros participantes do mercado, poderá tentar vencê-los somente neste indicador.
Existem 4 elevações na NYSE. Nos mercados Brent e BTCUSD, o indicador não funciona.
Também para o mercado EURUSD, o parâmetro deve ser escolhido um pouco menos de 50 para um SS curto. Mas o indicador não dá lucro neste mercado. Só pode ser usado como um indicador adicional.
Volume de balanço, volume de equilíbrio, volume em balanço (OBV)
O indicador OBV é um volume de negociação médio móvel acumulado obtido com um sinal de mais no caso de um mercado em crescimento e com um sinal de menos no caso de um mercado em queda.
Aqui, usaremos este método para interpretar o valor dos indicadores: compre quando o OBV cruza sua média móvel de baixo para cima, venda quando o OBV cruza sua média móvel de cima para baixo.
Mais sobre
Wiki ou Colby

No mercado S & P500, o indicador é muito sensível a atrasos (atrasos), mas você pode tentar escolher um parâmetro no princípio de "quanto mais, melhor", é alcançada alguma lucratividade. Na NYSE, a lucratividade não pode ser alcançada. No mercado Brent, você pode selecionar um valor de parâmetro de 20 a 100. No mercado BTCUSD, não há uma relação linear clara, mas a escolha de um valor de parâmetro menor que 40 é impraticável. Para o mercado EURUSD, o valor do parâmetro deve ser escolhido "quanto mais, melhor", mas a lucratividade não pode ser alcançada.
, Keltner Channel
, . .
.
, .
: , , , .
Existem altas para os mercados S & P500 e NYSE. No mercado Brent, não há dependência do resultado em relação ao parâmetro, e todas as negociações estão com prejuízo. Existem altas no mercado de BTCUSD, mas estreitas, e é difícil entrar nelas. No mercado EURUSD, existe uma dependência do resultado no parâmetro.Tendência de preço e volume, Tendência de preço e volume, Tendência de preço e volume, PVT
PVT .
: , PVT -, , PVT -.
. .

S&P500 « , », NYSE , Brent 50, BTCUSD , 1-2, , 50-, EURUSD .
, , Arms' Ease of Movement Value, EMV
EMV — , . , .
: , EMV , , EMV .
.

S&P, NYSE , Brent . BTCUSD EURUSD .
, ommodity channel index, CCI
CCI — , .
.
: , CCI 100, , CCI 100.
.

S&P500, NYSE, Brent . BTCUSD ( ), . EURUSD .
GitHub, , ( , Yahoo Finance), , , ( , 20 ).
: . . .
Opcional:
, . . , .
Oracle Database .