Surfing Correlation

@ graper

Codice:
my_data$Position = ifelse(my_data$Slow_Skewness > 0, 1, -1)

#Calcolo del numero di operazioni

#Rimuovo gli eventuali  non numeri nel vettore

tmp 	<- na.omit(my_data$Position)

#Calcolo il numero di operazioni

count	<- 0

if (tmp[1] != 0 ) count = 1

#se il passaggio long - short conta 2 operazioni:

for (i in 2:length(tmp))	{
	ad <- abs(tmp[i] - tmp[i-1])
	count <- count + ad
	}
rm(tmp)

#se invece lo vuoi contare una operazione:


for (i in 2:length(tmp))	{
	if (tmp[i] != tmp[i-1]) count = count + 1
	}
rm(tmp)

by


ps: prova a pulire il vettore corr.data dagli elementi non validi col solito na.omit()
 
Ultima modifica:
Paolo1956 ha scritto:
ps: prova a pulire il vettore corr.data dagli elementi non validi col solito na.omit()

Grazie mille per l'aiuto Paolo, OK!

alla fine sono riuscito a risolvere in un'altro modo.. il problema stava nella sintassi dato che nella funzione a quanto pare mancavano degli argomenti..

Codice:
# Codice Errato
[COLOR="Red"]my_data$Corr = rollapply(Corr.data, slow_window_width, cor, by.column = FALSE)[/COLOR]

# Codice Corretto
[COLOR="Blue"]my_data$Corr = rollapply(Corr.data, slow_window_width, function(x) cor(x[,1], x[,2]), by.column = FALSE)[/COLOR]

E grazie anche per il consiglio sull'uso del ciclo 'for' per contare i cambi di posizione..

:bow:

In proposito sto pensando di creare una funzione apposita che aggiunga un'ulteriore colonna nel vettore delle posizioni 'Signals'..
Da qui poi ottenere, attraverso altri maneggi che devo ancora studiarmi, la serie dei trades con data di apertura, data chiusura, valori, numero dell'operazione e rendimento..

:rolleyes:

NB: ho corretto il codice pubblicato nel precedente post.

Ora dato che ci sono, per i curiosi allego anche i risultati del lavoro 'finito'.

Rispetto alla QuantVix originale, come ho già spiegato nei post precedenti, ho posto due filtri, uno ai segnali Long basato sul valor medio delle ultime 20 chiusure del Vix, di modo che se risulta superiore ad un certo livello la strategia investe sul cash piuttosto che sull'indice azionario.

L'altro sui segnali short dove in caso il livello di correlazione rolling a 20 periodi tra il sottostante azionario e quello obbligazionario superi un certo valore, allora anche in questo la strategia investe sul cash piuttosto che sul sottostante obbligazionario.

I valori dei filtri utilizzati sono rispettivamente un prezzo medio di chiusura pari a '40' per il Vix e un livello di correlazione massimo tra stocks e treasuries bonds pari a '-0.40'.

Infine la finestra di calcolo dell'asimmetria rolling tra prezzi Open/Close del Vix, così come del prezzo medio di chiusura del Vix e dei livelli di correlazione tra i due asset è pari a 20 rilevazioni.

La strategia così modificata ha generato 234 cambi di segnale, investendo da feb 2004 ad oggi per il 62% del tempo sull'azionario, per il 17% sull'obbligazionario e per il 16% sul cash.

4dys.png


Codice:
> table.AnnualizedReturns(R, scale = 252)
                          Position
Annualized Return           0.1804
Annualized Std Dev          0.1582
Annualized Sharpe (Rf=0%)   1.1400
> table.Drawdowns(R)
        From     Trough         To   Depth Length To Trough Recovery
1 2008-06-06 2008-11-13 2009-08-04 -0.2186    293       113      180
2 2011-09-01 2011-10-03 2011-11-01 -0.1487     43        22       21
3 2007-06-05 2007-08-16 2008-01-22 -0.1297    160        52      108
4 2012-12-21 2013-06-24 2013-09-17 -0.1219    185       126       59
5 2010-06-16 2010-07-06 2010-08-06 -0.1071     37        14       23
>



