S.t.a.r.c.a Model (1 Viewer)

Sig. Ernesto

Vivace Impertinenza
Registrato
20 Giugno 2001
Messaggi
3.190
Simple Threshold Autoregressive Correlation Approach.

Sequire la liquidità sfruttando la correlazione, la diversa volatilità, il reddito fisso.

Con leva massima pari a 1 tentando di ridurre, per quanto possibile, il rischio di default personale.

Buona sera a tutti,

ps: non sono proprio un nuovo "forumer", diciamo un usato ben tenuto.
 

Sig. Ernesto

Vivace Impertinenza
Registrato
20 Giugno 2001
Messaggi
3.190
Vi allego il foglio excel ove è riportato il listato originale, merito di Paolo 1956 e la traduzione per "R" fatta da Cren.

Una volta scaricato e digerito, possiamo iniziare la discussione per trovare eventuali falle e tentare di sviluppare la vocazione del modello:

un portafoglio flessibile azionario - obbligazionario che possa esprimere rendimenti positivi superiori alla componente obbligazionaria minimizzando, in virtu della correlazione negativa o nulla, i draw downs.

Io in 7 mesi di test e ricerche, non ho trovato bugs eclatanti; credo che il modello abbia potenzialità non comuni (se applicato alla componente "reddito fisso" che è la più pesante) ed una facilità di impiego imbarazzante, poichè appare egualmente valido su indici (faccio sempre l'esempio del DJES600), costituenti degli stessi, futures, ETF e, appunto, obbligazioni (scadenza più lontana che segue la scadenza leader con maggiore volatilità e rendimenti, un esempio da testare)-

E' un trend follower, con i difetti ed i pregi di un trend follower ma, con una differenza fondamentale.

Si difende molto, molto bene, se la componente più rischiosa non mostra trend definiti (non su o giù, ma su e giù ampi e possibilmente volatili), va short con pochissimi soldi (leva implicita dei rendimenti negativi solitamente più ampi dei positivi), riversa la maggiorparte del capitale in assets si crede meno rischiosi (obbligazioni) , assets che fungono da copertura margini in caso di impiego con futures (esempio).

library(PerformanceAnalytics) library(quantmod) library(TTR) #alpha:=0.81; Questo valore sembra un'ottimizzazione ma non lo è...e risulta ottimo su tutti i sottostanti che ho testato. #Ann:=12; #mv:=Input("Max Volat Richiesta:",0,500,3.5); #Leva:=Input("Leva:",0,10,1); #rf:=Input("Risk Free Disponibile:",0,100,3); #ss:=1.2; Questa è una blanda ottimizzazione..è uno shift verticale alla media che vedrai usata come soglia. #alpha1:="Frequenza Ribilanciamento Size:" = 0.97; alpha <- .81 Ann <- 12 mv <- 3.5 Leva <- 1 rf <- 3 ss <- 1.2 alpha1 <- .97 #sec:=S&P500 MENSILE getSymbols('^GSPC', from = '1900-01-01') sec <- to.monthly(GSPC) #r:=100*Log(SEC/Ref(SEC,-1)); r <- diff(log(Cl(sec))) * 100 #k:=PREV*alpha+r*(1-alpha)+ss/ann; k <- EMA(r, ratio = 1 - alpha) + ss / Ann #dt:=If(r<k,1,0); dt <- ifelse(r < k, 1, 0) #lpm:=(PREV*alpha +(r*dt-k)*(1-alpha)); lpm <- EMA(r * dt - k, ratio = 1 - alpha) #dt:=If(r>k,1,0); dt <- ifelse(r > k, 1, 0) #hpm:= (PREV*alpha +Abs(k-r*dt)*(1-alpha)); hpm <- EMA(abs(k - r * dt), ratio = 1 - alpha) #TAR:=(hpm+lpm)+k; TAR <- hpm + lpm + k #dtx:=If(Ref(tar,-1)>0,1,0); dtx <- ifelse(lag(TAR) > 0, 1, 0) #dtx1:=If(Ref(tar,-1)<0,-1,0); dtx1 <- ifelse(lag(TAR) < 0, -1, 0) #mr:=PREV*alpha+r*(1-alpha); mr <- EMA(r, ratio = 1 - alpha) #volat:=Sqr(Power(PREV,2)*(alpha)+(1-alpha)*Power(r-mr,2)); volat <- sqrt(EMA((r - mr) ^ 2, ratio = 1 - alpha)) #volat:=mv/(volat*Sqr(ann)); volat <- mv / volat * sqrt(Ann) #osa:=If(TAR*volat<0,0,tar*volat); osa <- ifelse(TAR * volat < 0, 0, TAR * volat) #osa:=PREV*alpha1+(If(osa>leva,leva,osa))*(1-alpha1); osa <- EMA(ifelse(osa > Leva, Leva, osa), ratio = 1 - alpha1) #r:=100*Log(C/Ref(C,-1)) -----> C=DAX MENSILE getSymbols('^GDAXI', from = '1990-01-01') C <- Cl(to.monthly(GDAXI)) r <- diff(log(C)) * 100 osa <- na.omit(merge(r, osa))[,2] r <- na.omit(merge(r, osa))[,1] #equity:=Cum(r*Ref(osa,-1)*dtx+r*Ref(osa,-1)*dtx1+(rf/ann)*(1-Ref(osa,-1))); returns <- na.omit(r * lag(osa) * dtx + r * lag(osa) * dtx1 + rf / Ann * (1- lag(osa))) equity <- cumsum(returns) # ********************************* # Performance analysis # ********************************* charts.PerformanceSummary(R = cbind(returns / 100, r / 100), ylog = TRUE, Rf = rf / 100, methods = 'HistoricalES', gap = 12) Omega(R = returns / 100, L = rf / 100) table.DownsideRisk(R = returns / 100, MAR = rf / (100 * 12)) table.Returns(R = returns / 100)
 

Allegati

max3001

Forumer attivo
Registrato
9 Aprile 2008
Messaggi
262
Ciao Ernesto compatibilmente con il tempo a disposizione e le limitate capacità proverò a dare una mano.
Max
 

reef

...
Registrato
18 Giugno 2003
Messaggi
4.027
Vi allego il foglio excel ove è riportato il listato originale, merito di Paolo 1956 e la traduzione per "R" fatta da Cren.
Buonasera Sig. Ernesto.
Effettivamente sono spariti i tags per inserire codice formattato, per cui suggerisco un bel file allegato "starca.r" per il codice di Cren ;)
 

