A estratégia Z-Score Trend Following utiliza a pontuação Z, uma medida estatística que mede o desvio de um preço de sua média móvel, normalizada em relação ao seu desvio padrão. Esta estratégia se destaca por sua simplicidade e eficácia, particularmente em mercados onde os movimentos de preços muitas vezes voltam a uma média. Ao contrário de sistemas mais complexos que podem depender de uma infinidade de indicadores, a estratégia Z-Trend se concentra em movimentos de preços claros e estatisticamente significativos, tornando-a ideal para os traders que preferem uma abordagem simplificada e baseada em dados.
Central para esta estratégia é o cálculo da pontuação Z. Ela é derivada tomando a diferença entre o preço atual e a média móvel exponencial (EMA) do preço em um comprimento definido pelo usuário, dividindo-o pelo desvio padrão do preço no mesmo comprimento:
z = (x - μ) / σ
onde x é o preço atual, μ é a média da EMA e σ é o desvio padrão.
Os sinais de negociação são gerados com base nos limiares predefinidos de cruzamento da pontuação Z:
Estes riscos podem ser geridos e mitigados através de uma análise contínua do mercado, otimização dos parâmetros e aplicação prudente baseada em backtesting.
A estratégia Z-Score Trend Following, com sua simplicidade, robustez e flexibilidade, oferece uma perspectiva única para capturar oportunidades de tendência. Através de configurações adequadas de parâmetros, gestão prudente de riscos e otimização contínua, esta estratégia pode ser uma ferramenta poderosa para os traders quantitativos navegarem os mercados em constante mudança com confiança.
/*backtest start: 2023-04-23 00:00:00 end: 2024-04-28 00:00:00 period: 1d basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ // This Pine Script™ code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/ // © PresentTrading // This strategy employs a statistical approach by using a Z-score, which measures the deviation of the price from its moving average normalized by the standard deviation. // Very simple and effective approach //@version=5 strategy('Price Based Z-Trend - strategy [presentTrading]',shorttitle = 'Price Based Z-Trend - strategy [presentTrading]', overlay=false, precision=3, commission_value=0.1, commission_type=strategy.commission.percent, slippage=1, currency=currency.USD, default_qty_type=strategy.percent_of_equity, default_qty_value=10, initial_capital=10000) // User-definable parameters for the Z-score calculation and bar coloring tradeDirection = input.string("Both", "Trading Direction", options=["Long", "Short", "Both"]) // User selects trading direction priceDeviationLength = input.int(100, "Standard Deviation Length", step=1) // Length for standard deviation calculation priceAverageLength = input.int(100, "Average Length", step=1) // Length for moving average calculation Threshold = input.float(1, "Threshold", step=0.1) // Number of standard deviations for Z-score threshold priceBar = input(title='Bar Color', defval=true) // Toggle for coloring price bars based on Z-score // Z-score calculation based on user input for the price source (typically the closing price) priceSource = input(close, title="Source") priceZScore = (priceSource - ta.ema(priceSource, priceAverageLength)) / ta.stdev(priceSource, priceDeviationLength) // Z-score calculation // Conditions for entering and exiting trades based on Z-score crossovers priceLongCondition = ta.crossover(priceZScore, Threshold) // Condition to enter long positions priceExitLongCondition = ta.crossunder(priceZScore, -Threshold) // Condition to exit long positions longEntryCondition = ta.crossover(priceZScore, Threshold) longExitCondition = ta.crossunder(priceZScore, -Threshold) shortEntryCondition = ta.crossunder(priceZScore, -Threshold) shortExitCondition = ta.crossover(priceZScore, Threshold) // Strategy conditions and execution based on Z-score crossovers and trading direction if (tradeDirection == "Long" or tradeDirection == "Both") and longEntryCondition strategy.entry("Long", strategy.long) // Enter a long position if (tradeDirection == "Long" or tradeDirection == "Both") and longExitCondition strategy.close("Long") // Close the long position if (tradeDirection == "Short" or tradeDirection == "Both") and shortEntryCondition strategy.entry("Short", strategy.short) // Enter a short position if (tradeDirection == "Short" or tradeDirection == "Both") and shortExitCondition strategy.close("Short") // Close the short position // Dynamic Thresholds Visualization using 'plot' plot(Threshold, "Dynamic Entry Threshold", color=color.new(color.green, 50)) plot(-Threshold, "Dynamic Short Entry Threshold", color=color.new(color.red, 50)) // Color-coding Z-Score priceZScoreColor = priceZScore > Threshold ? color.green : priceZScore < -Threshold ? color.red : color.blue plot(priceZScore, "Z-Score", color=priceZScoreColor) // Lines hline(0, color=color.rgb(255, 255, 255, 50), linestyle=hline.style_dotted) // Bar Color priceBarColor = priceZScore > Threshold ? color.green : priceZScore > 0 ? color.lime : priceZScore < Threshold ? color.maroon : priceZScore < 0 ? color.red : color.black barcolor(priceBar ? priceBarColor : na)