Programmazione Amibroker Tutorial: matrice di covarianza ibrida usando le volatilità implicite delle opzioni

  • Creatore Discussione Creatore Discussione Cren
  • Data di Inizio Data di Inizio
Quando sviluppi la forma w'*VCV*w dovresti trovare qualcosa del tipo:

Somme(P_i*P_j*x_ij)

e quindi minimizzare con la condizione Somme(P_i) =1

(Lagrange?)

E' lì che devono venire delle condizioni.....
 
Se ben ricordo, per trovare i pesi costruisci una forma quadratica

w*VCV*w'

che poi minimizzi trovando un sistema nelle derivate parziali rispetto ai pesi.
E' corretto (eventualmente scambiare di posto w col suo trasposto a seconda che si usi la convenzione di indicare i pesi con un vettore riga o un vettore colonna).

Tuttavia voglio approfittare della tua carica algebrica per vedere se riusciamo a fare a meno di un sistema di derivate parziali.

Come ho scritto, benchè io abbia scelto di ottenere i pesi mediante una ottimizzazione (e quindi il procedimento che hai spiegato molto bene su FOL: superficie n-dimensionale, gradiente e... pedalare!), il portafoglio a minima varianza si presta ad una soluzione in forma chiusa.

Se V è la matrice delle covarianze, i pesi ottimali sono

gif.latex
,

dove 1 è un vettore colonna di elementi pari ad 1 che uso per fare la sommatoria e C è invece pari a

gif.latex
.

Sapendo questo mi chiedo: a tuo avviso è possibile, lavorando direttamente per semplificare V, venire incontro alla soluzione subottimale che cerchi?

Ti viene qualche idea?

Nota: con la forma chiusa si perde la possibilità di impostare il vincolo di assenza di short selling, quindi potete ritrovarvi con pesi che passano in negativo in certi periodi; nel nostro esempio, laddove Paolo ha mostrato i pesi ottimali di MXE2 e FNAR che si azzerano, senza il vincolo di assenza di short selling ci si sarebbe ritrovati ad andare corti di quasi il 15% su MXE2 e quasi il 5% su FNAR (v. immagine allegata).

La porzione di codice R da sostituire per ottenere questo risultato è:
Codice:
...

[COLOR=Teal]# Costruisco una funzione per ottimizzare i pesi a minima varianza: la
# funzione prende in input i dati, calcola la matrice di covarianza con
# un modello GARCH(1,1) ortogonale a residui condizionatamente normali e
# infine usa un algoritmo risolutore per estrarre il vettore dei
# parametri che minimizzano la varianza del portafoglio[/COLOR]

cov.pars <- function(data) {

  V <- gogarch(data = data, formula = ~ garch(1,1))@V
  
  fun <- function(w) {
    t(w) %*% V %*% w
  }
  
  eqfun <- function(w) {
    sum(w)
  }
  
  pars <- solnp(pars = rep(1/ncol(V),ncol(V)), fun = fun, eqfun = eqfun,
                eqB = 1, LB = rep(0,ncol(V)), UB = rep(1,ncol(V)))$pars

  return(pars)
}

...
Da sostituire con:
Codice:
...

[COLOR=Teal]# Costruisco una funzione per ottimizzare i pesi a minima varianza: la
# funzione prende in input i dati, calcola la matrice di covarianza con
# un modello GARCH(1,1) ortogonale a residui condizionatamente
# normali e infine usa la forma chiusa della frontiera efficiente per 
# estrarre il vettore dei parametri che minimizzano la varianza del
# portafoglio[/COLOR]

cov.pars <- function(data) {

  V <- gogarch(data = data, formula = ~ garch(1,1))@V
  vec.1 <- rep(1, ncol(data))
  C <- t(vec.1) %*% ginv(V) %*% vec.1
  pars <- (ginv(V) %*% vec.1) / as.numeric(C)

  return(pars)
}

...
 

Allegati

  • Rplot01.png
    Rplot01.png
    8,9 KB · Visite: 328
Ultima modifica:
Bisogna che imposti il problema con carta e penna. Le condizioni sono complicate e il rischio di sparare minkiate è forte.
 
Bisogna che imposti il problema con carta e penna.
Stavo riflettendo in merito al problema del ribilanciamento troppo frequente, analizzando in particolare la frequenza di intervento laddove si scelga di discretizzare i pesi ottimali ad intervalli "tagliati con l'accetta".

Nella prima immagine allegata, i pesi sono discretizzati a grosse soglie del 20%, quindi si ribilancia solo quando si passa, ad esempio, da 0.2 ad un numero sufficientemente vicino a 0.4 ignorando tutto quanto avviene nel mezzo.

