Существует множество мифов о разнице между простой скользящей средней (SMA) и экспоненциальной скользящей средней (EMA) в торговле. Кто-то говорит, что экспоненциальные скользящие средние гораздо более реагируют на настроения рынка и поэтому лучше, а кто-то предпочитает простые скользящие средние, потому что экспоненциальные слишком шумные.

В этой статье я покажу вам некоторый анализ, который я провел для количественной оценки статистической разницы между ними в реальной торговле.

Аналитическая основа

Я собираюсь показать вам статистическую разницу между простой и экспоненциальной скользящей средней с одинаковой длиной, т. Е. дает ли N простая скользящая средняя статистически отличные результаты от экспоненциальной скользящей средней за тот же период при использовании в торговой стратегии .

Для этого я воспользуюсь простой торговой системой Metatrader 4, которая реализует классическую стратегию пересечения одной скользящей средней. Он открывает длинную позицию, когда цена закрытия пересекает скользящую среднюю снизу. Напротив, он открывает короткую позицию, когда цена пересекает скользящую среднюю вниз. Эта система представляет собой стратегию стоп и реверс, поэтому открытие короткой позиции означает закрытие длинной и наоборот. Таким образом, мы всегда находимся на рынке с единственной открытой позицией.

Бэктестирование торговой системы на EUR / USD будет проводиться с 1 января 2010 г. по 1 января 2018 г. на трех таймфреймах: Daily, H4 и H1. Период скользящей средней изменяется от 5 до 300 с шагом 1.

Советник сохранит все транзакции в CSV-файле, который мы будем анализировать в RStudio. Для каждой длины скользящей средней мы вычислим p-значения t-теста и теста Колмогорова Смирнова, выполненных между транзакциями стратегии SMA и транзакциями стратегии EMA в чтобы оценить разницу между ожидаемой доходностью и всем распределением вероятностей прибыли.

Торговая система с пересечением скользящих средних

Запишем наш советник Simple_vs_Exponential_MA.

Во-первых, мы должны указать внешние параметры нашего советника.

input ENUM_MA_METHOD MAType;
input int MAPeriod;
input double PositionSize;

Затем мы можем написать функцию OnTick, которая реализует нашу простую стратегию.

void OnTick()
  {
double ma = iMA(Symbol(),0,MAPeriod,0,MAType,PRICE_CLOSE,1);
  
      
   // Bullish crossover. Open long position and close short
   if (Close[1] > ma && Close[2] < ma) {
      if (OrdersTotal() == 1) {
         OrderSelect(0,SELECT_BY_POS,MODE_TRADES);
         OrderClose(OrderTicket(),PositionSize,Bid,5,NULL);
      }
      OrderSend(Symbol(),OP_BUY,
PositionSize,Ask,5,0,0,NULL,0,0,NULL);
      
     
      
   }
   
   // Bearish crossover. Open long position and close short
   if (Close[1] < ma && Close[2] > ma) {
      if (OrdersTotal() == 1) {
         OrderSelect(0,SELECT_BY_POS,MODE_TRADES);
         OrderClose(OrderTicket(),PositionSize,Ask,5,NULL);
      }
      OrderSend(Symbol(),OP_SELL,PositionSize,Ask,5,0,0,NULL,0,0,NULL);
      
   }
   
   
   
  }

Наконец, чтобы быстро собрать результаты и проанализировать их с помощью R, нам необходимо, чтобы наш советник записывал транзакции в файл в конце бэктеста. Важно записать значения MAType и MAPeriod в файл для выполнения следующего анализа.

void OnDeinit(const int reason)
  {
 
   string filename = StringFormat("transactions_%d.csv",Period());
   int f = FileOpen(filename,FILE_COMMON|FILE_CSV|FILE_READ|FILE_ANSI|FILE_WRITE|FILE_SHARE_WRITE,',');
   
   int n = OrdersHistoryTotal();
   FileSeek(f,0,SEEK_END);
for (int i = 0; i < n; i++) {
      OrderSelect(i,SELECT_BY_POS,MODE_HISTORY);
      FileWrite(f,MAType,MAPeriod,OrderTicket(),OrderProfit()+OrderSwap(),OrderCloseTime());
   }
   Print(TerminalInfoString(TERMINAL_COMMONDATA_PATH));
   FileClose(f);
  }

Каждый раз, когда мы запускаем советник с указанным таймфреймом, он добавляет транзакции в файл CSV с именем transaction_1440.csv (если мы используем дневной таймфрейм) или transaction_240.csv (для таймфрейма 4H) или transaction_60 .csv (для часового таймфрейма).

Сбор данных

Теперь мы готовы к сбору данных. Мы выполним оптимизацию в Metatrader, что представляет собой не что иное, как запуск нескольких советников с различными значениями параметров.

