Блог им. SciFi
# БЕКТЕСТ ТОРГОВОЙ СТРАТЕГИИ НА АКЦИЯХ 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
Как видно на графике это период большого флэта.