Sig Ernesto ha scritto:
Ora, resetta tutto quello che hai fatto, che hai ipotizzato e che hai, con buona volontà e pazienza (uguali a: esperienza acquisita). Io ti chiedo: "oppure?" e ti rimando alla affermazione: "You Can't Get What You Want (Till You Know What You Want) "

Grazie per le parole di incoraggiamento, graditissime.. ;)

Resetto tutto volentieri, ho postato i grafici delle modifiche solo per non lasciare le cose a metà, ma sono pronto a ripartire da zero osservando il problema da un'altra prospettiva..

Prendendo spunto dal titolo dell'ottimo pezzo di Joe Jackson mi pare che sul 'What we want' non ci siano dubbi, l'obiettivo primario è sempre quello di migliorare il rapporto R/R della strategia senza overfittare troppo, il problema semmai è il come..

:mmmm:

In proposito l'idea che mi sono fatto lavorando sulla QuantVix è che mentre i segnali Long, filtrati o meno, sono molto buoni, quelli Short lo sono un po meno con il sottostante attuale (TLT).


6nq6.png



A questo punto mi sa che lavorare sulla scelta dei sottostanti come stai già facendo sia il modo migliore per sfruttare meglio il potenziale della QuantVix..

:yes:
 
Ultima modifica:
Dunque, problema:

programmi diversi calcolano l'asimmetria in modi diversi e i risultati sono diversi e i segnali sono diversi....(m'è toccato fare i conti a manina per capirlo....)

a ds excel, a sn R col metodo normal

