R : i primi 30 minuti (dall’installazione al primo Trading-System)

Salve, sto imparando l’uso di R applicato al trading e una ricerca mi ha portato a questo fantastico 3d.
Complimenti a tutti per la competenza, in particolare a Cren e ai suoi script chiarissimi che mi hanno permesso di capire parecchio dell’uso che si può fare di R, e tutto finalmente in italiano!

Avrei una domanda:
da un po’ mi frulla in testa un’idea balzana: è possibile giungere al vettore dei pesi da attribuire ai vari titoli in portafoglio, usando una regessione multipla lineare che metta in relazione i rendimenti storici dei vari titoli con un vettore ‘obiettivo’ di rendimenti costanti e magari ambiziosi (ad es. 0.3%/day) e considerando poi come pesi i vari coeff di regressione, magari normalizzati?
Aldilà dell’enorme overfitting in-sample, la cosa ha un senso econometrico oppure, come temo, è una castroneria colossale?

Per intenderci una cosa di questo tipo (salvo errori):

[FONT=&quot]
#------------------------------------------------
# Fake-LM Portfolio DAX
#------------------------------------------------
##### LM-Portfolio, forse funziona....

library(quantmod)
library(PerformanceAnalytics)
library(tawny)

n.day <- 252 # numero giorni analisi

# tiker del paniere attuale del DAX
list <- getIndexComposition("^GDAXI",hint=30)

# scarica i rendimenti aritmetici
h <- getPortfolioReturns(list, obs=n.day)

# calcolo retta obiettivo ambizioso
retta <- rep(0.003,n.day)

# calcolo pesi
modello <- lm(retta ~ h + 0)
w <- coef(modello) # pesi
ww <- w/sum(abs(w)) # somma pesi forzata a 1

# calcolo rendimenti pesati
w.ret <- matrix(0,ncol=length(ww),nrow=n.day)
for (i in 1:length(ww))
{
w.ret[,i] <- h[,i]*ww
}

# rendimento portafoglio Fake-LM
ret <- rowSums(w.ret)

# rendimento Indice DAX
getSymbols("^GDAXI")
r.indice <- ROC(GDAXI[,4],type="discrete")

# analisi performance
rx <- xts(ret,order.by = index(h))
colnames(rx) <- "Porfolio Fake-LM"
rx$DAX <- r.indice
charts.PerformanceSummary(rx, ylog=T, lwd=1)
table.AnnualizedReturns(rx)
maxDrawdown(rx)
###fine############################################

Porfolio.Fake.LM DAX
Annualized Return 0.2119 0.0444
Annualized Std Dev 0.0398 0.2457
Annualized Sharpe (Rf=0%) 5.3251 0.1808

Porfolio.Fake.LM DAX
Worst Drawdown 0.01871295 0.5476745

[/FONT]
[FONT=&quot]
_IO2.JPG
[/FONT]

ciao
tdazio
 
Al di là del codice, per le mie modeste conoscenze corretto ma probabilmente ottimizzabile e snellibile con qualche vettore in più, stavo ragionando sul "significato" di quello che fai.

Se non capisco male il senso di quello che vuoi fare, tu in pratica nel in-sample, fissato un benchmark ideale di 30 p.b. al giorno, vai a:
- incrementare l'esposizione dei titoli che sono andati peggio rispetto al benchmark fintanto che la loro performance è stata positiva (es. titolo che ha reso 1 p.b. al giorno avrà un coefficiente di 30 mentre uno che ha reso 2 p.b. al giorno avrà un coefficiente di 15, quindi pesa la metà);
- vendere più pesantemente allo scoperto i titoli che sono andati meglio rispetto al benchmark fintanto che la loro performance è stata negativa (es. titolo che ha reso -1 p.b. al giorno avrà un coefficiente di -30 mentre uno che ha reso -2 p.b. al giorno avrà un coefficiente di -15, quindi lo vendi per la metà).​
In pratica privilegi la roba che s'è mossa poco.

E' questo che volevi fare?

Per rispondere alla tua domanda, però, non vedo un criterio quantitativo ben definito, forse dovresti affinare maggiormente la tua descrizione del problema.

Ovvero:
1. partire con una funzione obiettivo da massimizzare/minimizzare;
2. definirla in funzione del vettore dei pesi;
3. ottimizzarla.​
Per replicare il tuo caso, la tua funzione obiettivo potrebbe semplicemente essere la minimizzazione della dev.st. parziale inferiore ma calcolata su un riferimento di 30 p.b. al giorno (quindi minimizzi il quadrato medio di tutto ciò che cade al di sotto del benchmark).

Comunque finché non provi out-of-sample non hai in mano nulla.
 
Ultima modifica:
Al di là del codice, per le mie modeste conoscenze ..
Grazie per il commento, ti assicuro che le tue conoscenze, per nulla modeste, sono di gran lunga superiori alle mie !

Interessante la tua descrizione di ciò che accade all'interno del portafoglio e di come i vari pesi, positivi o negativi, permettano esposizioni su titoli con performance diverse: io non ci ero minimamente arrivato a capirlo.

L'idea di questo giochino mi è venuta leggendo di una tecnica astrusa applicata al mondo del forex: parti da una valuta e la replichi sinteticamente usando altri N cross attraverso una semplice regressione multipla, se lo spread tra la valuta reale e quella sintetica è I(0) c'è qualche speranza che le due siano cointegrate e dunque che sia possibile applicare qualche forma di trading di tipo stat-arb.
Ovviamente loro, a differenza mia, usavano i prezzi delle valute e non i rendimenti.
Inizialmente volevo operare una regressione multipla tra i prezzi dei titoli e una retta crescente, ad esempio qualcosa che in 252 punti passasse da 100 a 130, verificando poi la stazionarietà dei residui, ma poi mi sono bloccato perchè non riuscivo a capire il senso economico di avere un peso negativo applicato a un prezzo di chiusura e così sono passato a giocare coi rendimenti :-)

