
Esta estratégia é uma estratégia de negociação de reversão baseada no efeito da estação. Estabelece posições em um determinado mês de entrada e fechamento no mês de saída para capturar a reversão de preços causada pelo efeito da estação.
A lógica central da estratégia é a de estabelecer posições sazonais com base nos meses de entrada e saída escolhidos pelo usuário. Concretamente, se o mês atual for igual ao mês de entrada e não houver uma posição estabelecida, a entrada no mercado será feita em direção a uma posição em alta ou baixa. Se a posição já estiver estabelecida e o mês atual for igual ao mês de saída, a posição será liquidada.
Por exemplo, se você optar por entrar em outubro e sair em janeiro. Então, em outubro de cada ano, se não houver uma posição, crie uma nova posição de acordo com a direção de um a mais ou um a menos; se já houver uma posição, a posição será liquidada em janeiro de cada ano.
Note-se que a estratégia padrão é de 25% de capital de risco por transação e é calculada com uma taxa de comissão de 0,5%. Isso afeta os resultados finais.
A principal vantagem dessa estratégia é aproveitar a reversão do mercado causada pelo efeito sazonal. Muitos mercados de commodities e financeiros apresentam flutuações de preços sazonais mais evidentes. Se os horários de entrada e saída apropriados forem escolhidos, as oportunidades de reversão causadas por esse efeito sazonal podem ser efetivamente capturadas.
Além disso, a estratégia é muito simples e clara, fácil de entender e implementar, adequada para iniciantes em negociação quantitativa. Ela depende de apenas dois parâmetros, reduzindo consideravelmente a dificuldade de otimização da estratégia.
Embora a estratégia tenha sido bem-sucedida, ainda há alguns riscos. Primeiro, a escolha inadequada de entradas e saídas pode levar a perdas, não conseguindo capturar a reversão de preços; segundo, mudanças no ambiente do mercado também podem levar ao enfraquecimento do efeito sazonal; e, finalmente, a lógica de parada de perdas padrão é fraca e não consegue controlar efetivamente os perdas individuais.
Para reduzir o risco, pode-se considerar a opção de otimizar o tempo de entrada e saída do mercado, combinado com mais análise para avaliar o ambiente do mercado e definir um stop loss para controlar o risco. Claro, nenhuma estratégia de negociação pode evitar completamente o risco de mercado e os comerciantes precisam ser cuidadosos.
A estratégia também tem muitos espaços de otimização. Primeiro, é possível introduzir a lógica de stop loss, definindo uma margem de perda razoável. Em seguida, é possível testar mais combinações de entrada e saída diferentes, procurando o melhor parâmetro.
A otimização de alguns pontos acima pode melhorar ainda mais a estabilidade da estratégia e melhorar o desempenho de rastreamento da estratégia. Naturalmente, qualquer otimização requer uma verificação de feedback rigorosa para evitar otimização excessiva.
Esta estratégia de inversão sazonal é muito prática em termos de estratégia de negociação intercalar geral. Ela efetivamente captura as reversões de preços causadas pelo efeito sazonal, selecionando os meses de entrada e saída apropriados.
/*backtest
start: 2023-01-24 00:00:00
end: 2024-01-24 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/
// © EmpiricalFX
//@version=4
strategy("Seasonality Benchmark ","Season",overlay=false,default_qty_type=strategy.percent_of_equity,
default_qty_value=25,initial_capital=100000,currency="USD",
commission_type=strategy.commission.percent,commission_value=0.5)
input_entry_direction = input("Long","Position Type",options=["Long","Short"])
input_entry_month = input("Oct","Entry Month",options=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"])
input_exit_month = input("Jan","Entry Month",options=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"])
//Convert three character month string to integer
month_str_to_int(m)=>
ret = m == "Jan" ? 1 :
m == "Feb" ? 2 :
m == "Mar" ? 3 :
m == "Apr" ? 4 :
m == "May" ? 5 :
m == "Jun" ? 6 :
m == "Jul" ? 7 :
m == "Aug" ? 8 :
m == "Sep" ? 9 :
m == "Oct" ? 10 :
m == "Nov" ? 11 :
m == "Dec" ? 12 : -1
is_long = input_entry_direction == "Long" ? true : false
entry = month_str_to_int(input_entry_month)
exit = month_str_to_int(input_exit_month)
var balance = strategy.equity
//Entering a position is conditional on:
//1. No currently active trades
//2. Input entry month matches current month
if(strategy.opentrades == 0 and entry == month)
strategy.entry("Swing",is_long)
//Exiting a position is conditional on:
//1. Must have open trade
//2. Input exit month matches current month
if(strategy.opentrades > 0 and exit == month)
strategy.close("Swing")
//Update the balance every time a trade is exited
if(change(strategy.closedtrades)>0)
balance := strategy.equity
plot(strategy.equity,"Equity",color.orange)
plot(balance,"Balance",color.red)