Criado na década de 50 pelo americano George Lane, o indicador Estocástico faz parte da família dos osciladores de momento, muito utilizados como sinalizadores de reversão de tendência na análise técnica.
Na prática, o Estocástico mede a relação entre o preço atual com as máximas e mínimas de um período pré-determinado. Originalmente, utilizava-se 14 períodos, mas atualmente tornou-se comum sua utilização em intervalos mais curtos, como em uma janela de 8 períodos.
Dito isso, nós definimos o conceito de Estocástico Rápido (%K), usualmente acompanhado de sua média móvel aritmética de n períodos (%D).
Essas curvas são calculadas da seguinte maneira:
%K=(Max(n)−Min(n)PA−Min(n))∗100
%D=MMA(%K,n)
PA = Preço Atual; Min(n) = Mínima em n períodos; Max(n) = Máxima em n períodos; MMA = Média Móvel Aritmética.
Estocástico Lento
Para calcular o Estocástico Lento, tudo que precisamos fazer é calcular a média móvel aritmética das curvas acima. Ou seja, %KL=%D. Matematicamente:
%KL=MMA(%K,3)=%D
%DL=MMA(%D)
Dessa forma, o Estocástico Lento suaviza as oscilações de preço e, por conta disso, é bastante utilizado entre traders.
Além disso, análogo ao IFR, esse indicador também varia em uma escala de 0 a 100, apresentando regiões que caracterizam estados de sobrecompra e sobrevenda (tipicamente acima de 80 e abaixo de 20).
Agora que nós já vimos o conceito de Estocástico e suas variações, vamos criar uma função, em Python, para calculá-lo em apenas 3 passos:
1. Calcular o Estocástico Rápido; 2. Calcular o Estocástico Lento; 3. Criar a função juntando os passos acima.
Simples assim, vamos trabalhar!
Calculando o Estocástico Rápido
Calcularemos as curvas %K e%D, que caracterizam o estocástico rápido, a partir das fórmulas descritas anteriormente. Mas para isso, precisamos importar as bibliotecas de interesse e baixar os dados necessários.
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import yfinance as yf
Faremos o download das colunas com o preço de fechamento ajustado, máximas e mínimas de um ativo qualquer (VVAR3), dentro de um período de 1 ano (01/01/2020 - 31/12/2020).
[*********************100%***********************] 1 of 1 completed
High
Low
Adj Close
Date
2020-01-02
11.760000
11.23
11.730000
2020-01-03
12.000000
11.47
11.480000
2020-01-06
11.680000
11.20
11.480000
2020-01-07
11.650000
11.42
11.650000
2020-01-08
11.830000
11.45
11.600000
...
...
...
...
2020-12-22
16.450001
15.86
15.940000
2020-12-23
16.580000
15.71
16.129999
2020-12-28
16.700001
16.00
16.590000
2020-12-29
16.840000
16.48
16.580000
2020-12-30
16.780001
16.16
16.160000
247 rows × 3 columns
Para o cálculo da curva %K, precisamos primeiro isolar as máximas e mínimas do período escolhido. Isto é, a cada linha isolaremos o valor máximo da coluna High e o mínimo da coluna Low dentre as nnn linhas anteriores.
Utilizaremos a função rolling que faz essa seleção de uma janela móvel, especificada pelo argumento nnn, associada às funções max e min. A janela escolhida foi de 8 períodos.
n = 8
n_highest_high = df["High"].rolling(n).max()
n_lowest_low = df["Low"].rolling(n).min()
Agora basta inseri-los na fórmula do Estocástico e teremos os valores para curva %K do estocástico rápido.
Com os valores de %K definidos, podemos calcular a média móvel aritmética para obtermos %D. A função utilizada para isso é a mesma (rolling), dessa vez associada à função mean.
Feito isso, removeremos todas as linhas contendo NaN.
O Estocástico Lento é ainda mais simples de se calcular, uma vez que ele é oriundo das curvas do estocástico rápido.
Como visto anteriormente, a curva %K lento (%KL) nada mais é do que a curva suavizada através da média móvel de %K rápido (%K). Em outras palavras, %KL é igual a %D rápido (%D).
A curva %D lento (%DL), por sua vez, nada mais é do que a média móvel aritmética de %KL.
Assim como fizemos no artigo do IFR, nós podemos plotar o estocástico juntamente com o gráfico do preço de fechamento.
Faremos isso através da função plot_stochastic, que recebe como argumento apenas o dataframe que contém as colunas necessárias (Adj Close, Slow %K e Slow %D).
Finalmente, podemos juntar tudo que fizemos até agora em uma função stochastic, que retornará o dataframe selecionado com as colunas %K, %D, Slow %K e Slow %D.
Essa função receberá 3 argumentos:
df: o dataframe que se deseja adicionar as colunas acima (lembrando que ele deve conter as colunas High, Low e Adj Close);
k_window: janela móvel que se deseja calcular o estocástico (será de 8 períodos, por padrão);
mma_window: janela móvel que se deseja calcular média móvel aritmética (será de 3 períodos, por padrão).
[*********************100%***********************] 1 of 1 completed
High
Low
Adj Close
%K
%D
Slow %K
Slow %D
Date
2020-01-02
30.700001
30.309999
30.697725
NaN
NaN
NaN
NaN
2020-01-03
31.240000
30.450001
30.447742
NaN
NaN
NaN
NaN
2020-01-06
30.940001
29.950001
30.807716
NaN
NaN
NaN
NaN
2020-01-07
30.879999
30.469999
30.687725
NaN
NaN
NaN
NaN
2020-01-08
30.770000
30.240000
30.497738
NaN
NaN
NaN
NaN
...
...
...
...
...
...
...
...
2020-12-22
27.469999
27.049999
27.280001
40.641747
50.935638
50.935638
70.116206
2020-12-23
28.250000
27.350000
27.950001
76.470648
47.950126
47.950126
55.698310
2020-12-28
28.520000
28.180000
28.180000
82.999992
66.704129
66.704129
55.196631
2020-12-29
28.430000
27.990000
28.270000
87.500000
82.323547
82.323547
65.659267
2020-12-30
28.490000
28.200001
28.340000
90.999985
87.166659
87.166659
78.731445
247 rows × 7 columns
plot_stochastic(petr4_df)
Conclusão
O indicador Estocástico é amplamente utilizado em setups a fim de se beneficiar das oscilações do mercado, embarcando no início de uma perna, seja ela de alta ou de baixa.
A partir de stochastic nós podemos dar início a uma série de backtests utilizando esse indicador. A ideia é testarmos diversas estratégias em vários timeframes.
Dependendo do sistema operacional utilizado, o Estocástico demonstra tanta consistência quanto o IFR2, mas com uma média de sinais ainda maior. Então, se você gostou da série de backtests de IFR2, você não vai querer perder essa! Fique ligado na nossa newsletter ou no Telegram, nós anunciamos tudo por lá.