La frequenza di intervento si riduce molto, solo in casi sporadici si tiene posizione per poche settimane per poi cambiare di nuovo, ma nulla che costringa a muoversi in modo schizofrenico; con una semplificazione di questo tipo fatta a posteriori si perde la somma unitaria, ma è facile inserirla in fase di stima... io ho voluto essere più sbrigativo :D

In merito, invece, alla possibilità di semplificare il problema a monte stavo cercando di capire se un'analisi di clustering gerarchico preliminare effettuata con un semplice dendrogramma basato sulla correlazione potesse consentire di scartare a priori oggetti simili, evitando quindi all'algoritmo di assegnarvi dei pesi (v. seconda immagine).

E' evidente che USG4TR appartiene ad un ramo diverso dagli altri, e che quindi non potrà essere escluso; DBLCMAVL si separa dagli altri, ma il ramo che include FNAR, SPX e MXE2 non si potrebbe semplificare secondo opportuni criteri?
 

Allegati

  • Rplot.png
    Rplot.png
    7 KB · Visite: 299
  • Rplot01.png
    Rplot01.png
    4,2 KB · Visite: 283
Ultima modifica:
Quella che pensavo essere una questione semplice è invece piuttosto difficile. Ovviamente è possibile diagonalizzare la forma quadratica, ma la complicazione dell'analisi si riversa allora sulle condizioni.

Tralasciamo per il momento quel punto.

Quello che dovresti vedere è cosa accade se invece di ribilanciare a soglie di peso vs peso ottimo, ribilanci a soglie di varianza vs. varianza ottima (che è più logico).
 
Quello che dovresti vedere è cosa accade se invece di ribilanciare a soglie di peso vs peso ottimo, ribilanci a soglie di varianza vs. varianza ottima (che è più logico).
Faccio un po' fatica a comprendere questo punto: il concetto mi è chiaro, ma mi sfugge l'espediente pratico per raggiungere il tuo risultato nel modo più aderente possibile a quello che hai in mente.

Mi spiegheresti meglio in quale step del procedimento suggerisci di fare cosa?

Io ora ho provato a discretizzare al quarto decimale la matrice delle covarianze, andando così a perdere un po' di informazione (in pratica si conserva solo il segno e l'ordine di grandezza delle covarianze): USG4TR si comporta bene, ma sugli asset minori il 2004 e il 2012 sono un po' troppo movimentati.

Il mio timore è che, nel tentativo di smorzare sempre più la frequenza di ribilanciamento, ci si trovi ad agire con ritardo autoindotto quando la volatilità esplode ed effettivamente sarebbe preferibile spendere qualche commissione in più per mettersi al riparo piuttosto che restare allocati come il mese precedente e risparmiare in costi di transazione.

Vedi, ad esempio, quel brusco movimento verticale in concomitanza del 2008 (interessante, tuttavia, che a cavallo tra il 2007 e il 2008 la minima varianza suggerisse di restare totalmente in treasury, non trovi?).

Questi sono cinque asset: cosa manca?

Il sesto slot me lo tengo per un ETF sulla volatilità, sai che sballo le correlazioni... :D
 

Allegati

  • Rplot.png
    Rplot.png
    7,8 KB · Visite: 244
Ultima modifica:
(Varianza attuale (con i pesi vecchi) - Varianza ottima)/varianza ottima > Soglia (10%?, 20? boh).....
Eccomi, carissimo :)

Scusa il ritardo, ma sono scoppiati i soliti casini che hanno - ovviamente - la precedenza sulle nostre algebriche elucubrazioni.

Adesso ho capito quello che intendevi: non ci trovavamo perchè io insistevo a ragionare sulla matrice, mentre tu ti riferivi alla varianza del portafoglio.

La soglia del 10% sulla tua condizione - a mio modesto avviso - era eccessiva, praticamente si ribilanciava solo nel 2008; ho optato per mostrarti cosa succede se viene posta al 5%.

Che te ne pare?

Lo trovi più sostenibile?
 

Allegati

  • Rplot.png
    Rplot.png
    7 KB · Visite: 254
Ultima modifica:
In pratica un portafoglio 80/85% bond e 15/20% azioni......

Mi lascia perplesso in senso generale il trascurare qualsiasi regola di momento.

Se l'asset X scende a lungo, con bassa varianza e magari decorrelato dagli altri assets, finisce che ti resta ostinatamente in portafoglio....
 
Mi lascia perplesso in senso generale il trascurare qualsiasi regola di momento.

