Берем два индикатора: SMA(40) и MACD со стандартными параметрами на дневном графике. Когда сигналы двух индикаторов совпадают, покупаем или продаем. Если не совпадают — ничего не делаем.
Протестируем эту стратегию на акциях Газпрома с 2015 по 2017 год с использованием R.
Результат: эквити, дневные доходности и просадка. Как видно, в результате такой торговли мы бы потеряли 35% счета.
Код на 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
Как видно на графике это период большого флэта.