Я пытаюсь протестировать доходность акций с учетом правила скользящей средней за 10 месяцев. Правило таково: если цена выше 10-месячной средней - покупайте, если ниже 10-месячной средней - сохраняйте значение постоянным.
Я знаю, как это сделать в Excel очень легко, но у меня проблемы с R.
Ниже мой подход в R:
#Downloand financial data
library(Quandl)
SPY <- Quandl("YAHOO/INDEX_GSPC", type = "xts", collapse = "monthly")
head(SPY)
#Calculate log returns
SPY$log_ret <- diff(log(SPY$Close))
#Calculate moving average for Closing price
SPY$MA.10 <- rollapply(SPY$Close, width = 10, FUN = mean)
#Create binary rule to determine when to buy and when to hold
#1 = Buy
SPY$Action <- ifelse(SPY$MA.10 < SPY$Close, 1, 0)
#Create default value in a new column to backtest returns
SPY$Hit <- 100
#Calculate cumulative returns
SPY$Hit <-ifelse(SPY$Action == 1, SPY[2:n, "Hit"] *
(1 + SPY$log_ret), lag.xts(SPY$Hit, k=1))
Возврат вычисляется правильно для действия, равного 1, но когда действие не равно 1, я обнаружил, что SPY$Hit отстает только на 1 раз, затем по умолчанию используется значение 100, в то время как я хотел бы, чтобы оно удерживало значение из последнего действия. == 1 раз.
Эта формула очень хорошо работает в MS Excel и ее очень легко реализовать, но кажется, что проблема в R заключается в том, что я не могу сохранить постоянное значение из последнего действия == 1, как я могу это сделать, чтобы я мог видеть, как хорошо эта простая торговая стратегия будет работать?
Пожалуйста, дайте мне знать, если я могу уточнить это, спасибо.
Sample of the desired output:
Action Return Answer
[1,] 0 0.00 100.00000
[2,] 1 0.09 109.00000
[3,] 1 0.08 117.72000
[4,] 1 -0.05 111.83400
[5,] 1 -0.03 108.47898
[6,] 0 -0.02 108.47898
[7,] 0 0.01 108.47898
[8,] 0 0.06 108.47898
[9,] 1 -0.03 105.22461
[10,] 0 0.10 105.22461
[11,] 1 -0.05 99.96338