Самая обычная и распространенная ошибка в построении трендовых систем, это когда вы получаете сигнал в конце периода, но открываете/закрываете позицию в этом же периоде. Этот пост об этом.
Скачаем данные и создадим скользящую среднюю по месячным данным SP500
require(quantmod)
require(xts)
require(TTR)
require(PerformanceAnalytics)
getSymbols('^GSPC', src='yahoo', from = '1900-01-01')
monthlyGSPC <- Ad(GSPC)[endpoints(GSPC, on = 'months')]
movAvg <- SMA(monthlyGSPC, 10)
signal <- monthlyGSPC > movAvg
gspcRets <- Return.calculate(monthlyGSPC)
Далее построим две системы одна с ошибкой заглядывания, вторая корректная. Суть системы простая, месячная SMA с периодом 10, выше покупаем, ниже продаем.
lookahead <- signal * gspcRets
correct <- lag(signal) * gspcRets
И построим результаты систем, на обычной шкале, и на логарифмической.
compare <- na.omit(cbind(gspcRets, lookahead, correct))
colnames(compare) <- c("S&P 500", "Lookahead", "Correct")
charts.PerformanceSummary(compare)
rbind(table.AnnualizedReturns(compare), maxDrawdown(compare), CalmarRatio(compare))
logRets <- log(cumprod(1+compare))
chart.TimeSeries(logRets, legend.loc='topleft')
(
Читать дальше )