[COLOR=Teal]# **************************************************************************
# Esempio di apply.rolling()
# by Cren
# **************************************************************************
# Carico i package richiesti[/COLOR]
require(quantmod)
require(PerformanceAnalytics)
require(timeSeries)
[COLOR=Teal]# Scarico la serie storica di 'SPY' e selezioni i prezzi di chiusura[/COLOR]
getSymbols('SPY', from = '1950-01-01')
C <- SPY[,4]
[COLOR=Teal]# Creo la prima media mobile a decomposizione trend/stagionalità scrivendo
# una funzione che prenda in input una serie storica, la decomponga e
# restituisca l'ultimo valore del trend[/COLOR]
stl.ma <- function(x) {
Yt <- ts(as.vector(log(x)), frequency = 252)
Tt <- stl(x = Yt, s.window = 'periodic')$time.series[,2]
exp(Tt[length(Tt)])
}
[COLOR=Teal]# Creo la seconda media mobile scrivendo una funzione che prenda in input
# una serie storica, ne estragga il trend e restituisca la media mobile
# semplice che più si avvicina al trend[/COLOR]
best.ma <- function(x) {
Yt <- ts(as.vector(log(x)), frequency = 252)
Tt <- stl(x = Yt, s.window = 'periodic')$time.series[,2]
fun <- function(n) {
sum(na.omit(Tt - runMean(x = Yt, n = n, cumulative = FALSE))^2)
}
fvalues <- NULL
for(i in 1:20) {
fvalues[i] <- fun(i * 10)
}
ind <- which(fvalues == min(fvalues))
b.ma <- runMean(x = Yt, n = ind * 10, cumulative = FALSE)
exp(b.ma[length(b.ma)])
}
[COLOR=Teal]# Uso apply.rolling() per fare un back test visivo di queste funzioni su
# finestra mobile... Se le funzioni sono molto complesse questi comandi
# possono richiedere diversi minuti di elaborazione[/COLOR]
ma1 <- apply.rolling(R = C, width = 505, trim = TRUE, FUN = stl.ma)
ma2 <- apply.rolling(R = C, width = 505, trim = TRUE, FUN = best.ma)
[COLOR=Teal]# Visualizzo i risultati[/COLOR]
plot(col = c(8,2,3), format = '%Y', ylab = '', as.timeSeries(cbind(C, ma1, ma2)), plot.type = 's', log = 'y', main = '', lwd = c(1,2,2)) ; grid(20,20) ; legend('bottomright', legend = c('Daily SPY', 'Seasonal/Trend Decomposition Moving Average', 'Most similar-to-trend Moving Average'), lwd = rep(2,3), col = c(8,2,3), bty = 'n')