Cren
Forumer storico
Esistono molti modi per ottenere il portafoglio a minima varianza globale con R.Finiamo prima il portafoglio a minima varianza, cosi lo completo!!!! attendo tue notizie allora... grazieeeeeeeeeeeee
Teoricamente basta un comando, ma questo a fini didattici sarebbe perfettamente inutile perchè non avresti la minima idea di quello che c'è dietro.
Nella formulazione teorica di Merton i pesi del portafoglio GMV si possono ricavare in forma chiusa, ma non includendo l'assenza di leva e di vendita allo scoperto (= peso di ogni titolo compreso tra 0 e 1).
Per cercare di rendere la cosa il più didattica ed estesa possibile, e al tempo stesso includere quei vincoli, qui useremo quadprog.
quadprog è una libreria che implementa il metodo di Goldfarb e Idnani (1982, 1983) per risolvere problemi di programmazione quadratica della forma
Quindi nel tuo caso avremo:
- d = 0 (non ci serve);
- w i pesi incogniti da trovare;
- V la matrice delle covarianze;
- A la matrice dei vincoli;
- b il vettore che assegna il valore ai vincoli (somma unitaria dei pesi e ciascun peso tra 0 e 1).
- w i pesi incogniti da trovare;
- V la matrice delle covarianze;
- A la matrice dei vincoli;
- b il vettore che assegna il valore ai vincoli (somma unitaria dei pesi e ciascun peso tra 0 e 1).
Proviamo in R col solito codice:
# +---------------------------------
# | Sommario
# |
# | 1. Parametri globali
# | 2. Installazione delle librerie
# | 3. Caricamento delle librerie
# | 4. Scaricamento dei dati
# | 5. Preparazione dei dati
# | 6. Rendimenti aritmetici
# | 7. Portafoglio a minima varianza
# +---------------------------------
# +---------------------------------
# | 1. Parametri globali
# +---------------------------------
op <- par(no.readonly = TRUE)
Sys.setenv(TZ = 'UTC')
# +---------------------------------
# | 2. Installazione delle librerie
# +---------------------------------
install.packages('lattice')
install.packages('quadprog')
install.packages('quantmod')
# +---------------------------------
# | 3. Caricamento delle librerie
# +---------------------------------
require(lattice)
require(quadprog)
require(quantmod)
# +---------------------------------
# | 4. Scaricamento dei dati
# +---------------------------------
env <- new.env()
# In questo esempio usiamo solo un indice e cinque titoli per comodità:
# - FTSE MIB
# - FIAT
# - ENI
# - ENEL
# - Telecom Italia
# - UniCredit
Symbols <- c('FTSEMIB.MI', 'F.MI', 'ENI.MI', 'ENEL.MI', 'TIT.MI', 'UCG.MI')
getSymbols(Symbols = Symbols, env = env, src = 'yahoo', from = '1950-01-01')
# +---------------------------------
# | 5. Preparazione dei dati
# +---------------------------------
args <- eapply(env = env, FUN = function(x){Cl(x)})[Symbols]
X <- na.omit(do.call(what = merge, args = args))
xyplot(X)
# +---------------------------------
# | 6. Rendimenti aritmetici
# +---------------------------------
Data <- apply(X = X, MARGIN = 2, FUN = function(x){Delt(x)})
Data[1,] <- 0
Data <- xts(Data, index(X))
# +---------------------------------
# | 7. Portafoglio a minima varianza
# +---------------------------------
N <- ncol(Data[,-1]) # Numero di titoli, indice escluso
V <- cov(Data[,-1]) # Matrice delle covarianze, indice escluso
d <- rep(0, N) # Vettore "d"
A <- cbind(rep(1, N), diag(N)) # Matrice dei vincoli
b <- c(1, rep(0, N)) # Valore dei vincoli
meq <- c(1, rep(0, N))
opt <- solve.QP(Dmat = V, dvec = d, Amat = A, bvec = b, meq = meq) # Risolve il problema di programmazione quadratica
w <- opt$solution # Estrae i pesi ottimali
names(w) <- colnames(Data[,-1])
round(w, 4) * 100 # Mostra i risultati in forma percentuale
pie(w)
# | Sommario
# |
# | 1. Parametri globali
# | 2. Installazione delle librerie
# | 3. Caricamento delle librerie
# | 4. Scaricamento dei dati
# | 5. Preparazione dei dati
# | 6. Rendimenti aritmetici
# | 7. Portafoglio a minima varianza
# +---------------------------------
# +---------------------------------
# | 1. Parametri globali
# +---------------------------------
op <- par(no.readonly = TRUE)
Sys.setenv(TZ = 'UTC')
# +---------------------------------
# | 2. Installazione delle librerie
# +---------------------------------
install.packages('lattice')
install.packages('quadprog')
install.packages('quantmod')
# +---------------------------------
# | 3. Caricamento delle librerie
# +---------------------------------
require(lattice)
require(quadprog)
require(quantmod)
# +---------------------------------
# | 4. Scaricamento dei dati
# +---------------------------------
env <- new.env()
# In questo esempio usiamo solo un indice e cinque titoli per comodità:
# - FTSE MIB
# - FIAT
# - ENI
# - ENEL
# - Telecom Italia
# - UniCredit
Symbols <- c('FTSEMIB.MI', 'F.MI', 'ENI.MI', 'ENEL.MI', 'TIT.MI', 'UCG.MI')
getSymbols(Symbols = Symbols, env = env, src = 'yahoo', from = '1950-01-01')
# +---------------------------------
# | 5. Preparazione dei dati
# +---------------------------------
args <- eapply(env = env, FUN = function(x){Cl(x)})[Symbols]
X <- na.omit(do.call(what = merge, args = args))
xyplot(X)
# +---------------------------------
# | 6. Rendimenti aritmetici
# +---------------------------------
Data <- apply(X = X, MARGIN = 2, FUN = function(x){Delt(x)})
Data[1,] <- 0
Data <- xts(Data, index(X))
# +---------------------------------
# | 7. Portafoglio a minima varianza
# +---------------------------------
N <- ncol(Data[,-1]) # Numero di titoli, indice escluso
V <- cov(Data[,-1]) # Matrice delle covarianze, indice escluso
d <- rep(0, N) # Vettore "d"
A <- cbind(rep(1, N), diag(N)) # Matrice dei vincoli
b <- c(1, rep(0, N)) # Valore dei vincoli
meq <- c(1, rep(0, N))
opt <- solve.QP(Dmat = V, dvec = d, Amat = A, bvec = b, meq = meq) # Risolve il problema di programmazione quadratica
w <- opt$solution # Estrae i pesi ottimali
names(w) <- colnames(Data[,-1])
round(w, 4) * 100 # Mostra i risultati in forma percentuale
pie(w)