Tra l'altro il vincolo che ho posto io nel mio script, porre la somma dei valori assoluti dei pesi uguale a 1 significa considerare come esposizione di capitale anche le cifre impiegate short: se rimuovi la condizione ponendo semplicemente uguale a 1 la somma algebrica dei pesi (che forse rispecchia di più un'ottica di gestione istituzionale) ciò che esce è a dir poco esplosivo (cose da SR > 20 :-)

Concordo sul fatto che in-sample tutto ciò ha poco senso ed è solo un modo diverso di fare datasnooping: invece di partire da un'attività finanziaria e scegliere tra 10000 il miglior modello di trading, in questo caso si piglia un modello di trading (il buy hold) e si trova il perfetto mix long/short tra i titoli che massimizza l'info-ratio.
Se non è zuppa è pan bagnato :-)
Grazie ancora per l'attenzione
tdazio
 
ciao tdazio-

potresti spiegarmi questa parte del codice?

[FONT=&quot]# calcolo pesi
modello <- lm(retta ~ h + 0)
w <- coef(modello) # pesi
ww <- w/sum(abs(w)) # somma pesi forzata a 1
[/FONT]
 
Sicuramente il post of the year del 2013

Ricorda da vicino per la sua filosofia mean reversion una mia strategia, a mercato, che ha lavorato dal 2003 al 2013 circa, con un grosso draw down nel marzo 2009 comunque recuperato e poi abbandonata nel marzo 2013, per motivi del tutto indipendenti dai backtesting e dall'impiego con denaro reale. Al posto di considerare i rendimenti, usavo l'Alpha mentre l'hedging si potrebbe tranquillamente fare con il Beta, piuttosto che con lo short suggerito.

IMHO Lo short si puo' effettuare solo a livelli professionali: ai nostri livelli amatoriali e' del tutto sconsigliato per problemi varie volte ricordati.
 
Sicuramente il post of the year del 2013

Ricorda da vicino per la sua filosofia mean reversion una mia strategia, a mercato, che ha lavorato dal 2003 al 2013 circa, con un grosso draw down nel marzo 2009 comunque recuperato e poi abbandonata nel marzo 2013, per motivi del tutto indipendenti dai backtesting e dall'impiego con denaro reale. Al posto di considerare i rendimenti, usavo l'Alpha mentre l'hedging si potrebbe tranquillamente fare con il Beta, piuttosto che con lo short suggerito.

IMHO Lo short si puo' effettuare solo a livelli professionali: ai nostri livelli amatoriali e' del tutto sconsigliato per problemi varie volte ricordati.


Vero. Me l'ha immediatamente ricordata e la domanda che ho fatto è funzionale;

ho dubbi sulla moltiplicazione a pari lag (quando pesa il vettore).

[FONT=&quot]# calcolo rendimenti pesati
w.ret <- matrix(0,ncol=length(ww),nrow=n.day)
for (i in 1:length(ww))
{
w.ret[,i] <- h[,i]*ww

ma devo capire prima
[/FONT]
[FONT=&quot][FONT=&quot]w <- coef(modello) # pesi cosa fa.

Ma magari è una domanda inutile.
[/FONT][/FONT]
 
ciao tdazio-

potresti spiegarmi questa parte del codice?

[FONT=&quot]# calcolo pesi
modello <- lm(retta ~ h + 0)
w <- coef(modello) # pesi
ww <- w/sum(abs(w)) # somma pesi forzata a 1
[/FONT]

Salve Ernesto,

[FONT=&quot]modello <- lm(retta ~ h + 0), opera una regressione lineare multipla senza intercetta tra la matrice h (coi vettori dei rendimenti dei titoli) e il vettore retta (con rendimenti costanti e ambiziosi)

[/FONT]
[FONT=&quot][FONT=&quot]w <- coef(modello), restituisce il vettore dei regressori
[/FONT][/FONT][FONT=&quot][FONT=&quot][FONT=&quot][FONT=&quot][FONT=&quot](se in R batti ?lm trovi una spiegazione completa dell'istruzione lm)[/FONT]
[/FONT][/FONT]
[/FONT][/FONT]
[FONT=&quot][FONT=&quot][FONT=&quot]ww <- w/sum(abs(w)), standardizza i regressori forzando a 1 la somma dei loro valori assoluti

tdazio
[/FONT][/FONT][/FONT]
 
Salve Ernesto,

[FONT=&quot]modello <- lm(retta ~ h + 0), opera una regressione lineare multipla senza intercetta tra la matrice h (coi vettori dei rendimenti dei titoli) e il vettore retta (con rendimenti costanti e ambiziosi)

[/FONT]
[FONT=&quot][FONT=&quot]w <- coef(modello), restituisce il vettore dei regressori
[/FONT][/FONT][FONT=&quot][FONT=&quot][FONT=&quot][FONT=&quot][FONT=&quot](se in R batti ?lm trovi una spiegazione completa dell'istruzione lm)[/FONT]
[/FONT][/FONT]
[/FONT][/FONT]
[FONT=&quot][FONT=&quot][FONT=&quot]ww <- w/sum(abs(w)), standardizza i regressori forzando a 1 la somma dei loro valori assoluti

tdazio
[/FONT][/FONT][/FONT]


Ciao tdazio, si, quello l'ho capito (non ho dimestichezza con R).

la parte seguente è il mio dubbio. Cmq. complimenti
 

Users who are viewing this thread

Back
Alto