Избранное трейдера Quant-Invest
Небольшая статья с ресурса http://www.talaikis.com/ о построении простой стратегии, использующую наивный байесовский классификатор при создании процесса возврата к среднему. Весь код в статье приведен на языке Python.
Это достаточно большая область исследований, но расскажем все очень кратко. Мы попытаемся найти взаимоотношение между временными сериями (в данном случае возьмем в качестве сигнала взаимный фонд XLF из финансового сектора, сдвинутый по времени на 1 день назад), а нашей целью будет фьючерс S&P500 в форме CFD. Будем входить в длинную позицию по этой бумаге при нулевой вероятности приращения. Логически нулевая вероятность ни о чем не говорит, другими словами, будем покупать возврат к среднему.
1. Получение данных
Y = read_mongo(dbase, "S&P5001440") X = read_mongo(dbase, syms[s]).shift() #готовим набор данных res = pd.concat([X.CLOSE, Y.CLOSE], axis=1, join_axes=[X.index]).pct_change().dropna() res.columns = ['X', 'Y']
Продолжаем рассуждения о долгосрочном инвестировании, которые являются плавным продолжением эпопеи про поездку Александра к дедушке Баффету
Для начала, повторю основные тезисы моего предыдущего поста
# Created by SciFi, 2016 runUnluck <- function(n) { runArray <- numeric(10000) for(i in 1:10000) { runArray[i] <- sum(rle(sample(c(-1, 1), 1000, TRUE))$lengths == n) } hist(runArray, main="Гистограмма") mean(runArray) }
> source("D:\\Dropbox\\R\\RunUnluck.r") > runUnluck(6) [1] 7.8161 > runUnluck(2) [1] 125.2208 > runUnluck(3) [1] 62.4047 > runUnluck(4) [1] 31.179 > runUnluck(5) [1] 15.6559 > runUnluck(6) [1] 7.7635 > runUnluck(7) [1] 3.8831 > runUnluck(8) [1] 1.9382 > runUnluck(9) [1] 0.9738 > runUnluck(10) [1] 0.4922
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')