gabo

Nuovo forumer
Registrato
25 Marzo 2011
Messaggi
31
Buonasera, ho aperto il file excel. Occorre segnare ogni fine mese le chiusure di SP500 e DAX e il sistema genera un segnale long (1) o short (-1).
E' corretto?
Sig. Ernesto mi spiega un esempio concreto di applicazione nel caso long e nel caso short? Se long ad esempio entro su DJES600 (relativo etf) e se short entro su obbligazionario? Che tipo di obbligazioni privilegiare?
Chiedo scusa per eventuali inesattezze dette.
A presto e grazie :up::)
 

Cren

Forumer storico
Registrato
26 Novembre 2011
Messaggi
1.729
...per cui suggerisco un bel file allegato "starca.r" per il codice di Cren ;)


library(PerformanceAnalytics)
library(quantmod)
library(TTR)

#alpha:=0.81; Questo valore sembra un'ottimizzazione ma non lo è...e risulta ottimo su tutti i sottostanti che ho testato.
#Ann:=12;
#mv:=Input("Max Volat Richiesta:",0,500,3.5);
#Leva:=Input("Leva:",0,10,1);
#rf:=Input("Risk Free Disponibile:",0,100,3);
#ss:=1.2; Questa è una blanda ottimizzazione..è uno shift verticale alla media che vedrai usata come soglia.
#alpha1:="Frequenza Ribilanciamento Size:" = 0.97;


alpha <- .81
Ann <- 12
mv <- 3.5
Leva <- 1
rf <- 3
ss <- 1.2
alpha1 <- .97

# *********************************
# Custom functions
# *********************************


EMA.ss <- function(r, alpha, ss, Ann) {

tmp <- rep(NA, length(r))
tmp[1] <- 0

for(i in 2:length(r)) {

tmp <- tmp[i-1] * alpha + r * (1 - alpha) + ss / Ann


}

tmp <- xts(tmp, index(r))
return(tmp)


}

# *********************************
# Back test code
# *********************************


#sec:=S&P500 MENSILE

getSymbols('^GSPC', from = '1900-01-01')
sec <- to.monthly(GSPC)

#r:=100*Log(SEC/Ref(SEC,-1));

r <- diff(log(Cl(sec))) * 100

#k:=PREV*alpha+r*(1-alpha)+ss/ann;

k <- EMA.ss(r, alpha, ss, Ann)

#dt:=If(r<k,1,0);

dt <- ifelse(r < k, 1, 0)

#lpm:=(PREV*alpha +(r*dt-k)*(1-alpha));

lpm <- EMA(r * dt - k, ratio = 1 - alpha)

#dt:=If(r>k,1,0);

dt <- ifelse(r > k, 1, 0)

#hpm:= (PREV*alpha +Abs(k-r*dt)*(1-alpha));

