
Эта стратегия является реверсивной торговой стратегией, основанной на сезонном эффекте. Она устанавливает позиции в определенном входящем месяце, а в выходящем месяце - плавное положение, чтобы захватить реверсию цены, вызванную сезонным эффектом.
Центральная логика этой стратегии заключается в том, чтобы создавать сезонные позиции в зависимости от выбранных пользователем месяцев входа и выхода. В частности, если текущий месяц равен месяцу входа, а позиция не создана, то вход в рынок осуществляется в направлении плюс или пустота.
Например, если вы выбираете октябрьский заход, то в октябре каждого года, если нет позиции, создается новая позиция в соответствии с многоголовым или пустым направлением; если уже есть позиция, то в январе каждого года эта позиция будет уравнена. В зависимости от такой логики можно улавливать возврат цены, вызванный сезонным эффектом.
Следует отметить, что эта стратегия по умолчанию включает в себя 25% от рискованного капитала на каждую сделку и рассчитывается по комиссии в размере 0,5%. Это может иметь определенное влияние на конечную прибыль.
Наибольшим преимуществом этой стратегии является использование рыночных обратных колебаний, вызванных сезонным эффектом, для получения прибыли. Во многих товарных и финансовых рынках существуют более заметные сезонные колебания цен.
Кроме того, стратегия очень проста, понятна и легко реализуема, и подходит для начинающих, которые хотят начать количественную торговлю. Она зависит только от двух параметров, что значительно снижает сложность оптимизации стратегии.
Несмотря на значительную эффективность этой стратегии, существуют определенные риски. Во-первых, неправильный выбор времени входа и выхода из рынка может привести к тому, что не удастся уловить ценовой поворот, что приведет к убыткам. Во-вторых, изменения в рыночной среде также могут привести к ослаблению сезонного эффекта.
Чтобы снизить риск, можно рассмотреть возможность оптимизировать время входа и выхода из рынка, в сочетании с дополнительным анализом, чтобы оценить рыночную обстановку, и установить остановку для контроля риска. Конечно, никакая торговая стратегия не может полностью избежать рыночного риска, и трейдер должен быть осторожен.
В этой стратегии есть много возможностей для оптимизации. Во-первых, можно ввести логику остановки убытков и установить разумную величину остановки убытков. Во-вторых, можно протестировать больше различных пакетов входа и выхода из рынка, чтобы найти оптимальные параметры.
Оптимизируя вышеперечисленные пункты, можно еще больше повысить стабильность стратегии и улучшить ее отслеживание. Конечно, любая оптимизация требует строгой обратной проверки, чтобы избежать чрезмерной оптимизации.
Эта сезонная обратная стратегия торговли в целом очень практична. Она эффективно улавливает ценовые обратные колебания, вызванные сезонным эффектом, выбирая подходящие месяцы входа и выхода из рынка, чтобы получать прибыль. В то же время эта стратегия очень проста, легко понятна и реализуема и подходит для начинающих в количественной торговле.
/*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)