Se l'asset X scende a lungo, con bassa varianza e magari decorrelato dagli altri assets, finisce che ti resta ostinatamente in portafoglio....
E' il medesimo aspetto su cui ho riflettuto anche io, ma secondo me si tratta di un ragionamento "biased": dovremmo anche chiederci quanta parte delle perdite generate da una allocazione "momentum" dipende dal tentativo di inseguire un trend, anche quando questo non c'è o ha una frequenza incompatibile con quella della nostra strategia.

In fin dei conti quando facciamo trend following seguiamo un momentum passato, non presente nè futuro, che potrebbe interrompersi all'istante lasciandoci in mano, ancora una volta, solo un debole tentativo di diversificazione, come quello cercato in queste pagine.

Il mio ragionamento per spiegare il rendimento medio annuo positivo è stato il seguente.

Due ipotesi:

  1. la ricchezza generata dall'economia finisce negli strumenti finanziari;
  2. gli asset selezionati tendono a scendere con maggior volatilità di quella espressa nelle fasi rialziste.
Entrambi gli argomenti sono troppo grandi e complessi perchè noi li si possa affrontare, non di meno ipotizzare che avvenga il contrario di 1. e 2. sembra davvero azzardato: l'evidenza empirica corrobora il leverage effect con interessanti spunti esplicativi (la letteratura sul tema è infinita).

Se la 2. è vera, allora una allocazione a minima varianza cerca endogenamente di spostarsi sugli asset che stanno scendendo di meno: se la 1. è vera, allora complessivamente il controvalore degli strumenti finanziari che non stanno perdendo valore tende gradualmente a crescere.

Cosa ne pensi?

La combinazione di 1. e 2. può ingenuamente spiegare buona parte dell'equity rialzista?

La discretizzazione che hai proposto è solo leggermente peggiore del caso ideale senza commissioni (solita legenda che ormai mi sono stancato di ripetere: capitalizzazione composta, periodi settimanali, NA per inizializzare etc.):
Codice:
Annualized Sharpe (Rf=0%) 1.2986
Codice:
Maximum Drawdown                            0.1001
Historical VaR (99%)                       -0.0184
Historical ES (99%)                        -0.0268
Modified VaR (99%)                         -0.0317
Modified ES (99%)                          -0.0317
Codice:
      Jan  Feb  Mar  Apr  May  Jun  Jul  Aug  Sep  Oct  Nov  Dec TS.1
1999   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA
2000   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA
2001   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA
2002   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA
2003   NA   NA   NA   NA  0.0 -0.9 -0.3  0.3  0.6  0.0 -0.2  0.2 -0.2
2004 -0.4  0.9 -0.5 -0.6  1.7  0.7  0.2  0.1  0.3  0.0  0.4  0.1  3.0
2005 -0.4  0.1 -1.1  0.3  0.4  0.5  0.0 -0.1  0.0 -0.5  0.7 -0.3 -0.3
2006 -0.2  0.0 -0.8 -0.1  0.4  1.3  1.1  0.2  0.3  0.9  0.8 -0.3  3.6
2007 -0.4  0.2 -0.3  0.1 -0.3  0.6  0.0  0.6  0.3  0.6  0.8  0.5  2.8
2008  0.9  1.4 -0.7 -0.8 -0.9  0.7 -0.2  0.2 -0.7  0.0  3.3 -0.3  2.8
2009 -1.5 -1.7  0.0 -0.3  0.5  1.4  1.3  0.8  0.5  0.2  1.1 -0.2  1.9
2010 -0.1  1.0 -0.8  0.8 -0.1  0.4  0.9 -0.3  1.2 -0.1  0.0  0.8  3.7
2011  0.7  1.0 -0.7  1.1  0.7  0.5  0.6  0.0 -0.6  0.1 -0.4  0.8  3.9
2012  1.1  0.4  0.3  0.5  0.1  0.8 -0.4 -0.2   NA   NA   NA   NA  2.5
Codice:
                 From              Trough                  To   Depth Length
1 2008-03-27 23:00:00 2008-10-17 00:00:00 2009-11-26 23:00:00 -0.1001     88
2 2004-03-25 23:00:00 2004-05-14 00:00:00 2004-09-17 00:00:00 -0.0714     26
3 2010-11-11 23:00:00 2011-02-03 23:00:00 2011-05-27 00:00:00 -0.0490     29
4 2003-06-20 00:00:00 2003-08-15 00:00:00 2003-11-13 23:00:00 -0.0445     22
5 2009-12-03 23:00:00 2009-12-31 23:00:00 2010-04-30 00:00:00 -0.0311     22
  To Trough Recovery
1        30       58
2         8       18
3        13       16
4         9       13
5         5       17
 

Allegati

  • Rplot01.png
    Rplot01.png
    12,9 KB · Visite: 303
Ultima modifica:

Users who are viewing this thread

Back
Alto