2016-05-13 29 views
6

Sto usando yahoo_finance in python per estrarre dati di magazzino e per qualche motivo, il metodo get_prev_close() non restituisce gli stessi dati con ogni chiamata.Dati di chiusura errati da yahoo_finance in python

Ecco un semplice esempio:

from yahoo_finance import Share 
from time import sleep 

while True: 
    stock = Share('XLV') 
    prevClose = float(stock.get_prev_close()) 
    print prevClose 

    sleep(1) 

Per qualche motivo questo stamperà due numeri diversi apparentemente a caso. Quindi per oggi ricevo 69.3 e 69.71 stampato. Ma dal momento che si tratta di dati prossimi a ieri, dovrebbe esserci un solo valore.

Si tratta di un bug noto e c'è un modo per aggirare questo?

+0

Non so se questo funzionerà meglio per te, ma ho trovato questo pacchetto che sembra fare una cosa simile - https://github.com/cgoldberg/ystockquote/blob/master/ystockquote.py. Vedo che ha anche una funzione get_previous_close, ma non l'ho ancora testata. Ti darò un colpo dopo oggi e ti faccio sapere. –

+0

Volevo solo dare un suggerimento qui. Se stai usando per tirare ripetutamente il prezzo delle azioni, puoi osservare che yahoo_finance non è corretto a volte (non sto dicendo di essere 15 minuti lenti). Per tirare il prezzo attuale delle azioni, google finance è molto più preferito e per tirare i dati storici, yahoo_finance ha caratteristiche migliori. Spero che aiuti qualcuno. – Bhargav

risposta

2

Sembra che i dati YQL in tempo reale utilizzati dal pacchetto yahoo_finance siano obsoleti. 69.71 è la chiusura l'11 maggio. Il valore corretto dovrebbe essere 69.3.

La soluzione più semplice è quella di uno accedere alla tabella dati storici dello stesso pacchetto come in

>>> from yahoo_finance import Share 
>>> stock = Share('XLV') 
>>> data, = stock.get_historical('2016-05-12','2016-05-12') 
>>> data['Close'] 
69.300003 

In alternativa, afferrare i dati vicini direttamente dal sito/Finanza Yahoo. (Molto più veloce e più flessibile) Quando provo a replicare la tua situazione, non riesco a ottenere lo sfarfallio dei valori da te segnalato, ma ottengo una raffica di chiusura (quella del 20 maggio invece del 23 maggio). Forse lo sfarfallio che vedi è il risultato del fatto che YQL talvolta va a un server con dati obsoleti, a volte no. Ecco il codice che ottiene la chiusura precedente dai dati storici di yahoo_finance (a), dai dati in tempo reale di yahoo_finance (b), direttamente dalle quotazioni in tempo reale di yahoo-finance (c) e direttamente dai dati storici di yahoo-finance (d).

import csv 
import time 
import datetime 

import requests 
import pytz 

from yahoo_finance import Share 

hist_url = 'http://real-chart.finance.yahoo.com/table.csv?s=XLV&a=4&b=23&c=2016&g=d&ignore.csv' 
realtime_url = 'http://download.finance.yahoo.com/d/quotes.csv?s=XLV&f=p&e=.csv' 

eastern = pytz.timezone('US/Eastern') 

while True: 
    stock = Share('XLV') 
    a = stock.get_historical('2016-05-23','2016-05-23')[0]['Close'] 
    b = stock.get_prev_close() 
    r = requests.get(hist_url) 
    reader = csv.DictReader(r.iter_lines()) 
    c = float(next(reader)['Close']) 
    d = float(requests.get(realtime_url).text) 
    print datetime.datetime.now(eastern).time(), a, b, c, d 
    time.sleep(120) 

La stretta da stock.get_prev_close() nel 3 ° colonna è sempre stantio, mentre gli altri numeri sono corretti secondo il seguente output:

09:24:51.582532 69.410004 69.69 69.410004 69.41 
09:26:52.749902 69.410004 69.69 69.410004 69.41 
09:28:54.589506 69.410004 69.69 69.410004 69.41 
09:30:56.681914 69.410004 69.69 69.410004 69.41 
09:32:58.255181 69.410004 69.69 69.410004 69.41 
+0

In realtà stavo gestendo questo durante gli orari di apertura del mercato. Ma questa è una buona presa che quelli che fanno i prezzi sono due giorni diversi proverò a usare storico. –

+0

@ TheNightman: interessante.Proverò a replicarlo domani durante l'orario di negoziazione. Ho appena scansionato la sezione trasversale degli stock e risulta che ci sono alcuni casi in cui la "chiusura precedente" riportata nel set di dati in tempo reale non si sovrappone a quella riportata nei dati storici. Per esempio. [i dati in tempo reale] (http://finance.yahoo.com/q?s=DNB) attualmente indicano la chiusura precedente di DNB come 119.76 mentre i [dati storici] (http://finance.yahoo.com/q/hp? s = DNB + Storico + Prezzi) fornisce il valore corretto di 120,43. Vorrei assolutamente andare con i dati storici qui. – Noyer282

+0

@ TheNightman. In effetti il ​​problema non ha davvero a che fare con il cambiamento dei valori nel database dopo la nuova apertura del mercato. Vedere i risultati nella mia risposta modificata – Noyer282

4

Questo problema non ha nulla con la libreria python yahoo_finance. I risultati incoerenti di Yahoo Finance sono stati osservati da molti utenti. È possibile trovare reclami qui forums.developer.yahoo e qui different result. Oggi ho eseguito un paio di query e ho ottenuto anche risultati diversi. Probabilmente è meglio trovare un'altra fonte per i dati finanziari.

+0

La pagina a cui ti sei collegato è stata modificata per la prima volta più di 3 anni fa, quindi potrebbe non essere pertinente ora, quali query hai eseguito oggi che non sono riuscite? –

+0

@PadraicCunningham Ho eseguito query 'select * da yahoo.finance.quotes dove symbol in (" XLV ")' e risultato era incoerente – algor

+0

Dove stai eseguendo 'select * da yahoo.finance.quotes dove symbol in (" XLV ") '? I dati sono errati anche quando visiti la pagina web di yahoo finance o solo attraverso l'api? –