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

ender85

Forumer attivo
Usate la funzione approx(): sostituisce i NA con un'interpolazione lineare.

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.approx(chiusura)#elimino tutti i dati NA di yahoo approssimandoli
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 ritorni 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')
 

ender85

Forumer attivo
Domanda

Mi date una mano a definire la colonna rt senza l'uso di cicli for con R?
 

Allegati

  • domanda.png
    domanda.png
    5,8 KB · Visite: 620

Cren

Forumer storico
apply.rolling

Mi date una mano a definire la colonna rt senza l'uso di cicli for con R?
Se non ricordo male, prova a leggere la descrizione di which().

Una funzione che trovo particolarmente utile per i back test è apply.rolling(), una versione particolare di rollapply(); questa funzione, infatti, vi consente di applicare una qualsiasi funzione che restituisce un output ad una serie storica.

Per le funzioni più semplici esistono versioni già scritte: avete avuto modo di vedere dai listati di ender85, ad esempio, le medie mobili.

R consente di scrivere qualunque funzione preferite [chiamiamola f()], anche centinaia di righe di codice con dentro dozzine di ottimizzazioni, e applicarle in versione rolling a qualsiasi serie storica per ottenere come risultato... "f() mobile" :)

Questo metodo ha il vantaggio, tra gli altri, di evitare sbirciatine al futuro quando si ha in ballo la stima di parametri, siano essi: pesi ottimali di un portafoglio diversificato, il vostro sogno proibito con dentro le reti neurali etc. etc.

Nel seguito allego un esempietto giocattolo (non usate queste sciocchezze a mercato!) in cui usiamo apply.rolling() per fare una decomposizione trend/stagionalità di una serie storica di prezzi di chiusura giornalieri, quindi costruiamo una media mobile che incorpori l'ultimo valore di trend "estratto" dalla decomposizione; costruiamo anche un'altra media mobile, questa volta più sofisticata: infatti si tratta di una media che modifica dinamicamente il proprio periodo per minimizzare la somma del quadrato degli scarti dal trend individuato... in pratica ad ogni iterazione trova la media mobile che più si avvicina al trend.
Codice:
[COLOR=Teal]# **************************************************************************
# Esempio di apply.rolling()
# by Cren
# **************************************************************************

# Carico i package richiesti[/COLOR]

require(quantmod)
require(PerformanceAnalytics)
require(timeSeries)

[COLOR=Teal]# Scarico la serie storica di 'SPY' e selezioni i prezzi di chiusura[/COLOR]

getSymbols('SPY', from = '1950-01-01')
C <- SPY[,4]

[COLOR=Teal]# Creo la prima media mobile a decomposizione trend/stagionalità scrivendo
# una funzione che prenda in input una serie storica, la decomponga e
# restituisca l'ultimo valore del trend[/COLOR]

stl.ma <- function(x) {
  Yt <- ts(as.vector(log(x)), frequency = 252)
  Tt <- stl(x = Yt, s.window = 'periodic')$time.series[,2]
  exp(Tt[length(Tt)])
}

[COLOR=Teal]# Creo la seconda media mobile scrivendo una funzione che prenda in input
# una serie storica, ne estragga il trend e restituisca la media mobile
# semplice che più si avvicina al trend[/COLOR]

best.ma <- function(x) {
  Yt <- ts(as.vector(log(x)), frequency = 252)
  Tt <- stl(x = Yt, s.window = 'periodic')$time.series[,2]
  fun <- function(n) {
    sum(na.omit(Tt - runMean(x = Yt, n = n, cumulative = FALSE))^2)
  }
  fvalues <- NULL
  for(i in 1:20) {
    fvalues[i] <- fun(i * 10)
  }
  ind <- which(fvalues == min(fvalues))
  b.ma <- runMean(x = Yt, n = ind * 10, cumulative = FALSE)
  exp(b.ma[length(b.ma)])
}

[COLOR=Teal]# Uso apply.rolling() per fare un back test visivo di queste funzioni su
# finestra mobile... Se le funzioni sono molto complesse questi comandi
# possono richiedere diversi minuti di elaborazione[/COLOR]

ma1 <- apply.rolling(R = C, width = 505, trim = TRUE, FUN = stl.ma)
ma2 <- apply.rolling(R = C, width = 505, trim = TRUE, FUN = best.ma)

[COLOR=Teal]# Visualizzo i risultati[/COLOR]

plot(col = c(8,2,3), format = '%Y', ylab = '', as.timeSeries(cbind(C, ma1, ma2)), plot.type = 's', log = 'y', main = '', lwd = c(1,2,2)) ; grid(20,20) ; legend('bottomright', legend = c('Daily SPY', 'Seasonal/Trend Decomposition Moving Average', 'Most similar-to-trend Moving Average'), lwd = rep(2,3), col = c(8,2,3), bty = 'n')
Nota: avendo specificato come frequenza per la decomposizione 252 periodi, è evidente che il trend individuato si riferisce alla tendenza espressa dai prezzi di chiusura giornalieri in capo ad un anno; questo valore si può modificare a piacimento in funzione delle proprie necessità.
 

Allegati

  • Rplot.png
    Rplot.png
    16,8 KB · Visite: 671
Ultima modifica:

Paolo1956

Forumer attivo
Senti, c'è qualcosa che non va nella sintassi dell'ultima istruzione plot.....

Errore in plot(col = c(8, 2, 3), format = "%Y", ylab = "", as.timeSeries(cbind(C, :
non trovo la funzione "as.timeSeries"
 
Ultima modifica:

Paolo1956

Forumer attivo
E' una questione di Namespaces.

In C++ scriverei ad es

PerformanceAnalytics::stl(......)

e quindi tutti capirebbero immediatamente che stl è un metodo del Namespace PerformanceAnalytics

La scrittura ridotta che adotta R va bene per te che lo usi a colazione tutte le mattine, ma è difficoltosa per chi conosce solo approssimativamente gli oggetti che sta usando.

:)
 

Cren

Forumer storico
E' una questione di Namespaces.

In C++ scriverei ad es

PerformanceAnalytics::stl(......)

e quindi tutti capirebbero immediatamente che stl è un metodo del Namespace PerformanceAnalytics
Ah, adesso ho capito: in realtà anche R richiederebbe, se si volesse essere formalmente corretti, la stessa procedura; infatti, se per caso dovessero esistere nella propria libreria due funzioni con lo stesso nome, sarebbe necessario anteporre al nome della funzione (metodo) il nome del relativo package (namespace), separando i due termini col " :: "... questo per indicare al linguaggio a quale librearia fare riferimento.

Per semplicità si adotta la notazione ridotta, per cui se il nome di una funzione è associabile univocamente a quella funzione, si risparmiano battiture :)
 

Il Conte Pedro

Not so easy
Eppure...

20120208-jqctdbqg7yfbj785pe9gjtjp8t.medium.jpg


Si punta alla vetta! :D

Grafico simpatico che evidenzia come tanti fanno domande su R (StackOverflow è un sito di domande/risposte su vari temi software) ma molti meno condividono i preziosi sorgenti con le proprie personalissime strategie di trading (GitHub è un sito per condividere sorgenti open source) :D

Ok ok, R non serve solo a fare analisi finanziarie (infatti qualcosina su GitHub c'è, altrimenti avremmo il vuoto spinto... :lol:)
 

Users who are viewing this thread

Alto