Estrategia de negociación intertemporal de reversión estacional

El autor:¿ Qué pasa?
Las etiquetas:

img

Resumen general

Esta estrategia es una estrategia de negociación de reversión basada en efectos estacionales: establece posiciones en meses de entrada específicos y cierra posiciones en meses de salida para capturar las reversiones de precios causadas por efectos estacionales.

Principio de la estrategia

La lógica central de esta estrategia es establecer posiciones estacionales basadas en los meses de entrada y salida seleccionados por el usuario. Específicamente, si el mes actual es igual al mes de entrada y no se ha establecido ninguna posición, se ingresará una posición larga o corta de acuerdo con la dirección. Si la posición se ha establecido y el mes actual es igual al mes de salida, la posición se cerrará.

Cabe señalar que la estrategia por defecto arriesga el 25% de la cuenta en cada operación y cobra una comisión del 0,5% por operación.

Análisis de ventajas

La mayor ventaja de esta estrategia es sacar provecho de las reversiones del mercado causadas por efectos estacionales. Muchos mercados de materias primas y financieros tienen fluctuaciones estacionales significativas de precios. Si se seleccionan los tiempos de entrada y salida apropiados, se pueden capturar eficazmente esas oportunidades de reversión inducidas por efectos estacionales.

Análisis de riesgos

Aunque esta estrategia es eficaz, todavía hay algunos riesgos. En primer lugar, elegir tiempos de entrada y salida inadecuados puede no capturar las reversiones de precios, lo que resulta en pérdidas. En segundo lugar, los cambios en las condiciones del mercado también pueden conducir a efectos estacionales más débiles. Por último, la lógica de stop loss por defecto es débil y no puede controlar eficazmente las pérdidas de una sola operación.

Direcciones de optimización

A través de las optimizaciones anteriores, la estabilidad de la estrategia se puede mejorar aún más y la capacidad de seguimiento de la estrategia se puede mejorar.

Resumen de las actividades


/*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)

    

Más.