:(:mmmm::mmmm:
 

Allegati

  • FOL444.jpg
    FOL444.jpg
    51,3 KB · Visite: 373
Ultima modifica:
Dunque, l'asimmetria è una proprietà geometrica. Una distribuzione o è asimmetrica o non lo è (e tutte le distribuzioni reali non lo sono). Un po' come la sfericità. Il problema è come misurarla, essendo una proprietà globale. Um metodo è ricorrere ai momenti terzi, e allora, almeno per quanto riguarda il segno ci dovrebbe essere concordanza fra le varie misure.

Però potrei usare la differenza fra media e mediana, che in una distribuzione simmetrica coincidono, e allora però il sistema di Ernesto va a farsi benedire.
 
@ Graper

Puoi anche provare a mettere una piccola soglia negativa (th < 0) per la skew. (if skew < th , 0, 1), intorno a -0,2. I risultati migliorano e il sistema sopporta benissimo lo sh di SPY (se si potesse fare....)
 
@ Graper

Puoi anche provare a mettere una piccola soglia negativa (th < 0) per la skew. (if skew < th , 0, 1), intorno a -0,2. I risultati migliorano e il sistema sopporta benissimo lo sh di SPY (se si potesse fare....)


AAPL :confused: :cool:
 
Paolo1956 ha scritto:
Puoi anche provare a mettere una piccola soglia negativa (th < 0) per la skew. (if skew < th , 0, 1), intorno a -0,2. I risultati migliorano e il sistema sopporta benissimo lo sh di SPY (se si potesse fare....)


Ottima idea Paolo OK!

In effetti porre una soglia più restrittiva al livello di asimmetria sembra migliorare complessivamente la qualità dei segnali della strategia..

Questi sono risultati lordi della QuantVix in un BT con una soglia pari a -0.2:


cc2i.png


Codice:
> table.AnnualizedReturns(R, scale = 252)
                          Position
Annualized Return           0.1929
Annualized Std Dev          0.1635
Annualized Sharpe (Rf=0%)   1.1802
> table.Drawdowns(R)
        From     Trough         To   Depth Length To Trough Recovery
1 2008-06-06 2008-11-13 2009-06-02 -0.1697    249       113      136
2 2012-12-21 2013-06-24       <NA> -0.1672    363       126       NA
3 2011-09-01 2011-10-03 2011-10-25 -0.1487     38        22       16
4 2007-02-23 2007-08-16 2007-11-06 -0.1233    179       122       57
5 2012-03-27 2012-06-04 2012-08-17 -0.1112    101        48       53
> 
> table.DownsideRisk(R)
                              Position
Semi Deviation                  0.0073
Gain Deviation                  0.0075
Loss Deviation                  0.0076
Downside Deviation (MAR=210%)   0.0120
Downside Deviation (Rf=0%)      0.0069
Downside Deviation (0%)         0.0069
Maximum Drawdown                0.1697
Historical VaR (95%)           -0.0156
Historical ES (95%)            -0.0235
Modified VaR (95%)             -0.0154
Modified ES (95%)              -0.0237
>


Riguardo invece la scelta di un sottostante idoneo per la gestione delle posizioni Short ho fatto alcune prove con l'ETF ProShares Short MidCap400 (MYY) che tra l'altro ha quotazioni che partono da giugno 2006.

Il risultato è stato comunque deludente, infatti a fronte di un leggero miglioramento del rendimento medio annuo si paga un più che proporzionale innalzamento dell'MDD che penalizza il rapporto R/R della strategia rispetto all'uso dell' ETF iShares 20+ Year Treasury Bond (TLT).

Il che pare dovuto alle maggiori perdite sui falsi segnali delle posizioni Short, che rispetto all'uso dei treasuries bonds sono molto più incisive..

:(
 
Ultima modifica:
angio ha scritto:
Così per curiosità puoi provare ad inserire AAPL al posto di MDY ? Vorrei vedere come si comporta il MaxDD

Salve angio,
mi spiace deludere le aspettative ma con il titolo Apple Inc. come sottostante il drawdown della QuantVix sale parecchio..

:(

In un BT dal 2004 ad oggi la strategia originale si becca in pieno la debacle superiore al 50% che il titolo ha registrato nel 2005, senza contare il drawdown rilevato negli ultimi due anni che ha tenuto l'equity in under-water per ben 426 giorni, praticamente da settembre 2012 ad oggi.


8o11.png


Codice:
> table.AnnualizedReturns(R, scale = 252)
                          Position
Annualized Return           0.3559
Annualized Std Dev          0.3226
Annualized Sharpe (Rf=0%)   1.1031
> table.Drawdowns(R)
        From     Trough         To   Depth Length To Trough Recovery
1 2005-02-17 2005-03-09 2007-04-30 -0.5634    552        14      538
2 2012-09-20 2013-06-27       <NA> -0.4408    426       192       NA
3 2008-05-07 2009-01-20 2009-05-04 -0.4402    250       178       72
4 2008-01-23 2008-02-07 2008-03-26 -0.2210     44        12       32
5 2007-07-27 2007-08-16 2008-01-22 -0.1983    123        15      108
>


La strategia filtrata (min. skew -0.2; max Vix 40; max corr. -0.40) è andata leggermente peggio e non ha scampato ne il forte ribasso avvenuto durante il 2005 ne le scarse performance del titolo registrate negli ultimi tempi:

p7vv.png


Codice:
> table.AnnualizedReturns(R, scale = 252)
                          Position
Annualized Return           0.3270
Annualized Std Dev          0.3162
Annualized Sharpe (Rf=0%)   1.0344
> table.Drawdowns(R)
        From     Trough         To   Depth Length To Trough Recovery
1 2005-02-17 2005-06-10 2007-01-10 -0.5656    477        79      398
2 2012-09-20 2013-06-27       <NA> -0.4480    426       192       NA
3 2008-05-14 2008-10-17 2009-08-28 -0.3151    327       110      217
4 2007-07-27 2008-02-07 2008-04-18 -0.2622    184       135       49
5 2012-04-10 2012-05-17 2012-08-03 -0.1668     82        28       54
>

Personalmente sono del parere che questo tipo di strategia mal si presti ad essere utilizzata con titoli molto volatili, a meno che non venga inserita come singolo asset all'interno di un portafoglio sufficientemente diversificato.

Purtroppo però una replica dell'asset azionario SP500 o MD400 fatta con un pugno di azioni anche ben rappresentative dell'indice credo che sia un'impresa vana, a meno che l'indice azionario non sia facilmente replicabile con un numero ridotto di titoli..

:mmmm:

In questo senso stavo pensando al Dow Jones, che con i 30 titoli di cui è composto potrebbe essere facilmente replicato con l'acquisto di un piccolo paniere di singoli titoli azionari, senza contare che ha anche il suo indice di volatilità quotato al CBOE, il DJIA VIX (^VXD).

A questo punto occorre valutare se l'edge che sfrutta la QuantVix, ossia il potere previsionale del flusso di notizie 'overnight' estratto dalla lettura dell'asimmetria a 20 periodi dei prezzi Open/Close dell'indice di volatilità, mantiene le stesse buone performance dell'accoppiata VIX/SPY anche su VXD/DJIA..

:)
 
Ultima modifica:
Salve angio,
mi spiace deludere le aspettative ma con il titolo Apple Inc. come sottostante il drawdown della QuantVix sale parecchio..
...

Grazie OK!

Era solo una "pessima" idea per ovviare al problema (non secondario) che gli ETF ... SSO, MDY, TLT, ecc. ... non sono armonizzati :rolleyes:
 
Ciao a tutti, è possibile avere un aggiornamento su questa strategia?
Avete un codice che io possa usare per vedere il backtesting? Grazie.
 
Ciao a tutti, è possibile avere un aggiornamento su questa strategia?
Avete un codice che io possa usare per vedere il backtesting? Grazie.
Sì, questo mio vecchio codice è ancora perfettamente funzionante in R (ho appena provato):
Codice:
[COLOR="Teal"]# **********************************************
# ***   QUANTVIX: ANALISI DI SENSITIVITA'    ***
# **********************************************

# « Modello: Calcolo l'asimmetria rolling a 20gg 
# (un mese di borsa) circa del logrendimento 
# openvix su lagged closevix. E' una stima 
# semplice, senza sofisticazioni. regola di 
# ingaggio: se l'indice cui sopra ieri era 
# maggiore di zero compro lo SPX(o lo SPY o 
# quel che volete), altrimenti compro il TLT»

# +---------------------------------
# | Installo le librerie
# | (de-commentare per installarle)
# +---------------------------------

#install.packages("PerformanceAnalytics")
#install.packages("quantmod")

# +---------------------------------
# | Carico le librerie
# +---------------------------------[/COLOR]

require(compiler)
require(PerformanceAnalytics)
require(quantmod)

[COLOR="teal"]# +---------------------------------
# | Scarico e allineo i dati
# +---------------------------------[/COLOR]

Symbols = c("^VIX", "SPY", "TLT")
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)

[COLOR="teal"]# +---------------------------------
# | Calcolo il rendimento logaritmico
# | del VIX chiusura (t - 1) vs.
# | apertura (t)
# +---------------------------------[/COLOR]

x = log(my_data[,"VIX.Open"] / lag(my_data[,"VIX.Close"]))

[COLOR="teal"]# +---------------------------------
# | Calcolo l'asimmetria in finestra
# | mobile e aggiungo direttamente il
# | vettore al mio data set
# +---------------------------------[/COLOR]

slow_window_width = 20
my_data$Slow_Skewness = rollapplyr(x,
                                   slow_window_width,
                                   skewness,
                                   na.rm = TRUE,
                                   method = "sample",
                                   by.column = FALSE)

[COLOR="teal"]# +---------------------------------
# | Genero il vettore di posizione.
# | Qui l'ifelse() vettorizzato è fin
# | troppo facile e comodo per non
# | essere usato. Aggiungo anche la
# | posizione al mio data set
# +---------------------------------[/COLOR]

my_data$Position = ifelse(my_data$Slow_Skewness > 0, 1, -1)

[COLOR="teal"]# +---------------------------------
# | Computo i rendimenti aritmetici
# | sullo SPY e sul TLT
# +---------------------------------

# I due comandi seguenti mi consentono di estrarre al volo
# dal mio data set tutte le colonne che contengono la parola
# "SPY" e la parola "TLT" nel loro nome, quindi mi evito di
# specificare aperture, massimi, minimi etc. e prendo dentro
# tutto[/COLOR]

my_SPY = my_data[,substr(colnames(my_data), 1, 3) == "SPY"]
my_TLT = my_data[,substr(colnames(my_data), 1, 3) == "TLT"]

[COLOR="teal"]# Rendimenti aritmetici[/COLOR]

SPY_OC_ret = OpCl(my_SPY)
SPY_CC_ret = ClCl(my_SPY)
TLT_OC_ret = OpCl(my_TLT)
TLT_CC_ret = ClCl(my_TLT)

[COLOR="teal"]# +---------------------------------
# | Calcolo il rendimento della mia
# | posizione. Anche qui l'ifelse()
# | vettorizzato è la soluzione più
# | comoda
# +---------------------------------

# Commissioni: 0 bps ingresso/uscita[/COLOR]

tf = .0 / 100

[COLOR="teal"]# Facciamo switch tra rendimenti Open-to-Close e Close-to-Close
# se c'è stato un cambio segnale[/COLOR]

R = ifelse(my_data$Position == 1, 
           ifelse(my_data$Position == lag(my_data$Position),
                  SPY_CC_ret,
                  SPY_OC_ret - tf),
           ifelse(my_data$Position == lag(my_data$Position),
                  TLT_CC_ret,
                  TLT_OC_ret - tf))

[COLOR="teal"]# +---------------------------------
# | Analisi delle performance
# +---------------------------------[/COLOR]

charts.PerformanceSummary(R, ylog = TRUE, lwd = 1)
table.AnnualizedReturns(R, scale = 252)
table.Drawdowns(R)
table.CalendarReturns(R)
Senza commissioni mi esce questo:
Codice:
                          Position
Annualized Return           0.0996
Annualized Std Dev          0.1634
Annualized Sharpe (Rf=0%)   0.6098
5 peggiori drawdown di sempre:
Codice:
        From     Trough         To   Depth Length To Trough Recovery
1 2008-05-07 2009-03-09 2009-09-16 -0.3615    344       211      133
2 2015-04-27 2016-02-11 2017-11-30 -0.2186    657       202      455
3 2012-09-17 2013-06-24 2014-11-21 -0.1686    550       192      358
4 2007-05-14 2007-08-15 2008-01-22 -0.1310    175        66      109
5 2010-09-29 2011-03-16 2011-08-04 -0.1305    215       117       98
Rendimenti per periodo:
Codice:
      gen  feb  mar  apr  mag  giu  lug  ago  set  ott  nov  dic Position
2004   NA  0.5  0.1  0.4  0.0  0.7  0.2  0.6 -0.1  0.0 -0.4 -0.2      1.9
2005  0.6 -0.7 -0.2 -0.2  1.2 -0.5 -0.7  0.8  0.3  0.2 -0.5 -0.2      0.2
2006 -0.7  0.5  0.0  0.3  1.1  1.0 -0.1 -0.2 -0.1  0.0  0.0 -0.4      1.4
2007  0.7  1.0  0.0  0.5 -0.2  1.0 -1.1  0.1 -0.2 -0.9 -0.5  0.6      1.0
2008  1.8 -2.2  0.3 -0.6  0.3  0.4 -1.3 -1.1 -2.2  0.6  1.3 -2.1     -4.9
2009 -0.3 -2.2  0.9  0.0  1.8 -0.8  0.1 -0.9 -0.4  1.5  0.3 -1.0     -1.0
2010  0.9  0.1 -0.3  1.2  0.5 -1.0  0.0  0.0 -0.1  0.9  0.5  0.0      2.7
2011 -0.8  0.6 -0.1  0.2  1.0  1.0 -0.7  0.4 -2.5  4.0  4.1 -0.5      6.8
2012  0.0 -0.4  0.4 -0.4 -0.2  2.5 -0.7 -0.1 -0.5  0.0  0.0  1.7      2.3
2013 -0.1  0.2  0.3  0.1 -1.4 -0.4  0.1 -0.3 -0.5 -0.3  0.0 -0.6     -3.1
2014 -0.6  0.1  0.3  0.3  0.2  0.2 -2.0  0.3 -0.3  1.1 -0.2 -1.0     -1.5
2015 -1.3 -0.3 -0.9 -1.0  0.2  0.2  0.7 -0.8  0.6  0.7 -0.4 -1.0     -3.1
2016  2.4 -0.8  0.7 -0.5 -0.2  1.4  0.2 -0.3  0.8  0.0 -1.6 -0.4      1.6
2017  0.0 -0.3 -0.2  0.2  0.0  0.2 -0.1  0.6  0.4  0.2  0.9 -0.4      1.4
2018  0.0 -1.0  1.3 -0.8  0.4   NA   NA   NA   NA   NA   NA   NA     -0.1
Non è un vero e proprio backtest ma rende l'idea.

Capture.jpg
 
Indietro