S.t.a.r.c.a Model

Discussione in 'Trading Systems, Econometria' iniziata da Sig. Ernesto, 20 Novembre 2012.

    20 Novembre 2012
  1. Sig. Ernesto

    Sig. Ernesto Vivace Impertinenza

    Registrato:
    20 Giugno 2001
    Messaggi:
    3.189
    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.
     
  2. 20 Novembre 2012
  3. uuu

    uuu New Member

    Registrato:
    24 Marzo 2009
    Messaggi:
    8
  4. 20 Novembre 2012
  5. Sig. Ernesto

    Sig. Ernesto Vivace Impertinenza

    Registrato:
    20 Giugno 2001
    Messaggi:
    3.189
    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)
     

    Files Allegati:

  6. 20 Novembre 2012
  7. Sig. Ernesto

    Sig. Ernesto Vivace Impertinenza

    Registrato:
    20 Giugno 2001
    Messaggi:
    3.189
    Sera a Lei uuu..

    lei fa cosine simpatiche ricordo in VB (vado a memoria..).

    Benvenuto:)


    (devo raccapezzarmi..quel codice in R messo così è orrendo..)
     
  8. 20 Novembre 2012
  9. max3001

    max3001 New Member

    Registrato:
    9 Aprile 2008
    Messaggi:
    262
    Ciao Ernesto compatibilmente con il tempo a disposizione e le limitate capacità proverò a dare una mano.
    Max
     
  10. 20 Novembre 2012
  11. reef

    reef ...

    Registrato:
    18 Giugno 2003
    Messaggi:
    4.027
    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 ;)
     
  12. 20 Novembre 2012
  13. gabo

    gabo New Member

    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::)
     
  14. 20 Novembre 2012
  15. Cren

    Cren New Member

    Registrato:
    26 Novembre 2011
    Messaggi:
    1.729
    [​IMG]
    [​IMG]

    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: 25 Novembre 2012
  16. 21 Novembre 2012
  17. Sig. Ernesto

    Sig. Ernesto Vivace Impertinenza

    Registrato:
    20 Giugno 2001
    Messaggi:
    3.189
    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 .
     

    Files Allegati:

  18. 21 Novembre 2012
  19. gabo

    gabo New Member

    Registrato:
    25 Marzo 2011
    Messaggi:
    31

Utenti che hanno già letto questo Thread (Totale: 6)

Condividi questa Pagina