Vorrei importare il prezzo delle azioni "Last Trade" da Yahoo Finance in R. L'intenzione è quella di lavorare con dati (quasi) in tempo reale. Ci sono delle soluzioni?
Grazie in anticipo per qualsiasi commento utile.
Vorrei importare il prezzo delle azioni "Last Trade" da Yahoo Finance in R. L'intenzione è quella di lavorare con dati (quasi) in tempo reale. Ci sono delle soluzioni?
Grazie in anticipo per qualsiasi commento utile.
Risposte:
Questa non è davvero una domanda statistica (forse potrebbe essere spostata su SO?), Ma c'è una bella funzione in quantmod che fa ciò che Dirk ha fatto a mano. Vedi getQuote()e yahooQF(). Digitando yahooQF()si aprirà un menu di tutti i possibili formati di preventivo che è possibile utilizzare.
> require(quantmod)
> getQuote("QQQQ;SPY", what=yahooQF("Last Trade (Price Only)"))
Trade Time Last
QQQQ 2011-03-17 12:33:00 55.14
SPY 2011-03-17 12:33:00 128.17
È abbastanza facile dato che R può leggere direttamente da un determinato URL. La chiave è semplicemente sapere come formare l'URL. Ecco un esempio veloce e sporco basato sul codice scritto da Dj Padzensky alla fine degli anni '90 e che ho mantenuto nel modulo Perl Yahoo-FinanceQuote (che ovviamente è anche su CPAN qui ) per quasi tutto il tempo.
Se conosci un po 'di R, il codice dovrebbe essere autoesplicativo. Ottenere documentazione per la stringa di formato è un po 'più complicato, ma ad esempio il modulo Perl ne ha alcuni.
R> syms <- c("^GSPC", "^IXIC")
R> baseURL <- "http://download.finance.yahoo.com/d/quotes.csvr?e=.csv&f="
R> formatURL <- "snl1d1t1c1p2va2bapomwerr1dyj1x"
R> endURL <- "&s="
R> url <- paste(baseURL, formatURL, endURL, paste(syms, collapse="+"), sep="")
R> read.csv(url, header=FALSE)
V1 V2 V3 V4 V5 V6 V7
1 ^GSPC S&P 500 INDEX,RTH 1256.88 3/16/2011 4:04pm 0 0.00%
2 ^IXIC NASDAQ Composite 2616.82 3/16/2011 5:30pm 0 0.00%
V8 V9 V10 V11 V12 V13 V14
1 4282084608 0 N/A N/A 1256.88 1279.46 1249.05 - 1280.91
2 0 0 N/A N/A 2616.82 0.00 0.00 - 0.00
V15 V16 V17 V18 V19 V20 V21 V22
1 1010.91 - 1344.07 N/A N/A N/A N/A N/A N/A SNP
2 2061.14 - 2840.51 N/A N/A N/A N/A N/A N/A NasdaqSC
R>
La terza colonna è il tuo ultimo scambio. Durante le ore di mercato aperto otterrai meno NA e maggiore variabilità dei dati. Ma nota che la maggior parte dei prezzi ha un ritardo di 15 o 20 minuti --- ma alcuni indici sono in tempo reale. I dati in tempo reale sono una grande impresa e entrate importanti per gli scambi, quindi tendono a non distribuirli. Inoltre, e se ricordo bene, i display più recenti e più in tempo reale sulle pagine Finance di Google e Yahoo usano qualcosa di più AJAXy che è più difficile da mungere dall'esterno.
Ecco una piccola funzione che ho scritto per raccogliere e tracciare dati "pseudo-real time" da Yahoo:
require(quantmod)
Times <- NULL
Prices <- NULL
while(1) {
tryCatch({
#Load current quote
Year <- 1970
currentYear <- as.numeric(format(Sys.time(),'%Y'))
while (Year != currentYear) { #Sometimes yahoo returns bad quotes
currentQuote <- getQuote('SPY')
Year <- as.numeric(format(currentQuote['Trade Time'],'%Y'))
}
#Add current quote to the dataset
if (is.null(Times)) {
Times <- Sys.time()-15*60 #Quotes are delayed 15 minutes
Prices <- currentQuote['Last']
} else {
Times <- c(Times,Sys.time())
Prices <- rbind(Prices,currentQuote['Last'])
}
#Convert to 1-minute bars
Data <- xts(Prices,order.by=Times)
Data <- na.omit(to.minutes(Data,indexAt='endof'))
#Plot the data when we have enough
if (nrow(Data)>5) {
chartSeries(Data,theme='white',TA='addRSI(n=5);addBBands(n=5)')
}
#Wait 1 second to avoid overwhelming the server
Sys.sleep(1)
#On errors, sleep 10 seconds and hope it goes away
},error=function(e) {print(e);Sys.sleep(10)})
}
Produce grafici come questo:

È inoltre possibile utilizzare i dati per altri scopi.
require(quantmod)trascinamento }da solo sull'ultima riga. Dovrai attendere almeno 5 minuti prima di vedere apparire un grafico.
library(quantmod)
getSymbols("LT.NS",src="yahoo")