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

Cren

Forumer storico
Come ho promesso a ender85, pubblico un piccolo codice dimostrativo.

L'obiettivo è quello di costruire un indice sintetico partendo dai dati storici di quattro ETF; l'indice pesa i quattro costituenti con l'obiettivo di minimizzare la varianza del portafoglio.

Codice:
[COLOR="SeaGreen"]#******************************************************************
# Minimum variance portfolio by Cren
#******************************************************************

# Carichiamo alcuni pacchetti di cui avremo bisogno[/COLOR]

require(quantmod)
require(fPortfolio)
require(timeSeries)

[COLOR="SeaGreen"]# Scarichiamo da Yahoo i dati storici dei quattro ETF che useremo.
# Le asset class scelte sono S&P500, Long Term US Treasury, oro e
# materie prime[/COLOR]

getSymbols(c('SPY', 'TLT', 'GLD', 'DBC'), from = '1950-01-01')

[COLOR="SeaGreen"]# Costruiamo un'unica matrice di dati con tutti e quattro gli ETF. Inoltre
# creiamo una matrice vuota di pesi che riempiremo successivamente
[/COLOR]
X <- na.omit(cbind(SPY[,4], TLT[,4], GLD[,4], DBC[,4]))
weights <- matrix(0, nrow = nrow(X), ncol = ncol(X))

[COLOR="SeaGreen"]# All'interno di una finestra mobile di 200 giorni calcoliamo il valore
# dei pesi che, giorno per giorno, minimizzano la volatilità.
# L'ampiezza della finestra può essere modificata a piacimento
# col parametro "k".[/COLOR]

k <- 199
for(i in 1:(nrow(X)-k)) {
  data = X[i:(i+k),]
  spec <- portfolioSpec()
  setType(spec) <- 'LPM'
  portf <- minvariancePortfolio(data = na.omit(returns(as.timeSeries(data), method = 'discrete')), spec = spec)
  weights[i+k,] <- getWeights(portf)
}

[COLOR="SeaGreen"]# Visualizziamo le serie storiche degli ETF[/COLOR]

plot(as.timeSeries(X), plot.type = 'm', main = '')

[COLOR="SeaGreen"]# Visualizzamo l'evoluzione nel tempo dei pesi ottimali
[/COLOR]
plot(ylab = 'Minimum variance weight', timeSeries(weights, charvec = rownames(as.timeSeries(X))), plot.type = 's') ; grid() ; legend('topright', legend = c('SPY', 'TLT', 'GLD', 'DBC'), col = seq(1, 4, 1), lwd = rep(2, 4), bty = 'n')

[COLOR="SeaGreen"]# Calcoliamo i rendimenti del nostro nuovo portafoglio a minima varianza
[/COLOR]
dX <- returns(X, method = 'continuous') ; dX[1,] <- 0
w.ret <- weights * dX
ret <- rowSums(w.ret)

[COLOR="SeaGreen"]# Confrontiamo graficamente il portafoglio a minima varianza con i rendimenti
# delle altre asset class considerate singolarmente: sembra coerente![/COLOR]

plot(ylim = c(-.65, 1.25), lwd = 2, ylab = 'Return', as.timeSeries(cumsum(ret))) ; grid()
for(i in 1:4) {
  lines(as.timeSeries(cumsum(dX[,i])), col = i + 1)
}
legend('topleft', legend = c('MinVar', 'SPY', 'TLT', 'GLD', 'DBC'), col = seq(1, 5, 1), lwd = rep(2, 5), bty = 'n')
L'indice rappresenta anche una forma di back test per Piedi a Terra che si chiedeva quanto valesse una strategia "passiva" di replica a varianza minima.

Per un privato nella realtà è ovviamente impossibile bilanciare con quella frequenza a causa dei costi di transazione e dei tempi di reazione, ma il codice è solo dimostrativo per mostrare la semplicità con cui si gestisce una ottimizzazione multipla e in finestra mobile su quattro sottostanti contemporaneamente.

Se non erro, nessun programma commerciale, al momento, è in grado di gestire un back test di questa complessità con questa velocità e semplicità di linguaggio, ma sarei felice di essere smentito.

A ender85 buon divertimento! :D

Interfacciare quindi R ad AmiBroker può consentire di unire due potenti strumenti per i back test.
 

Allegati

  • Rplot02.png
    Rplot02.png
    10,8 KB · Visite: 1.051
  • Rplot01.png
    Rplot01.png
    12,8 KB · Visite: 1.046
  • Rplot.png
    Rplot.png
    14,7 KB · Visite: 1.236
