SciFi
SciFi личный блог
23 апреля 2017, 14:59

Бектест трендовой торговой системы на R

Берем два индикатора: SMA(40) и MACD со стандартными параметрами на дневном графике. Когда сигналы двух индикаторов совпадают, покупаем или продаем. Если не совпадают — ничего не делаем.

Протестируем эту стратегию на акциях Газпрома с 2015 по 2017 год с использованием R.

Бектест трендовой торговой системы на R

 

Результат: эквити, дневные доходности и просадка. Как видно, в результате такой торговли мы бы потеряли 35% счета.

Бектест трендовой торговой системы на R


Код на R:

# БЕКТЕСТ ТОРГОВОЙ СТРАТЕГИИ НА АКЦИЯХ GAZP

#system.time(source('D:/Dropbox/R/MACD-SMA-StrategyBacktest-GAZP.r'))
#Вызов этого скрипта

#install.packages("quantmod")
#install.packages("rusquant", repos="http://R-Forge.R-project.org")
#install.packages("PerformanceAnalytics")
#Установка пакетов. Она не требуется, если уже все установлено.

library(quantmod)
library(rusquant)
library(PerformanceAnalytics)
#Подключение библиотек

getwd()
#Получение рабочей папки

setwd("D:/Dropbox/R")
#Установка рабочей папки

#rm(list = ls())
#Очистка среды R от лишних переменных в памяти, если требуется

if ( dev.cur() ) {
  #dev.off()
}
#Очистка графика через выключение графического устройства R, если требуется

startDate <- as.Date('2015-01-01')
endDate <- as.Date('2017-04-23')
getSymbols('GAZP', src = 'Finam', period = 'day', from = startDate, to = endDate)

chartSeries(GAZP, subset = 'last 2 years', 
            TA = c(addMACD(), addSMA(n = 40, col = 'white')))

#Конструирование торгового правила
SMA40 <- SMA(Cl(GAZP), n = 40)
SMACross <- Cl(GAZP) - SMA40
sig1 <- ifelse(SMACross > 0, 1, -1)

MACD <- MACD(Cl(GAZP), fast = 9, slow = 16, signal = 14)
MACDCross <- MACD$macd - MACD$signal
sig2 <- ifelse(MACDCross > 0, 1, -1)

DataSet <- data.frame(Cl(GAZP), SMA40, SMACross, sig1, MACD$macd, MACD$signal, MACDCross, sig2)
DataSet <- DataSet[-c(1:40),]
colnames(DataSet) <- c('Price', 'SMA40', 'SMACross', 'sig1', 'MACD', 'MACD Signal', 'MACDCross', 'sig2')
DataSet$sig <- with(DataSet, ifelse(DataSet$sig1 * DataSet$sig2 > 0, DataSet$sig1, 0))
#Если оба сигнала совпадают, то их произведение будет больше 0, и тогда берем показание первого сигнала

bmkReturns <- dailyReturn(Cl(GAZP), type = "arithmetic")
bmkReturns <- bmkReturns[-c(1:40),]

ret <- bmkReturns*Lag(DataSet$sig, 1)
# Расчет доходностей, основанных на сигнале

#Оценка показателей системы
table.Drawdowns(ret, top=10)
table.DownsideRisk(ret)
charts.PerformanceSummary(ret)
# chart equity curve, daily performance, and drawdowns
34 Комментария
  • vito333
    23 апреля 2017, 15:06
    Мощное исследование
  • baron_samedi
    23 апреля 2017, 15:44
    спасибо за скрипты, хорошее обучение Р.
  • evgen000
    23 апреля 2017, 15:54
    лучше использовать hchart он удобнее хоть и чуть сложнее первое время.
  • Евгений Гуревич
    23 апреля 2017, 16:11
    Подскажите, на какой платформе запускаются скрипты на  R?
    • Пафос Респектыч
      23 апреля 2017, 21:27
      Евгений Гуревич, практически на любой
  • Replikant_mih
    23 апреля 2017, 16:18
    Если не обращать внимания на шлаковость тестируемой системы, то любопытно как пример того, что тестить очень легко на R с библиотеками). На Python такое сможете повторить? — посмотрел бы с утроенным интересом) 
      • Replikant_mih
        27 апреля 2017, 23:08
        SciFi, Не, ну может это вопрос вкусов, а не качества, я не настаиваю, но я просто скептически отношусь к индикаторным стратегиям — не лежит душа у меня к ним. Какие-то они искусственные, ненастоящие)
        • Sergey Pavlov
          29 апреля 2017, 11:16
          Replikant_mih, бывают неиндикаторные стратегии?
          • Replikant_mih
            29 апреля 2017, 12:17
            Sergey Pavlov, Я под индикаторными стратегиями понимаю стратегии, в которых берется предустановленный или любой другой индикатор, определенный не в коде стратегии. Да, некоторые сущности, определяемые в самой стратегии тоже можно притянуть к понятию индикатора, но в моей системе координат то, что называю индикаторной стратегией я обозначил выше. В этой системе координат да, есть неиндикаторные стратегии.
            • Sergey Pavlov
              29 апреля 2017, 13:34
              Replikant_mih, так что же это такое в вашей системе координат?
              • Replikant_mih
                29 апреля 2017, 16:21
                Sergey Pavlov, Не буду рассказывать пока, мне все говорят, что много теории, мало практики, я расстроился и замкнулся в себе))). Щас курсы по Велс-лабу допройду и погнал изыскания проводить, по-любому по ходу рисёча какие-то стратегии или мысли по идеям стратегий буду озвучивать в запале энтузиазма).
                • Sergey Pavlov
                  29 апреля 2017, 17:17
                  Replikant_mih, проблема теории в том, что теория это развитие исходных предпосылок. Не более. Если исходные предпосылки не имеют отношения к трейдингу, то все стройные правильно сделанные выводы можно выкинуть на помойку. Практика позволяет проверить, какие из предпосылок более-менее годны, а какие надо выкинуть. Если идти долго теоретически, то время будет потеряно. Нужно двигаться этапами. Немного теории, немного практики, поьом снова теория и опять практика. Потом непрерывная практика и параллельно непрерывная теория.
                  • Replikant_mih
                    29 апреля 2017, 17:20
                    Sergey Pavlov, Я согласен! Я с этим не спорю! Всё так! 
  • Андрей Зуев
    23 апреля 2017, 16:20

    Как видно на графике это период большого флэта.
    • Константин Автухов
      23 апреля 2017, 18:39
      Андрей Зуев, норм так флэт с движами по 20-30%
      • Андрей Зуев
        29 апреля 2017, 01:23
        SciFi, главное что бы кукл не догадался.)
  • r0man
    24 апреля 2017, 15:00
    Хорошее введение, но если нужно будет добавить ещё пару сигналов или стопы с тейкпрофитами, то лучше использовать пакет quantstrat.
      • Михаил Табаков
        14 декабря 2019, 01:32
        SciFi, у меня есть несколько вопросов по тестам на R, как с вами можно связаться?

Активные форумы
Что сейчас обсуждают

Старый дизайн
Старый
дизайн