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?

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

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