Самая обычная и распространенная ошибка в построении трендовых систем, это когда вы получаете сигнал в конце периода, но открываете/закрываете позицию в этом же периоде. Этот пост об этом.
Скачаем данные и создадим скользящую среднюю по месячным данным 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')
График не совсем удобный, можно посмотреть доходности на логарифмической шкале.
Можно еще например при расчете скользящего среднего забыть указать fill=NA:
sma <- rollmeanr(prices, ma_periods, fill=NA)
В результате полученное среднее будет заглядывать вперед на величину периода, а эквити будет поражать воображение.
1) получить тиковые данные по инструменту (желательно с финама, но умеет ли квантмод с финамом работать?) за период N дней,
2) сформировать собственные свечки исходя из тиковых данных,
3) представить данные OHLC или хотя бы C в ts или ином векторизованном формате для работы иных пакетов (н-р, fGarch или rugarch).
Пасиб!
Имеется ввиду, что тестер получает сигнал о пересечении МА на цене закрытия, а сделка совершается по уровню МА?
Если я получаю сигнал о пересечении МА на цене закрытия и совершаю сделку по цене закрытия то тут заглядывания вроде нет.