Мы можем настроить Тестер стратегий со следующими настройками:

Щелкнув «Свойства эксперта», мы должны проверить MAType и MAPeriod как параметры оптимизации.

После этого мы можем нажать кнопку «Старт» и повторить процедуру для таймфреймов D1, H4 и H1.

В конце процесса в каталоге общих файлов мы наконец-то найдем эти три файла.

Каждый из них представляет собой файл CSV, первое поле которого представляет собой тип скользящего среднего (0 = SMA, 1 = EMA), второе поле - длину скользящего среднего, третье поле - прибыль от транзакции, а четвертое поле - это время закрытия сделки.

Прежде чем углубиться в анализ, я хочу сказать несколько слов о статистических тестах, которые мы собираемся использовать.

Тест Колмогорова-Смирнова

KS-тест - это статистический тест, предназначенный для оценки разницы между двумя распределениями вероятностей. Они могут быть известны аналитически или могут быть рассчитаны эмпирически по двум образцам.

R имеет встроенную функцию под названием ks.test, которая выполняет статистический тест на двух выборках, предполагая в качестве нулевой гипотезы, что выборки происходят из одного и того же распределение вероятностей.

T-критерий Стьюдента

Как тест KS, t-тест полезен для определения разницы в ожидаемой доходности двух выборок. Ожидаемую доходность часто называют статистическим преимуществом, и, как я писал в предыдущей статье о соотношении риска и прибыли, это действительно важный показатель. Мы рассчитаем его с помощью R-функции t.test.

Анализ данных с помощью RStudio

Теперь мы можем открыть RStudio и изменить наш текущий рабочий каталог на каталог с файлами, сгенерированными нашим советником.

С помощью следующего кода мы создадим фрейм данных с именем results, который содержит для каждой длины скользящего среднего значения p t-теста и теста KS для ежедневных данных.

file = "transactions_1440.csv"
# Read the CSV file
  f = read.csv(file,col.names = c("MAType","MAPeriod","Ticket","Profit","CloseTime"),
header = FALSE)
  
  # Unique set of the moving averages periods
  periods = unique(f$MAPeriod)
  
  results = NULL
  
  # For each period we perform the statistical analysis
  for (period in periods) {
    cat(period,"\n")
    flush.console()
    
    # Simple moving average data with the i-th period
    simple_data = f[f$MAType == 0 & f$MAPeriod == period,"Profit"]
    
    # Exponential moving average data with the i-th period
    exp_data = f[f$MAType == 1 & f$MAPeriod == period,"Profit"]
    
    # t test
    t.test.pvalue = t.test(simple_data,exp_data)$p.value
    
    # KS test
    ks.test.pvalue = ks.test(simple_data,exp_data)$p.value
    
    # Append results in a data frame
    results = rbind(results,
data.frame(period=period,
ttest=t.test.pvalue,
kstest=ks.test.pvalue)
)
    
  }

Результаты

Если мы запустим предыдущий код на трех используемых таймфреймах и построим график полученных данных, мы получим следующие результаты:

Горизонтальная черная линия представляет уровень достоверности 5%, поэтому точки в красных прямоугольниках - это те, которые имеют значение p ниже 5%, что может считаться нашим минимальным уровень достоверности, при котором мы отклоняем гипотезу об отсутствии статистической разницы.

Как мы видим, чем выше таймфрейм, тем ниже статистическая разница между SMA и EMA (т.е. не так много пунктов ниже линии 5%). На дневном таймфрейме только периоды около 100 дают значительную разницу между SMA и EMA.

На 4-часовом таймфрейме различия становятся незначительными на длине более 150, в то время как 1-часовой период показывает высокие различия почти на всех длинах.

Хотя KS-тест оценивает различия между всеми распределениями вероятностей, важно видеть, что p-значение t-критерия (красная пунктирная линия) никогда не опускается ниже 5% -ной линии. Это отличный результат, потому что он позволяет нам сказать, что недостаточно причин полагать, что статистическое преимущество, обеспечиваемое SMA и EMA, является разные. Помните, что статистические тесты никогда полностью не принимают нулевую гипотезу.

Выводы

Мы заметили, что, несмотря на более низкий таймфрейм, существует сильная разница между транзакциями, совершенными SMA, и транзакциями, выполненными EMA, для EUR / USD в выбранный период и для стратегия пересечения с единой MA, мы не видим каких-либо доказательств разницы в статистическом преимуществе между двумя типами скользящей средней. Разница может заключаться в других характеристиках распределения вероятностей, но не в ожидаемой доходности.

Очевидно, мы должны провести этот анализ на других финансовых активах (то есть индексах, акциях, других валютных парах и т. Д.), Но я надеюсь, что это поможет немного лучше понять мифы о SMA и EMA.