Follow along with the video below to see how to install our site as a web app on your home screen.
Nota: This feature may not be available in some browsers.
library(PerformanceAnalytics)
library(quantmod)
library(TTR)
[COLOR="Teal"]#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;[/COLOR]
alpha <- .81
Ann <- 12
mv <- 3.5
Leva <- 1
rf <- 3
ss <- 1.2
alpha1 <- .97
[COLOR="teal"]#sec:=S&P500 MENSILE[/COLOR]
getSymbols('^GSPC', from = '1900-01-01')
sec <- to.monthly(GSPC)
[COLOR="teal"]#r:=100*Log(SEC/Ref(SEC,-1));[/COLOR]
r <- diff(log(Cl(sec))) * 100
[COLOR="Teal"]#k:=PREV*alpha+r*(1-alpha)+ss/ann;
[/COLOR]
k <- EMA(r, ratio = 1 - alpha) + ss / Ann
[COLOR="teal"]#dt:=If(r<k,1,0);[/COLOR]
dt <- ifelse(r < k, 1, 0)
[COLOR="teal"]#lpm:=(PREV*alpha +(r*dt-k)*(1-alpha));[/COLOR]
lpm <- EMA(r * dt - k, ratio = 1 - alpha)
[COLOR="teal"]#dt:=If(r>k,1,0);[/COLOR]
dt <- ifelse(r > k, 1, 0)
[COLOR="teal"]#hpm:= (PREV*alpha +Abs(k-r*dt)*(1-alpha));[/COLOR]
hpm <- EMA(abs(k - r * dt), ratio = 1 - alpha)
[COLOR="teal"]#TAR:=(hpm+lpm)+k;[/COLOR]
TAR <- hpm + lpm + k
[COLOR="teal"]#dtx:=If(Ref(tar,-1)>0,1,0);[/COLOR]
dtx <- ifelse(lag(TAR) > 0, 1, 0)
[COLOR="teal"]#dtx1:=If(Ref(tar,-1)<0,-1,0);[/COLOR]
dtx1 <- ifelse(lag(TAR) < 0, -1, 0)
[COLOR="teal"]#mr:=PREV*alpha+r*(1-alpha);[/COLOR]
mr <- EMA(r, ratio = 1 - alpha)
[COLOR="teal"]#volat:=Sqr(Power(PREV,2)*(alpha)+(1-alpha)*Power(r-mr,2));[/COLOR]
volat <- sqrt(EMA((r - mr) ^ 2, ratio = 1 - alpha))
[COLOR="teal"]#volat:=mv/(volat*Sqr(ann));[/COLOR]
volat <- mv / volat * sqrt(Ann)
[COLOR="teal"]#osa:=If(TAR*volat<0,0,tar*volat);[/COLOR]
osa <- ifelse(TAR * volat < 0, 0, TAR * volat)
[COLOR="teal"]#osa:=PREV*alpha1+(If(osa>leva,leva,osa))*(1-alpha1);[/COLOR]
osa <- EMA(ifelse(osa > Leva, Leva, osa), ratio = 1 - alpha1)
[COLOR="teal"]#r:=100*Log(C/Ref(C,-1)) -----> C=DAX MENSILE[/COLOR]
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]
[COLOR="teal"]#equity:=Cum(r*Ref(osa,-1)*dtx+r*Ref(osa,-1)*dtx1+(rf/ann)*(1-Ref(osa,-1)));[/COLOR]
returns <- na.omit(r * lag(osa) * dtx + r * lag(osa) * dtx1 + rf / Ann * (1- lag(osa)))
equity <- cumsum(returns)
[COLOR="teal"]# *********************************
# Performance analysis
# *********************************[/COLOR]
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)
Analisi di sensitività di Omega(0.03) al parametro che regola il periodo delle EMA.la base è la classica media exp a 10 mesi (200 gg circa)
No, no, giuro che ero sincero nella domanda: volevo capire se avevi delle considerazioni in merito...che fai, mi interroghi? ....
Sì, è corretto.Che appare il valore ottimale, quello che massimizza l'omega (se interpreto bene il tuo grafico).
Sia alpha sia ss mi preoccupano, perchè sai le perplessità che nutro sui parametri selezionati discrezionalmente ex post.Se capisco, tu supponi l'overfitting, il che potrebbe anche essere. LUI riferisce che questo valore è risultato ottimo sempre(come puoi leggere nel codice allegato al foglio). Io non ho fatto prove alternative con altre coppie di sottostanti, né ho ancora riflettuto sul problema dei parametri, che sono fondamentalmente 2: uno è appunto l'alpha, l'altro è quello shift denominato ss.
Sì, è corretto.
Sia alpha sia ss mi preoccupano, perchè sai le perplessità che nutro sui parametri selezionati discrezionalmente ex post.
Per questo mi chiedevo se esisteva una giustificazione teorica, cosa che io vedrei al limite soltanto se l'ampiezza della finestra fosse di 12 mesi e il tentativo fosse quello di togliere una eventuale e/o supposta componente stagionale dai rendimenti.
Sul DAX 0.81 è proprio il valore di alpha che massimizza Omega(0.03), anche se la sensibilità della misura non è eccessiva e questo non è un aspetto negativo.
Ora voglio torchiare un po' ss.
Sono state chieste correzioni e suggerimenti, allora ciò su cui mi concentrerei io è:
Per quanto riguarda alpha so che siete fautori dell'effetto momentum di periodicità 9 ~ 12 mesi, quindi non mi permetto di criticare pagine e pagine di studi di illustri studiosi a riguardo.
- usare la serie storica del LIBOR come proxy tempo-variante del tasso risk free, visto che peraltro è ingenuo pensare che l'azionario non risenta del livello dei tassi d'interesse. Fissare a priori un 3% significa mettersi in una condizione irrealistica, perchè il back test comprende un periodo in cui il 3% era troppo basso per essere vero e il periodo recente in cui invece per fare 3% all'anno col reddito fisso altro che risk free... La serie storica del LIBOR si trova gratuitamente in rete (FRED, per esempio);
- indagare la robustezza di ss perchè un parametro scelto così è pericoloso e sospetto. Se guardi l'immagine che ti allego, però, vedi che la sensibilità di Omega(0.03) al variare di ss è molto bassa in un intorno di 1.2 (che resta comunque un valore "fortunato" rispetto ad altri).
Queste le mie prime considerazioni a caldo, preso atto che non si desidera lasciar fare alla formulazione "da manuale" del modello TAR la scelta di soglia e parametri in modo autonomo ad ogni iterazione.
P.S.: anche se non sono un esperto di analisi di robustezza dei parametri dei TS, direi che c'è: al 101% over fitting quando basta variare di poco i parametri e si creano profili a "montagne russe" con valori positivi alti e altri negativi magari contigui; al 80 ~ 90% over fitting se c'è un profilo molto irregolare; un rischio basso o moderato o accettabile di over fitting se tutto sommato cambia poco o nulla.
Usare una serie realistica di tassi di interesse rf è un passo che mi sono ripromesso più volte. Poi è la pigrizia che mi ha sempre frenato. Basterebbe crearne una una volta per tutte, e poi si pesca sempre da quella per ogni simulazione. Questo mi pare anche più importante se si ragiona di size variabile, perché il rf è parte integrante e continua della strategia.
getSymbols('USD3MTD156N', src = 'FRED', from = '1950-01-01')
rf <- Cl(to.monthly(USD3MTD156N))
Perchè non lasciare la serie storica così com'è?Hai visto come cambiano i tassi? Forse per semplicità si potrebbe interpolare con una media, ma dal 2010 rf ~ 0%
Per l'EUR?Qual'è oggi il rf? (ma free...)
Usando la leva suggerita, cioè 0.33, usiamo quel TS e ci mettiamo in una condizione un po' fantasiosa ma non inverosimile: invece di ipotizzare che, dal 1990 ad oggi, siamo sempre riusciti ad avere a disposizione un 3% su base annua privo di rischio, immaginiamo di aver avuto a disposizione il LIBOR 3M in ogni istante, proprio come una banca anglosassone (niente battute sulla manipolazione ).- Il risk free è molto alto, e allora potrei dire: chi me lo fa fare di rimanere al 30% investito in azioni?
Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec GDAXI.Close
1991 0.8 2.3 0.1 1.7 1.8 -0.8 0.4 0.8 -0.3 -0.1 0.1 0.1 7.0
1992 1.9 1.1 -0.1 0.5 1.3 -0.5 2.3 -1.0 1.4 0.7 1.1 0.2 9.2
1993 0.6 2.0 0.2 -0.7 0.1 1.2 1.8 2.2 -0.2 2.3 0.1 2.8 13.0
1994 -0.9 -0.9 -0.3 -1.1 1.6 1.5 -1.1 1.0 -1.9 1.0 0.1 -0.2 -1.0
1995 1.3 1.3 -1.6 1.5 1.3 0.3 1.9 0.6 -0.2 0.2 1.2 0.5 8.4
1996 2.7 0.4 0.5 0.5 0.7 0.5 -0.6 -0.4 1.4 0.4 2.1 0.7 9.4
1997 1.7 2.3 1.7 0.4 1.3 1.9 4.7 -2.9 2.0 -2.5 -1.2 2.1 11.8
1998 1.7 1.9 2.7 0.4 2.8 2.0 0.2 -5.3 2.5 -0.9 2.3 0.2 10.7
1999 1.2 -1.1 0.1 3.1 -1.4 2.0 -1.2 -0.6 1.0 -1.5 2.1 4.8 8.6
2000 -0.1 -2.5 0.5 -0.2 -0.6 1.2 1.5 0.2 -1.1 -0.5 2.9 0.2 1.3
2001 -0.8 2.2 1.6 -1.1 0.7 0.0 0.9 2.5 3.5 -0.8 -1.4 0.7 8.2
2002 -0.1 -0.1 1.4 -1.2 1.0 1.8 3.1 0.1 5.0 -2.0 1.0 -2.2 7.8
2003 -0.8 1.4 0.9 3.4 0.3 1.4 1.5 0.1 -1.2 2.3 0.6 1.2 11.6
2004 0.6 -0.1 -0.8 0.8 -0.3 0.8 -0.8 0.8 -0.5 -0.2 1.0 0.8 2.1
2005 0.2 0.7 0.2 1.0 -1.1 0.8 1.6 0.0 1.2 -0.3 -0.9 1.2 4.8
2006 1.4 0.8 1.0 0.5 -1.0 0.4 0.4 -0.3 0.9 1.3 0.5 1.4 7.4
2007 1.0 0.1 1.0 2.0 1.9 0.7 -1.0 0.2 -0.3 0.8 -0.1 -0.3 6.0
2008 3.9 0.5 0.9 -1.1 0.6 -2.0 0.0 0.4 2.2 3.2 1.4 -0.4 9.7
2009 1.9 2.1 -0.9 2.7 0.7 -0.4 1.9 0.5 0.8 -0.9 0.8 1.2 10.6
2010 -1.2 0.0 2.0 0.0 -0.6 0.0 -0.6 -0.8 -1.0 1.2 0.3 0.7 0.0
2011 0.5 0.6 -0.7 1.5 -0.7 0.3 -0.7 4.9 1.1 -2.4 -0.2 -0.7 3.6
2012 2.1 1.4 0.3 -0.6 -1.8 -0.5 1.3 0.7 0.9 0.2 -0.7 NA 3.2
........
Non so come finiremo il 2012, ma, per un sistema come questo, la gestione del tasso privo di rischio è tutto fuorchè un dettaglio.
Il benchmark a mio avviso ideale per questo genere di strategie è la vecchia "zero coupon strategy" tanto cara a certi gestori, cioè quella strategia che prevede di partizionare il capitale tra reddito fisso a basso rischio ed equity di modo che gli interessi coprano la massima perdita accettabile.Eh lo sò.....
Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec ClCl.DAX
1992 NA NA NA NA NA NA NA NA NA NA 0.5 0.3 0.8
1993 0.3 0.6 0.3 0.1 0.3 0.5 0.5 0.6 0.2 0.6 0.3 0.9 5.2
1994 0.0 0.0 0.4 0.7 -0.1 0.0 0.8 0.6 -0.3 0.6 0.4 0.7 4.1
1995 0.2 0.8 -0.2 0.8 0.7 0.4 0.9 0.5 0.3 0.4 0.7 0.5 6.2
1996 1.0 0.4 0.5 0.5 0.5 0.5 0.2 0.8 1.0 0.4 1.4 0.6 8.1
1997 1.1 1.7 1.5 0.4 1.2 1.7 4.4 -2.2 1.0 -0.4 0.8 0.8 12.5
1998 0.7 0.8 0.9 0.5 1.0 0.8 0.4 -0.7 0.1 0.6 0.7 0.4 6.3
1999 0.5 0.3 0.4 0.7 0.2 0.6 0.3 0.6 0.4 0.8 0.8 1.3 7.1
2000 0.3 1.5 0.4 0.3 0.2 0.2 0.9 0.6 -0.1 0.9 -0.4 0.6 5.5
2001 0.8 -0.1 0.1 0.7 0.2 0.3 0.2 -0.1 -0.3 0.3 0.3 0.2 2.6
2002 0.1 0.1 0.3 0.1 0.1 0.0 0.0 0.2 -0.1 0.2 0.2 0.0 1.2
2003 0.1 0.1 0.1 0.2 0.1 0.1 0.1 0.1 0.1 0.2 0.1 0.1 1.4
2004 0.1 0.1 0.1 0.1 0.1 0.2 0.0 0.1 0.2 0.2 0.3 0.3 1.9
2005 0.2 0.4 0.2 0.0 0.7 0.5 0.7 0.2 0.7 0.1 0.8 0.8 5.4
2006 0.9 0.6 0.7 0.5 -0.3 0.4 0.4 0.7 0.7 0.9 0.5 0.9 7.0
2007 0.7 0.3 0.8 1.3 1.2 0.6 -0.3 0.5 0.7 0.6 0.2 0.6 7.4
2008 -1.3 0.2 0.1 0.4 0.3 0.0 0.2 0.2 0.1 -0.2 0.1 0.2 0.3
2009 0.0 0.0 0.1 0.2 0.1 0.0 0.1 0.0 0.0 0.0 0.0 0.0 0.7
2010 0.0 0.0 0.0 0.0 0.0 0.0 0.1 0.0 0.0 0.1 0.0 0.0 0.4
2011 0.0 0.0 0.0 0.1 0.0 0.0 0.0 -0.1 0.0 0.1 0.0 0.0 0.3
2012 0.1 0.1 0.0 0.0 0.0 0.0 0.1 0.0 0.0 0.0 0.0 NA 0.5