Для того, чтобы преобразовать данные ежечасно довольно легко. Существует некоторая функция в одном из количественных финансовых пакетов в R. Но я забыл, кто. Но это одна функция, которую я имел в своем распоряжении может сделать то же самое, только с небольшими изменениями.
OHLC <- функция (TTIME, tprice, tvolume, FMT) {
ttime.int <- формат (TTIME, FMT)
data.frame (время = TTIME [tapply (1: длина (TTIME), ttime.int, функция (х) {головка (х, 1)})],
mtgoxUSD.Open = tapply (tprice, ttime.int, функция (х) {головка (х, 1)}),
mtgoxUSD.High = tapply (tprice, ttime.int, макс),
mtgoxUSD.Low = tapply (tprice, ttime.int, мин),
mtgoxUSD.Close = tapply (tprice, ttime.int, функция (х) {хвост (х, 1)}),
mtgoxUSD.Volume = tapply (tvolume, ttime.int, функция (х) {сумма (х)}),
mtgoxUSD.Adjusted = tapply (tprice, ttime.int, функция (х) {хвост (х, 1)}))
}
данные <- OHLC (данные $ время, данные $ цена, данные $ объем,"% Y% м% д% Н") #converts данные в CSV к OHLC, [Ь] заметить% H [/ B]
Исходные данные взяты из bitcoincharts, а затем положить через эту функцию. Выход часовые данные.
Я также изменил код так, что только кроссоверы показывают сигналы покупки и продажи. Вот новый код для кроссовера EMA10 / ema21.
*** EDIT *** Названный график неправильно.
библиотека (quantmod)
библиотека (TTR)
# Загрузка данных отсортированы
х = последний (у, 4436) #gets последних 4436 почасовых позиций с данных
# Вычислить показатели EMA
х $ ema10 <- EMA (Cl (х), 10)
х $ ema21 <- EMA (Cl (х), 21)
х $ ema10.old = as.double (лаг (х $ ema10))
х $ ema21.old = as.double (лаг (х $ ema21))
#omit NA-х
х = na.omit (х)
# Создание длинных и коротких сигналов
sigbuy = IfElse ((х $ ema10 > х $ ema21) & (Х $ ema10.old < х $ ema21.old), 1, 0) #buy сигнала. вчерашняя EMA10 была ниже вчерашнего ЕМА21 и сегодня он перешел
sigsell = IfElse ((х $ ema10 <= Х $ ema21) & (Х $ ema10.old > х $ ema21.old), -1, 0) #sell сигнал. вчерашняя EMA10 была выше вчерашнего ЕМА21 и сегодня он перешел под
# Лаг сигналы для согласования с днями на рынке,
# Не были получены сигналы дней
sigbuy <- задержка (sigbuy, 1) # Примечание к = 1 означает движение вперед * *
sigsell <- задержка (sigsell, 1) # Примечание к = 1 означает движение вперед * *
# Заменить пропущенные сигналы без каких-либо позиций
# (Как правило, только в начале серии)
sigbuy [is.na (sigbuy)] <- 0
sigsell [is.na (sigsell)] <- 0
# Объединить оба сигнала в один вектор
сиг <- sigbuy + sigsell
# Рассчитать Закрыть закрывает возвратов
RET <- РПЦ (Cl (х))
RET [1] <- 0
# Подсчитайте кривые долевые
eq_up <- ехр (cumsum (RET * sigbuy))
eq_dn <- ехр (cumsum (RET * sigsell * -1))
eq_all <- ехр (cumsum (RET * сиг))
Диаграмма # Equity
PNG (имя файла ="emacrossnew.png", Ширина = 720, высота = 720)
plot.zoo (cbind (eq_up, eq_dn), plot.type ="Один", ylab = с ("Длинный","короткий"), Col = с ("зеленый","красный"), Основная ="EMA10 / 21 Crossover Стратегия: \ п 2011-07-23 до 2012-01-22" )
dev.off ()
# Создать диаграмму, показывающую mtgoxUSD
PNG ("EMAcrosschart-new.png", Ширина = 720, высота = 720)
ChartSeries (х, подмножество ="Последние 4415 часов", Тип ="линия")
# Добавьте общую линию справедливости и EMA линии
addEMA (п = с (10,21), Col = с ("оранжевый","синий"))
addTA (eq_all)
dev.off ()
# Оценка стратегии
# install.packages ("PerformanceAnalytics")
требуют (PerformanceAnalytics)
# кривой диаграммы капитала, ежедневная производительность и проигрыши
PNG ("производительность EMAcrossnew.png", Высота = 720, ширина = 720)
charts.PerformanceSummary (RET)
dev.off ()