Follow along with the video below to see how to install our site as a web app on your home screen.
Nota: This feature may not be available in some browsers.
- Carico un dataset che contiene una colonna di date con i nomi brevi dei mesi: Jan, Feb, .....
- Il problema è che le funzioni per convertire in data non mi riconoscono i nomi in inglese. Es
as.Date("15-Jan-17", format = "%d-%b-%y")
[1] NA
mentre:
as.Date("15-Gen-17", format = "%d-%b-%y")
[1] "2017-01-15"
- Provvisoriamente ho risolto via blocco note cambiando i nomi dei mesi, ma è chiaramente una soluzione del cavolo.
- Mi pare di ricordare che questo dipende dai settaggi di Windows.
- Vorrei una soluzione versatile che mi permetta di accedere a dataset di varia provenienza, in varie lingue senza doverne fare una copia modificata.
- Vorrei una soluzione versatile che mi permetta di accedere a dataset di varia provenienza, in varie lingue senza doverne fare una copia modificata.
Sys.setlocale(category = "LC_TIME", locale = "C")
library(quantmod)
price <- getSymbols("SPY", from = "2019-01-01", to = "2019-03-1", auto.assign = FALSE)
spy <- price[,1:5]
spy[,5] <- rbinom(length(spy[,1]), 1, 0.5)
colnames(spy) <- c("Open","High","Low","Close","SIGNAL")
head(spy)
Open High Low Close SIGNAL
# 2019-01-02 245.98 251.21 245.95 250.18 0
# 2019-01-03 248.23 248.57 243.67 244.21 1
# 2019-01-04 247.59 253.11 247.17 252.39 1
# 2019-01-07 252.69 255.95 251.69 254.38 1
# 2019-01-08 256.82 257.31 254.00 256.77 0
# 2019-01-09 257.56 258.91 256.19 257.97 1
Codice:Sys.setlocale(category = "LC_TIME", locale = "C")
oldLoc <- Sys.getLocale("LC_TIME")
Sys.setlocale(category = "LC_TIME", locale = "C")
mio codice
......
Sys.setlocale(category = "LC_TIME", locale = oldLoc)
Colgo l'occasione per chiedere aiuto su un problema, temo, più complesso di quello di Paolo.
Come simulare in backtesting un'operatività At-LIMIT?
Lo script sottostante carica un paio di mesi di dati SPY da yahoo togliendo Volume e Adjusted e aggiungendo un segnale di buy/sell (nell'esempio, random):
Codice:library(quantmod) price <- getSymbols("SPY", from = "2019-01-01", to = "2019-03-1", auto.assign = FALSE) spy <- price[,1:5] spy[,5] <- rbinom(length(spy[,1]), 1, 0.5) colnames(spy) <- c("Open","High","Low","Close","SIGNAL") head(spy) Open High Low Close SIGNAL # 2019-01-02 245.98 251.21 245.95 250.18 0 # 2019-01-03 248.23 248.57 243.67 244.21 1 # 2019-01-04 247.59 253.11 247.17 252.39 1 # 2019-01-07 252.69 255.95 251.69 254.38 1 # 2019-01-08 256.82 257.31 254.00 256.77 0 # 2019-01-09 257.56 258.91 256.19 257.97 1
Ora come simulare un'operatività di questo tipo?
Se SIGNAL ieri = 0 e SIGNAL oggi = 1 compera DOMANI X titoli con prezzo AT-LIMIT pari al CLOSE di oggi
Se SIGNAL ieri = 1 e SIGNAL oggi = 0 vendi DOMANI X titoli con prezzo AT-LIMIT pari al CLOSE di oggi
Ho trascurato per ora i costi di transazione perché possono essere di tipo diverso (%, fissi, un tanto a titolo etc.)
Ovviamente l'output della funzione dovrebbe essere un vettore (sempre xts, per comodità) con i rendimenti aritmetici generati dalla strategia.
Grazie in anticipo
Paolo, non è una strategia è solo un esempio.la tua strategia mi pare sotto - specificata.
Colgo l'occasione per chiedere aiuto su un problema, temo, più complesso di quello di Paolo.
Come simulare in backtesting un'operatività At-LIMIT?
Lo script sottostante carica un paio di mesi di dati SPY da yahoo togliendo Volume e Adjusted e aggiungendo un segnale di buy/sell (nell'esempio, random):
Codice:library(quantmod) price <- getSymbols("SPY", from = "2019-01-01", to = "2019-03-1", auto.assign = FALSE) spy <- price[,1:5] spy[,5] <- rbinom(length(spy[,1]), 1, 0.5) colnames(spy) <- c("Open","High","Low","Close","SIGNAL") head(spy) Open High Low Close SIGNAL # 2019-01-02 245.98 251.21 245.95 250.18 0 # 2019-01-03 248.23 248.57 243.67 244.21 1 # 2019-01-04 247.59 253.11 247.17 252.39 1 # 2019-01-07 252.69 255.95 251.69 254.38 1 # 2019-01-08 256.82 257.31 254.00 256.77 0 # 2019-01-09 257.56 258.91 256.19 257.97 1
Ora come simulare un'operatività di questo tipo?
Se SIGNAL ieri = 0 e SIGNAL oggi = 1 compera DOMANI X titoli con prezzo AT-LIMIT pari al CLOSE di oggi
Se SIGNAL ieri = 1 e SIGNAL oggi = 0 vendi DOMANI X titoli con prezzo AT-LIMIT pari al CLOSE di oggi
Ho trascurato per ora i costi di transazione perché possono essere di tipo diverso (%, fissi, un tanto a titolo etc.)
Ovviamente l'output della funzione dovrebbe essere un vettore (sempre xts, per comodità) con i rendimenti aritmetici generati dalla strategia.
Grazie in anticipo
Sconsiglio vivamente di fare queste cose "a mano" per evitare errori e altrettanto vivamente suggerisco di usare le opportune funzioni di quantstrat, ci pensano poi le librerie a valutare se hai eseguito, a che prezzo e senza sguardi al futuro.Colgo l'occasione per chiedere aiuto su un problema, temo, più complesso di quello di Paolo.
Come simulare in backtesting un'operatività At-LIMIT?
Lo script sottostante carica un paio di mesi di dati SPY da yahoo togliendo Volume e Adjusted e aggiungendo un segnale di buy/sell (nell'esempio, random):
Codice:library(quantmod) price <- getSymbols("SPY", from = "2019-01-01", to = "2019-03-1", auto.assign = FALSE) spy <- price[,1:5] spy[,5] <- rbinom(length(spy[,1]), 1, 0.5) colnames(spy) <- c("Open","High","Low","Close","SIGNAL") head(spy) Open High Low Close SIGNAL # 2019-01-02 245.98 251.21 245.95 250.18 0 # 2019-01-03 248.23 248.57 243.67 244.21 1 # 2019-01-04 247.59 253.11 247.17 252.39 1 # 2019-01-07 252.69 255.95 251.69 254.38 1 # 2019-01-08 256.82 257.31 254.00 256.77 0 # 2019-01-09 257.56 258.91 256.19 257.97 1
Ora come simulare un'operatività di questo tipo?
Se SIGNAL ieri = 0 e SIGNAL oggi = 1 compera DOMANI X titoli con prezzo AT-LIMIT pari al CLOSE di oggi
Se SIGNAL ieri = 1 e SIGNAL oggi = 0 vendi DOMANI X titoli con prezzo AT-LIMIT pari al CLOSE di oggi
Ho trascurato per ora i costi di transazione perché possono essere di tipo diverso (%, fissi, un tanto a titolo etc.)
Ovviamente l'output della funzione dovrebbe essere un vettore (sempre xts, per comodità) con i rendimenti aritmetici generati dalla strategia.
Grazie in anticipo
Avevo scartato quantstrat perché ne ho sentito parlare male (dicevano troppo lento) e, onestamente, non avevo notato l'esistenza di 'limit' tra i vary ordertypeSconsiglio vivamente di fare queste cose "a mano" per evitare errori e altrettanto vivamente suggerisco di usare le opportune funzioni di quantstrat, ci pensano poi le librerie a valutare se hai eseguito, a che prezzo e senza sguardi al futuro.
Devono essere presenti solo calcoli vettoriali.
Il modo più rapido per fare quello che dici senza usare cicli penso sia questo:Colgo l'occasione per chiedere aiuto su un problema, temo, più complesso di quello di Paolo.
Come simulare in backtesting un'operatività At-LIMIT?
Lo script sottostante carica un paio di mesi di dati SPY da yahoo togliendo Volume e Adjusted e aggiungendo un segnale di buy/sell (nell'esempio, random):
Codice:library(quantmod) price <- getSymbols("SPY", from = "2019-01-01", to = "2019-03-1", auto.assign = FALSE) spy <- price[,1:5] spy[,5] <- rbinom(length(spy[,1]), 1, 0.5) colnames(spy) <- c("Open","High","Low","Close","SIGNAL") head(spy) Open High Low Close SIGNAL # 2019-01-02 245.98 251.21 245.95 250.18 0 # 2019-01-03 248.23 248.57 243.67 244.21 1 # 2019-01-04 247.59 253.11 247.17 252.39 1 # 2019-01-07 252.69 255.95 251.69 254.38 1 # 2019-01-08 256.82 257.31 254.00 256.77 0 # 2019-01-09 257.56 258.91 256.19 257.97 1
Ora come simulare un'operatività di questo tipo?
Se SIGNAL ieri = 0 e SIGNAL oggi = 1 compera DOMANI X titoli con prezzo AT-LIMIT pari al CLOSE di oggi
Se SIGNAL ieri = 1 e SIGNAL oggi = 0 vendi DOMANI X titoli con prezzo AT-LIMIT pari al CLOSE di oggi
Ho trascurato per ora i costi di transazione perché possono essere di tipo diverso (%, fissi, un tanto a titolo etc.)
Ovviamente l'output della funzione dovrebbe essere un vettore (sempre xts, per comodità) con i rendimenti aritmetici generati dalla strategia.
Grazie in anticipo
spy$limit_price_buy <- ifelse(lag(spy$SIGNAL, 2) == 0 & lag(spy$SIGNAL) == 1, lag(spy$Close), NA)
spy$limit_price_sell <- ifelse(lag(spy$SIGNAL, 2) == 1 & lag(spy$SIGNAL) == 0, lag(spy$Close), NA)
spy$order_buy <- ifelse(spy$Low <= spy$limit_price_buy, 1, NA)
spy$order_sell <- ifelse(spy$Low <= spy$limit_price_buy, 1, NA)
quantstrat non è veloce, è vero.Avevo scartato quantstrat perché ne ho sentito parlare male (dicevano troppo lento) e, onestamente, non avevo notato l'esistenza di 'limit' tra i vary ordertype
Molte grazie.
Lui non parla di "vettorizzare" nel senso di algebra di matrici: si riferisce al fatto che in linguaggi come R e Python i cicli sono computazionalmente dispendiosi a differenza di quanto accade ad es. nel C++, quindi dove è possibile (ovvero dove il risultato dell'iterazione successiva non deve dipendere strettamente dal risultato dell'iterazione precedente) è meglio usare le funzioni base del linguaggio che fanno la chiamata direttamente a codice compilato in C/C++.non mi è chiaro cosa intendi. L'unica cosa che riesco ad immaginare è che tu voglia calcolare il vettore gain/loss non tramite un ciclo for ma utilizzando l'algebra tra vettori.
std::vector< int > my_vector;
for (unsigned int i = 0; i < n; ++i)
{
my_vector.push_back(i * 2);
}
my_vector <- array()
for (i in 1:n)
{
my_vector <- append(my_vector, i * 2)
}
my_vector <- 1:n * 2
Il modo più rapido per fare quello che dici senza usare cicli penso sia questo:
A parte il solito ifelse() vettorizzato, per muoversi avanti e indietro nel tempo di un oggetto di classe xts lag.xts può fare al caso tuo.Codice:spy$limit_price_buy <- ifelse(lag(spy$SIGNAL, 2) == 0 & lag(spy$SIGNAL) == 1, lag(spy$Close), NA) spy$limit_price_sell <- ifelse(lag(spy$SIGNAL, 2) == 1 & lag(spy$SIGNAL) == 0, lag(spy$Close), NA) spy$order_buy <- ifelse(spy$Low <= spy$limit_price_buy, 1, NA) spy$order_sell <- ifelse(spy$Low <= spy$limit_price_buy, 1, NA)
quantstrat non è veloce, è vero.