Ultima modifica:

reef

...
Come ho promesso a ender85, pubblico un piccolo codice dimostrativo.

Ricordo che R funziona anche in ambiente Amibroker, tramite l'apposita DLL di interfacciamento.
Per ora ho solo effettuato i test minimi, ma le prospettive dovrebbero essere davvero interessanti.

Niente da fare, volevo provare l'esempio di Cren ma dopo aver aggiornato Amibroker alla 5.50, la DLL di R non ne vuole più sapere di funzionare. In pratica i dati passano a R (come da finestra di debug) ma non riescono a tornare, segnalando un generico "exception error" sulla chiamata RMathGetArray()

Con la versione 5.30, invece, avevo testato il funzionamento corretto.

Altri riscontri?

Questo il codice di test Garch di Cren in formato afl (che funzionava)
Codice:
RMathDebugOn();
RMathSetArray(C,"s"); //Here I set the return-series previously defined in AB via VarSet
//# --- Transform the price array in a time series AND show it --- #
//s <- as.timeSeries(s) ; s
RMathProcedure("s <- as.timeSeries(s)"); 
//# --- Calculate the logarithmic returns of the underlying AND show them --- #
//u <- returns(s) ; u
RMathProcedure("u <- returns(s)");
//# --- Fit Bollserslev's GARCH(1,1) model on "u" array; the residuals' conditional distribution is Normal --- #
//fit <- garchFit(~ garch(1,1), data = u, cond.dist = "norm", trace = False, include.mean = False) ; fit
RMathProcedure("fit <- garchFit(~ garch(1,1), data = u, cond.dist = <DQ>norm<DQ>, trace = False, include.mean = False)");
//# --- Extract an array with the conditional standard deviations AND show it --- #
//sigma.t <- as.timeSeries([email protected]) ; sigma.t
RMathProcedure("sigma.t <- as.timeSeries([email protected])");
//# --- Plot the annual volatility in percent format (if your time series is weekly, use 48 OR 50 instead of 252 --- #
//Plot(sigma.t*sqrt(252)*100)
sigmat=RMathGetArray("sigma.t");
Plot(sigmat,"sigma.t",13,1);
 

Allegati

  • err.png
    err.png
    28,6 KB · Visite: 942
Ultima modifica:

Imar

Forumer attivo
Niente da fare, volevo provare l'esempio di Cren ma dopo aver aggiornato Amibroker alla 5.50, la DLL di R non ne vuole più sapere di funzionare. In pratica i dati passano a R (come da finestra di debug) ma non riescono a tornare, segnalando un generico "exception error" sulla chiamata RMathGetArray()

Con la versione 5.30, invece, avevo testato il funzionamento corretto.

Altri riscontri?

Questo il codice di test Garch di Cren in formato afl (che funzionava)
Codice:
RMathDebugOn();
RMathSetArray(C,"s"); //Here I set the return-series previously defined in AB via VarSet
//# --- Transform the price array in a time series AND show it --- #
//s <- as.timeSeries(s) ; s
RMathProcedure("s <- as.timeSeries(s)"); 
//# --- Calculate the logarithmic returns of the underlying AND show them --- #
//u <- returns(s) ; u
RMathProcedure("u <- returns(s)");
//# --- Fit Bollserslev's GARCH(1,1) model on "u" array; the residuals' conditional distribution is Normal --- #
//fit <- garchFit(~ garch(1,1), data = u, cond.dist = "norm", trace = False, include.mean = False) ; fit
RMathProcedure("fit <- garchFit(~ garch(1,1), data = u, cond.dist = <DQ>norm<DQ>, trace = False, include.mean = False)");
//# --- Extract an array with the conditional standard deviations AND show it --- #
//sigma.t <- as.timeSeries([email protected]) ; sigma.t
RMathProcedure("sigma.t <- as.timeSeries([email protected])");
//# --- Plot the annual volatility in percent format (if your time series is weekly, use 48 OR 50 instead of 252 --- #
//Plot(sigma.t*sqrt(252)*100)
sigmat=RMathGetArray("sigma.t");
Plot(sigmat,"sigma.t",13,1);


Prova con la 5.40, ho letto da qualche parte che il plug in è molto dipendente dal collegamento con la versione di AB vigente al momento della sua creazione.


