Identificação quantitativa de estratégias de fase de acumulação


Data de criação: 2024-02-20 11:29:57 última modificação: 2024-02-20 11:29:57
cópia: 0 Cliques: 589
1
focar em
1617
Seguidores

Identificação quantitativa de estratégias de fase de acumulação

Visão geral

Esta estratégia combina o uso de médias móveis, indicadores de volume de transação e indicadores de movimento de preços para criar um conjunto de regras de quantificação para identificar o momento em que as ações entram na fase de acumulação. Nessa fase, as ações geralmente estão em um estado de equilíbrio e acúmulo de preços, oferecendo uma boa oportunidade de entrada de preços mais baixos.

Princípio da estratégia

A estratégia usa as médias móveis simples de 50, 90 e 200 dias para determinar a tendência dos preços. Um sinal de compra só é gerado quando o preço está acima da linha de 200 dias. Isso pode filtrar a incerteza da queda da grande tendência.

Além de determinar a tendência principal, a estratégia também determina a sequência de médias de curto prazo para confirmar a tendência. Concretamente, é julgar que a linha de 50 dias é maior do que a linha de 90 dias.

A estratégia combina o indicador de volume de transação PVT e o indicador de volume de transação MACD para julgar a característica cumulativa com base na confirmação de grandes tendências e tendências de curto prazo na média móvel. Um sinal de compra é gerado somente quando o PVT se rompe para cima, a linha MACD está acima da linha de sinal e o volume de transação é amplificado.

Vantagens estratégicas

Em vez de usar apenas a média móvel, esta estratégia, ao mesmo tempo em que confirma a tendência, também examina as características do volume de transações. Isso permite determinar com mais precisão o momento em que as ações entram na fase de acumulação, garantindo a vantagem de preço da entrada.

Através da análise de múltiplos prazos, esta estratégia combina o julgamento de tendências de médio e longo prazo com o julgamento de características de curto prazo, e a correspondência de prazos permite reduzir a incerteza causada por erros de julgamento de um único prazo.

Riscos e soluções

Esta estratégia baseia-se principalmente no julgamento da linha de equilíbrio, que é invalidado quando os preços são fortemente flutuantes. Neste caso, o tamanho da posição deve ser reduzido ou a saída deve ser interrompida diretamente.

Além disso, o julgamento na fase de acumulação pode ser errado, perdendo a oportunidade de reverter. Isso precisa ser confirmado por observação de mais indicadores de características.

Otimização de ideias

Esta estratégia pode introduzir algoritmos de aprendizagem de máquina para realizar julgamentos automáticos de fases de acumulação por meio de extração de características e treinamento de modelos. Isso pode reduzir as limitações causadas por um limite de configuração manual.

Além disso, a estratégia também pode experimentar a função breakpoint, que permite alternar automaticamente entre diferentes parâmetros em diferentes cenários de mercado, o que torna a estratégia mais robusta.

Resumir

Esta estratégia, em geral, usa uma abordagem que combina preços e volume de transação para determinar a característica da acumulação de ações. Ao mesmo tempo em que confirma a direção geral, explora oportunidades de acumulação de curto prazo.

