# **********************************************
# QUANT_VIX Risk & Correlation Filtered
# **********************************************
# Modello: Calcolo l'asimmetria rolling a 20gg
# (un mese di borsa) circa del logrendimento
# openvix su lagged closevix.
rm(list=ls())
setInternet2(TRUE)
# Carico le librerie
require(compiler)
require(PerformanceAnalytics)
require(quantmod)
# Scarico e allineo i dati
Symbols = c("^VIX", "MDY", "TLT", "SHY")
env = new.env()
getSymbols(Symbols,env,from = "2004-01-01")
args = eapply(env, function(x){OHLC(x)})
my_data = do.call(cbind,args,envir = env)
# Calcolo il rendimento logaritmico
# del VIX chiusura (t - 1) vs.
# apertura (t) e il valore
# dell'ultima chiusura del VIX
Vix.skew = log(my_data[,"VIX.Open"] / lag(my_data[,"VIX.Close"]))
# Estraggo il prezzo di chiusura del Vix (t-1)
Vix.value = lag(my_data[,"VIX.Close"])
# Estraggo i dati per il calcolo della correlazione
Corr.data =merge.xts(ROC(my_data[,"MDY.Close"]),
ROC(my_data[,"TLT.Close"]))
# Imposto l'ampiezza in giorni della finestra mobile
slow_window_width = 20
# Imposto dei livelli di rischio
# calcolati sulla media rolling
# 20 periodi sul Close del Vix
Risk_level = 40
# Imposto un livello massimo di correlazione
Corr_level = 0
# Aggiungo il vettore dei segnali al mio data set
my_data$Slow_Skewness = rollapplyr(Vix.skew,
slow_window_width,
skewness,
na.rm = TRUE,
method = "sample",
by.column = FALSE)
# Aggiungo il vettore del rischio al mio data set
my_data$Vix_Mean = rollapplyr(Vix.value,
slow_window_width,
mean,
na.rm = TRUE,
method = "sample",
by.column = TRUE)
# Aggiungo il vettore di correlazione rolling al mio data set
my_data$Corr = rollapply(Corr.data,
slow_window_width,
function(x) cor(x[,1], x[,2]),
by.column = FALSE)
# Genero i vettori di posizione, di rischio e di correlazione.
my_data$Position = ifelse(my_data$Slow_Skewness > 0, 1, -1)
my_data$Risk_Off = ifelse(my_data$Vix_Mean < Risk_level, 0, 1)
my_data$Corr_Off = ifelse(my_data$Corr < Corr_level, 0, 1)
# Computo i rendimenti aritmetici
# sullo stock index, sui bond e sul cash.
# I due comandi seguenti mi consentono di estrarre al volo
# dal mio data set tutte le colonne che contengono le parole
# del ticker nel loro nome, quindi mi evito di
# specificare aperture, massimi, minimi etc.
my_MDY = my_data[,substr(colnames(my_data), 1, 3) == Symbols[2]]
my_TLT = my_data[,substr(colnames(my_data), 1, 3) == Symbols[3]]
my_SHY = my_data[,substr(colnames(my_data), 1, 3) == Symbols[4]]
# Calcolo rendimenti aritmetici
MDY_OC_ret = OpCl(my_MDY)
MDY_CC_ret = ClCl(my_MDY)
TLT_OC_ret = OpCl(my_TLT)
TLT_CC_ret = ClCl(my_TLT)
SHY_OC_ret = OpCl(my_SHY)
SHY_CC_ret = ClCl(my_SHY)
# Calcolo il rendimento della mia
# posizione. Anche qui l'ifelse()
# vettorizzato è la soluzione più
# comoda
# Facciamo switch tra rendimenti
# Open-to-Close e Close-to-Close
# se c'è stato un cambio segnale,
# e in base al livello di rischio
# misurato entriamo Long con 100%
# stocks o 100% cash, in caso di
# segnale Short invece entramo con
# 100% bond se la correlazione è
# sotto il limite diversamente
# 100% Cash.
R = ifelse(my_data$Position == 1,
ifelse(my_data$Position == lag(my_data$Position),
ifelse(my_data$Risk_Off == 0, MDY_CC_ret,SHY_CC_ret),
ifelse(my_data$Risk_Off == 0, MDY_OC_ret,SHY_OC_ret)),
ifelse(my_data$Position == lag(my_data$Position),
ifelse(my_data$Corr_Off == 0, TLT_CC_ret,SHY_CC_ret),
ifelse(my_data$Corr_Off == 0, TLT_OC_ret,SHY_OC_ret)))
Signals = ifelse(my_data$Position == 1,
ifelse(my_data$Position == lag(my_data$Position),
ifelse(my_data$Risk_Off == 0, 1,0),
ifelse(my_data$Risk_Off == 0, 1,0)),
ifelse(my_data$Position == lag(my_data$Position),
ifelse(my_data$Corr_Off == 0, -1,0),
ifelse(my_data$Corr_Off == 0,-1,0)))
# Analisi delle performance strategia
charts.PerformanceSummary(R, geometric=FALSE, ylog = FALSE, lwd = 1, main = "QuantVix + Risk Control")
table.AnnualizedReturns(R, scale = 252)
table.Drawdowns(R)
# Analisi delle performance comparativa B&H
rtn.obj = merge(R,MDY_CC_ret,TLT_CC_ret,SHY_CC_ret)
colnames(rtn.obj) = c("QuantVix_RCC","MDY_B&H","TLT_B&H","SHY_B&H")
charts.PerformanceSummary(rtn.obj, geometric=FALSE, ylog=FALSE,
lwd = 1, main = "QuantVix + Risk & Corr. Control")
# Salva i segnali su un file .txt
write.zoo(Signals, file="C:/Signals.txt", sep=",")