PS Se hai tempo, potresti fare un post partendo proprio da zero.... del tipo "i primi trenta minuti"??
Diciamo che ho AB 5.40 sul mio PC ed il plug in come file EXE in archivio.
Ora che si fa?
 

reef

...
Prova con la 5.40, ho letto da qualche parte che il plug in è molto dipendente dal collegamento con la versione di AB vigente al momento della sua creazione.


PS Se hai tempo, potresti fare un post partendo proprio da zero.... del tipo "i primi trenta minuti"??
Diciamo che ho AB 5.40 sul mio PC ed il plug in come file EXE in archivio.
Ora che si fa?

OK, visto che anche Ender è interessato, la prox settimana butto giù qualcosa, ma è davvero banale con il file di supporto qui sotto (se tutto fila liscio, ovviamente).

:)
 

Allegati

  • R_Plug-in_Amibroker.doc
    260,5 KB · Visite: 1.589

reef

...
OK, visto che anche Ender è interessato, la prox settimana butto giù qualcosa, ma è davvero banale con il file di supporto qui sotto (se tutto fila liscio, ovviamente).

:)

Installando anche la 5.30 (che funzionava), l'afl con R si pianta ugualmente come sopra.
Ovviamente non ho nessuna voglia di ripartire from scratch, per cui ora attendo qualche soluzione. In rete il nulla, può darsi che sia un problema solo mio dovuto ai diversi upgrade di AB e insozzamenti di registro vari... :(
 

ender85

Forumer attivo
Installando anche la 5.30 (che funzionava), l'afl con R si pianta ugualmente come sopra.
Ovviamente non ho nessuna voglia di ripartire from scratch, per cui ora attendo qualche soluzione. In rete il nulla, può darsi che sia un problema solo mio dovuto ai diversi upgrade di AB e insozzamenti di registro vari... :(
Anche io non ci sono riuscito ad attaccare R alla 5.50 e attaccarlo alle vecchie versioni non è molto utile purtroppo :sad:

Vi pubblico il codice per la banale strategia sma200 su sp500, riuscite a fare un codice più comprensibile e semplice di questo?
Mi piacerebbe iniziare a creare una piccola raccolta di codici di strategie facili per abbattere la curva di apprendimento di R. Non abbiate timore e proponete le vostre modifiche per migliorare il codice:up:
Codice:
library(quantmod)#carico la libreria quantmod
getSymbols("^GSPC", from = "1900-01-01", to = Sys.Date())#scarico i dati fino ad oggi
chiusura<- Cl(GSPC)#estraggo le close
chiusura<- na.omit(chiusura)#elimino tutti i dati NA di yahoo
media200<- runMean( chiusura, 200 )#calcolo la media
segnale<- ifelse(chiusura>=media200,1,-1)#calcolo se long o short
ritorni<- dailyReturn(chiusura)*Lag(segnale)#calcolo i rendimenti della strategia
equity <- cumsum(na.omit(ritorni))#sommo tutti i rendimenti eliminando i dati errati dal lag
#plotto la equity mettendo come limite dell'asse y il massimo ed il minimo della equity
plot(ylim = c(seriesLo(equity),seriesHi(equity)),equity,main = 'SMA200 S&P500')
 

f4f

翠鸟科
Anche io non ci sono riuscito ad attaccare R alla 5.50 e attaccarlo alle vecchie versioni non è molto utile purtroppo :sad:

Vi pubblico il codice per la banale strategia sma200 su sp500, riuscite a fare un codice più comprensibile e semplice di questo?
Mi piacerebbe iniziare a creare una piccola raccolta di codici di strategie facili per abbattere la curva di apprendimento di R. Non abbiate timore e proponete le vostre modifiche per migliorare il codice:up:
Codice:
library(quantmod)#carico la libreria quantmod
getSymbols("^GSPC", from = "1900-01-01", to = Sys.Date())#scarico i dati fino ad oggi
chiusura<- Cl(GSPC)#estraggo le close
chiusura<- na.omit(chiusura)#elimino tutti i dati NA di yahoo
media200<- runMean( chiusura, 200 )#calcolo la media
segnale<- ifelse(chiusura>=media200,1,-1)#calcolo se long o short
ritorni<- dailyReturn(chiusura)*Lag(segnale)#calcolo i rendimenti della strategia
equity <- cumsum(na.omit(ritorni))#sommo tutti i rendimenti eliminando i dati errati dal lag
#plotto la equity mettendo come limite dell'asse y il massimo ed il minimo della equity
plot(ylim = c(seriesLo(equity),seriesHi(equity)),equity,main = 'SMA200 S&P500')


ciao Enders :):)