Código-fonte da estratégia
/*backtest
start: 2023-02-13 00:00:00
end: 2024-02-19 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © stocktechbot

//@version=5
strategy("Accumulate", overlay = true)
lookback = input(defval = 21, title = 'Lookback')
offset = input.int(title="Offset", defval=0, minval=-500, maxval=500)
//SMA Tredline
out = ta.sma(close, 200)
outf = ta.sma(close, 50)
outn = ta.sma(close, 90)
outt = ta.sma(close, 21)
//sma plot
plot(out, color=color.blue, title="MA200", offset=offset)
plot(outf, color=color.maroon, title="MA50", offset=offset)
plot(outn, color=color.orange, title="MA90", offset=offset)
plot(outt, color=color.olive, title="MA21", offset=offset)

//MarketCap Calculation
//MarketCap = 0.0
//TSO = request.financial(syminfo.tickerid, "TOTAL_SHARES_OUTSTANDING", "FQ", ignore_invalid_symbol = true)


//if str.tostring(TSO) != 'na'
//    if ta.barssince(TSO != TSO[1] and TSO > TSO[1])==0
//        MarketCap := TSO * close
//       
//    if barstate.islast and MarketCap == 0
//        runtime.error("No MarketCap is provided by the data vendor.")
//    
//momlen = 100
//msrc = MarketCap
//mom = msrc - msrc[momlen]
//plotmom = if (mom > mom[1])
//    true
//else
//   false

//OBV with sma on macd
obv = ta.cum(math.sign(ta.change(close)) * volume)
smoothingLength = 5
smoothingLine = ta.sma(obv,5)
[macdLine, signalLine, histLine] = ta.macd(ta.pvt, 12, 26, 9)
sellvolhigh = macdLine < signalLine
buyvolhigh = macdLine > signalLine
//Buy Signal
mafentry =ta.sma(close, 50) > ta.sma(close, 90)
//matentry = ta.sma(close, 21) > ta.sma(close, 50)
matwohun = close > ta.sma(close, 200)
higheshigh = ta.rising(high, 2)
higheslow = ta.rising(low, 2 )
twohunraise = ta.rising(out, 2)
//highvol =  ta.crossover(volume, ta.sma(volume, lookback))
highvol = ta.rising(volume,2)
fourlow = ta.lowest(close, lookback)
fourhig = ta.highest(close, lookback)
change =  (((fourhig - fourlow) / fourlow) * 100) <= 30
green = close > open
allup = false
lineabove = ta.cross(close, ta.sma(close, input(defval = 21, title = 'Entry Line')))
if matwohun and mafentry and higheshigh and twohunraise and buyvolhigh
//if higheshigh and higheslow and highvol
    allup := true

plotshape(allup, style=shape.arrowup,location=location.belowbar, color=color.green, title = "Buy Signal")

barsSinceLastEntry() =>
    strategy.opentrades > 0 ? bar_index - strategy.opentrades.entry_bar_index(strategy.opentrades - 1) : na
    
//Sell Signal
mafexit =ta.sma(close, 50) < ta.sma(close, 90)
matexit = ta.sma(close, 21) < ta.sma(close, 50)
matwohund = close < ta.sma(close, 200)
linebreak = ta.sma(close, input(defval = 21, title = 'Exit Line')) > close
lowesthigh = ta.falling(high, 3)
lowestlow = ta.falling(low, 2 )
twohunfall = ta.falling(out, 3)
twentyfall = ta.falling(outt, 2)
highvole =  ta.crossover(volume, ta.sma(volume, 5))
//fourlow = ta.lowest(close, lookback)
//fourhig = ta.highest(close, lookback)
changed =  (((fourhig - close) / close) * 100) >= 10
red = close < open
atr = ta.atr(14)
//atrsmalen = int(bar_index - strategy.opentrades.entry_bar_index(strategy.opentrades - 1) )
atrsmalen = barsSinceLastEntry()
atrsma = false
atrlen = 5
if str.tostring(atrsmalen) != 'NaN' and atrsmalen > 0
    atrlen := atrsmalen

    
atrsma := atr > ta.sma(atr,50)


alldwn = false
if sellvolhigh and lowestlow and (close < close[1] and close < open)
//if higheshigh and higheslow and highvol
    alldwn := true

plotshape(alldwn, style=shape.arrowdown,location=location.abovebar, color=color.red, title = "Sell Signal")


longCondition = ta.crossover(ta.sma(close, 14), ta.sma(close, 28))
if (allup)
    strategy.entry("My Long Entry Id", strategy.long)

shortCondition = ta.crossunder(ta.sma(close, 14), ta.sma(close, 28))
if (alldwn)
    strategy.entry("My Short Entry Id", strategy.short)