hpm <- EMA(abs(k - r * dt), ratio = 1 - alpha)

#TAR:=(hpm+lpm)+k;

TAR <- hpm + lpm + k

#dtx:=If(Ref(tar,-1)>0,1,0);

dtx <- ifelse(lag(TAR) > 0, 1, 0)

#dtx1:=If(Ref(tar,-1)<0,-1,0);

dtx1 <- ifelse(lag(TAR) < 0, -1, 0)

#mr:=PREV*alpha+r*(1-alpha);

mr <- EMA(r, ratio = 1 - alpha)

#volat:=Sqr(Power(PREV,2)*(alpha)+(1-alpha)*Power(r-mr,2));

volat <- sqrt(EMA((r - mr) ^ 2, ratio = 1 - alpha))

#volat:=mv/(volat*Sqr(ann));

volat <- mv / volat * sqrt(Ann)

#osa:=If(TAR*volat<0,0,tar*volat);

osa <- ifelse(TAR * volat < 0, 0, TAR * volat)

#osa:=PREV*alpha1+(If(osa>leva,leva,osa))*(1-alpha1);

osa <- EMA(ifelse(osa > Leva, Leva, osa), ratio = 1 - alpha1)

#r:=100*Log(C/Ref(C,-1)) -----> C=DAX MENSILE

getSymbols('^GDAXI', from = '1990-01-01')
C <- Cl(to.monthly(GDAXI))
r <- diff(log(C)) * 100
osa <- na.omit(merge(r, osa))[,2]
r <- na.omit(merge(r, osa))[,1]

#equity:=Cum(r*Ref(osa,-1)*dtx+r*Ref(osa,-1)*dtx1+(rf/ann)*(1-Ref(osa,-1)));

returns <- na.omit(r * lag(osa) * dtx + r * lag(osa) * dtx1 + rf / Ann * (1 - lag(osa)))
equity <- cumsum(returns)

# *********************************
# Performance analysis
# *********************************


charts.PerformanceSummary(R = cbind(returns / 100, r / 100), ylog = TRUE, Rf = rf / 100, methods = 'HistoricalES', gap = 12)
Omega(R = returns / 100, L = rf / 100)
table.DownsideRisk(R = returns / 100, MAR = rf / (100 * 12))
table.Returns(R = returns / 100)
 
Ultima modifica:

Sig. Ernesto

Vivace Impertinenza
Registrato
20 Giugno 2001
Messaggi
3.190
Buonasera, ho aperto il file excel. Occorre segnare ogni fine mese le chiusure di SP500 e DAX e il sistema genera un segnale long (1) o short (-1).
E' corretto?
Sig. Ernesto mi spiega un esempio concreto di applicazione nel caso long e nel caso short? Se long ad esempio entro su DJES600 (relativo etf) e se short entro su obbligazionario? Che tipo di obbligazioni privilegiare?
Chiedo scusa per eventuali inesattezze dette.
A presto e grazie :up::)
Guarda gabo, il modello Starca lo usi come desideri, io ho tutte le versioni possibili (per la sola parte equity), long short, solo long, con impostazione della leva fissa (senza ottimizzazione della size) senza riversamento in obbligazionario etc...etc..etc..

Mantiene costanti delle ottime performance in tutti i casi. Quello che cambia è il rischio, i DD sostenuti.

La versione che ho allegato è, personalmente, quella che giudico preferibile se dovesse andare in porto l'utilizzo per un fondo. E ripeto, non vi fossilizzate sul DAX che non è un granchè indicato (le medie imprese sono preferibili..), la diversificazione utilizzando indici settoriali è l'optimum.

E noi abbiamo la fortuna di avere il DJES600 disponibile (settori compresi e costituenti dei settori financo) in tutte le salse. Quindi, accertata la stabilità e consolidate le performance teoriche della strategia (si parla di backtest, robusti..molto robusti..ma sempre backtest), dalle opzioni agli ETF ai derivati di ogni tipo, non c'è limite.

Tornando alla tua domanda, la versione postata è sempre investita in obbligazioni e il sistema va long è short sul sottostante equity con peso diverso (carica più azioni in fase long e shorta con meno peso in fase short..aumentando contemporaneamente il peso obbligazionario).

Il tutto con un algoritmo piuttosto semplice come vedete..ma non per questo poco efficace.

D'altronde, la situazione negli ultimi anni è quella che allego e, diversificare non è sempre facile (e spesso diviene inutile).

Vix e Bond gli unici ad offrire un minimo di garanzia decorrelata .
 

Allegati

Users Who Are Viewing This Discussione (Users: 0, Guests: 1)

Alto