domanda (quasi) ot:
se si usano i dati yahoo, conviene interpolare i mancanti anzichè ometterli?
e
sullo sp500, prechè non usare i dati CBOE ?
 

Cren

Forumer storico
Allego un secondo codice di esempio; al solito in questa discussione, come scritto da surcontre, suggerisco di concentrarsi sul codice piuttosto che sul contenuto che è solo esemplificativo.

Nella fattispecie useremo due serie storiche, una presa dalla FRED

fredgraph.png

e il solito S&P500; invito ad andarsi a leggere la descrizione di quella scaricata dalla FRED ;)

Indagheremo la presenza di un legame lineare statisticamente significativo tra il trend dello S&P500 e il trend dei TOTLL.
Codice:
[COLOR="Teal"]# **************************************************************************
# Esempio analisi di regressione lineare
# S&P500 vs. Total Loans and Leases of Commercial Banks
# by Cren
# **************************************************************************

# Carico il package 'quantmod'
[/COLOR]
require(quantmod)

[COLOR="Teal"]# Scarico la serie dei 'Total Loans and Leases of Commercial Banks' da FRED
# Scarico la serie dello S&P500 da Yahoo[/COLOR]

getSymbols('TOTLL', src = 'FRED')
getSymbols('^GSPC', src = 'yahoo', from = '1973-01-03')

[COLOR="Teal"]# Introduco due medie mobili semplici semestrali sui prezzi di chiusura per
# smorzare leggermente i dati[/COLOR]

TOTLL.m <- runMean(to.monthly(TOTLL)[,4], n = 6, cumulative = FALSE)
GSPC.m <- runMean(to.monthly(GSPC)[,4], n = 6, cumulative = FALSE)

[COLOR="Teal"]# Calcolo le differenze prime (rendimenti logaritmici) delle due serie
# smorzate[/COLOR]

dTOTLL <- na.omit(diff(log(TOTLL.m)))
dGSPC <- na.omit(diff(log(GSPC.m)))

[COLOR="Teal"]# Visualizzo le serie storiche utilizzate in scala logaritmica[/COLOR]

par(mfrow = c(2, 1))
plot(to.monthly(TOTLL), log = 'y', main = '') ; lines(TOTLL.m, log = 'y', col = 2) ; legend('topleft', legend = c('TOTLL','SMA(6)'), col = c(1,2), bty = 'n', lwd = c(2,2))
plot(to.monthly(GSPC), log = 'y', main = '') ; lines(GSPC.m, log = 'y', col = 2) ; legend('topleft', legend = c('GSPC','SMA(6)'), col = c(1,2), bty = 'n', lwd = c(2,2))

[COLOR="Teal"]# Visualizzo i risultati dell'analisi di regressione[/COLOR]

summary(lm(dTOTLL ~ dGSPC))

[COLOR="Teal"]# Compito da svolgere a casa: qual è l'interpretazione economica di questi
# risultati?[/COLOR]
Risultato dell'analisi di regressione lineare:
Codice:
lm(formula = dTOTLL ~ dGSPC)

Residuals:
       Min         1Q     Median         3Q        Max 
-0.0166409 -0.0024191  0.0006433  0.0029816  0.0107572 

Coefficients:
              Estimate Std. Error t value Pr(>|t|)    
(Intercept)  0.0061679  0.0002085   29.58  < 2e-16 ***
dGSPC       -0.0388123  0.0101613   -3.82 0.000152 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 

Residual standard error: 0.004354 on 466 degrees of freedom
Multiple R-squared: 0.03036,	Adjusted R-squared: 0.02828 
F-statistic: 14.59 on 1 and 466 DF,  p-value: 0.0001518
 

Allegati

  • Rplot.png
    Rplot.png
    9,3 KB · Visite: 719

ender85

Forumer attivo
ciao Enders :):)


domanda (quasi) ot:
se si usano i dati yahoo, conviene interpolare i mancanti anzichè ometterli?
e
sullo sp500, prechè non usare i dati CBOE ?

Ciao f4f!!!
I dati mancanti come si fillano con R?
Quantmod non permette di scaricare dati dal cboe purtroppo :(
Cmq questi sono tutti codici esempio per capire come programmare R, non certo per andare a mercato...
 

Users who are viewing this thread

Alto