Генерация торговых сигналов и стратегий с помощью dplyr
Я недавно играл с техническими методами торговли в R.
Одна из вещей, которые я нахожу проблемой, особенно с большой высокочастотной информацией, - это генерирование вектора стратегии из вектора сигналов. Мне было интересно, если нет более быстрого способа использования dplyr
?
Давайте начнем с загрузки акций Apple и создания коротких и длинных скользящих средних
library("TTR")
library("quantmod")
library("PerformanceAnalytics")
library("dplyr")
getSymbols("AAPL", src = "google")
stock <- AAPL
stock <- window(stock['2015-10-01::2017-01-01'])
# Plot if you want to see
#lineChart(stock)
Short <- EMA(Cl(stock), n=5)
Long <- EMA(Cl(stock), n=6)
Теперь у нас есть выбранная акция, давайте сгенерируем наш сигнальный вектор, который указывает ордер на покупку и продажу, когда две скользящие средние пересекаются
# Signal
Signal <-
Lag(ifelse(
Lag(Short) < Lag(Long) & Short > Long, 1,
ifelse(
Lag(Short) > Lag(Long) & Short < Long, -1, 0)
))
Signal[is.na(Signal)] <- 0
После этого мы используем этот сигнал для построения стратегии - это та часть, которая занимает много времени в высокочастотных данных - что, очевидно, связано с for
петля
# Strategy
Strategy <- ifelse(Signal > 1, 0, 1)
for (i in 1:length(Cl(stock))) {
Strategy[i] <-
ifelse(Signal[i] == 1, 1, ifelse(Signal[i] == -1, 0, Strategy[i - 1]))
}
x <- as.numeric(Strategy$Lag.1)
x[is.na(x)] <- 0
Мой текущий подход к dplyr следующий, но он генерирует неправильную стратегию
dplyr_strat <-
Signal %>% tbl_df() %>%
mutate(Change = if_else(Lag.1 == -1, "Sell", "Buy", "NoChange") ) %>%
mutate(Strategy = ifelse(Change == "Buy", 1,
ifelse( Change == "Sell", 0,
lag(Strategy)) ) ) %>% select(Strategy)
y <- as.numeric(dplyr_strat$Strategy)
И проверить
all.equal(x,y)
1 ответ
Я согласен с комментарием epi99 о том, чтобы он соответствовал вашему первоначальному циклу for. Я использовал data.table и получил точное совпадение, см. Ниже:
## Using data.table
dt.Signal <- setDT(as.data.frame(Signal))
dt.Signal[, Strategy := ifelse(Lag.1 == 1, 1, ifelse(Lag.1 == -1, 0, lag(Strategy)))]
dt.Signal[is.na(dt.Signal)] <- 0
z <- as.numeric(dt.Signal[, Strategy])
all.equal(x,z)
Вероятно, у вас возникла проблема с логикой "Купить", "Продать" и "Без изменений"