Module for retrieving quote data ('live' and 'historical') from YahooFinance!
This module is made up of 2 parts:
1. Retrieving 'live' quote data. 'Live' quotes are the current
data available for a given stock. Most often delayed 20mins.
2. Retrieving 'historical' quote data. 'Historical' quotes are
for past pricings of a given stock.
Module for retrieving quote data ('live' and 'historical') from YahooFinance!
This module is made up of 2 parts:
1. Retrieving 'live' quote data. 'Live' quotes are the current
data available for a given stock. Most often delayed 20mins.
2. Retrieving 'historical' quote data. 'Historical' quotes are
for past pricings of a given stock.
Module for retrieving quote data ('live' and 'historical') from YahooFinance!
This module is made up of 2 parts:
1. Retrieving 'live' quote data. 'Live' quotes are the current
data available for a given stock. Most often delayed 20mins.
2. Retrieving 'historical' quote data. 'Historical' quotes are
for past pricings of a given stock.
'Live' quote data retrieval.
Return a string containing the results retrieved from YahooFinance. If there was an error during the execution of this method, the string "" is returned. In practice, this means that no *Quote objects will be created (empty hashes will be returned from get_*_quotes methods).
# File lib/assets/yfinadaptor/yfinadaptor.rb, line 173 def YahooFinance.get( symbols, format, timeout=DEFAULT_READ_TIMEOUT ) return "" if symbols == nil symbols = symbols.join( "," ) if symbols.class == Array simba = symbols.dup simba.strip! return "" if symbols == "" # Catch any exceptions that might occur here. Possible exceptions # are the read_timeout and... # # # Don't catch any exceptions! Just let them be thrown. # proxy = ENV['http_proxy'] ? URI.parse( ENV['http_proxy'] ) : OpenStruct.new Net::HTTP::Proxy( proxy.host, proxy.port, proxy.user, proxy.password ).start( "download.finance.yahoo.com", 80 ) do |http| http.read_timeout = timeout response = nil response = http.get( "/d/quotes.csv?s=#{symbols}&f=#{format}&e=.csv" ) return "" if !response response.body.chomp end end
# File lib/assets/yfinadaptor/yfinadaptor.rb, line 530 def YahooFinance.get_HistoricalQuotes( symbol, startDate, endDate ) ret = [] YahooFinance.get_historical_quotes( symbol, startDate, endDate ) { |row| if block_given? yield HistoricalQuote.new( symbol, row ) else ret << HistoricalQuote.new( symbol, row ) end } if block_given? return nil else return ret end end
# File lib/assets/yfinadaptor/yfinadaptor.rb, line 546 def YahooFinance.get_HistoricalQuotes_days( symbol, days, &block ) endDate = Date.today() startDate = Date.today() - days YahooFinance.get_HistoricalQuotes( symbol, startDate, endDate, &block ) end
# File lib/assets/yfinadaptor/yfinadaptor.rb, line 525 def YahooFinance.get_candlestick_data(ticker) data = YahooFinance::get_historical_quotes_days(ticker, 1000) return data.map{|new_data| [Time.parse(new_data[0]).to_i*1000, new_data[1].to_f, new_data[2].to_f, new_data[3].to_f, new_data[4].to_f]}.sort_by{|d| d[0]} end
# File lib/assets/yfinadaptor/yfinadaptor.rb, line 224 def YahooFinance.get_extended_quotes( symbols ) csvquotes = YahooFinance::get( symbols, EXTENDEDHASH.keys.join ) ret = Hash.new CSV.parse( csvquotes ) do |row| qt = ExtendedQuote.new( row ) if block_given? yield qt end ret[qt.symbol] = qt end ret end
# File lib/assets/yfinadaptor/yfinadaptor.rb, line 520 def YahooFinance.get_graph_data(ticker) data = YahooFinance::get_historical_quotes_days(ticker, 1000) return data.map{|new_data| [Time.parse(new_data[0]).to_i*1000, new_data[4].to_f]}.sort_by{|d| d[0]} end
# File lib/assets/yfinadaptor/yfinadaptor.rb, line 470 def YahooFinance.get_historical_quotes( symbol, startDate, endDate ) rows = [] rowct = 0 gotchunk = false # # Yahoo is only able to provide 200 data points at a time for Some # "international" markets. We want to download all of the data # points between the startDate and endDate, regardless of how many # 200 data point chunks it comes in. In this section we download # as many chunks as needed to get all of the data points. # begin gotchunk = false r = YahooFinance.retrieve_raw_historical_quotes( symbol, startDate, endDate ) if block_given? # If we were given a block, yield to it for every row of data # downloaded. r.each { |row| yield row } else rows += r end # Is this a chunk? if r.length == 200 # Adjust the endDate for when we retrieve the next chunk. endDate = HistoricalQuote.parse_date_to_Date( r.last[0] ) - 1 # Marke this as a chunk so do the download again with the new endDate. gotchunk = true end end while gotchunk if block_given? # If we have already yielded to every row, just return nil. return nil else # Otherwise return the big array of arrays. rows end end
# File lib/assets/yfinadaptor/yfinadaptor.rb, line 514 def YahooFinance.get_historical_quotes_days( symbol, days, &block ) endDate = Date.today() startDate = Date.today() - days YahooFinance.get_historical_quotes( symbol, startDate, endDate, &block ) end
# File lib/assets/yfinadaptor/yfinadaptor.rb, line 199 def YahooFinance.get_quotes( quote_class, symbols, &block ) if quote_class == YahooFinance::StandardQuote return get_standard_quotes( symbols, &block ) elsif quote_class == YahooFinance::ExtendedQuote return get_extended_quotes( symbols, &block ) elsif quote_class == YahooFinance::RealTimeQuote return get_realtime_quotes( symbols, &block ) else # Use the standard quote if the given quote_class was not recoginized. return get_standard_quotes( symbols, &block ) end end
# File lib/assets/yfinadaptor/yfinadaptor.rb, line 212 def YahooFinance.get_realtime_quotes( symbols ) csvquotes = YahooFinance::get( symbols, REALTIMEHASH.keys.join ) ret = Hash.new CSV.parse( csvquotes ) do |row| qt = RealTimeQuote.new( row ) if block_given? yield qt end ret[qt.symbol] = qt end ret end
# File lib/assets/yfinadaptor/yfinadaptor.rb, line 236 def YahooFinance.get_standard_quotes( symbols ) csvquotes = YahooFinance::get( symbols, STDHASH.keys.join ) ret = Hash.new CSV.parse( csvquotes ) do |row| qt = StandardQuote.new( row ) if block_given? yield qt end ret[qt.symbol] = qt end ret end
# File lib/assets/yfinadaptor/yfinadaptor.rb, line 435 def YahooFinance.retrieve_raw_historical_quotes( symbol, startDate, endDate ) # Don't try to download anything if the starting date is before # the end date. return [] if startDate > endDate proxy = ENV['http_proxy'] ? URI.parse( ENV['http_proxy'] ) : OpenStruct.new Net::HTTP::Proxy( proxy.host, proxy.port, proxy.user, proxy.password ).start( "itable.finance.yahoo.com", 80 ) { |http| #Net::HTTP.start( "itable.finance.yahoo.com", 80 ) { |http| query = "/table.csv?s=#{symbol}&g=d" + "&a=#{startDate.month-1}&b=#{startDate.mday}&c=#{startDate.year}" + "&d=#{endDate.month-1}&e=#{endDate.mday}&f=#{endDate.year.to_s}" #puts "#{query}" response = http.get( query ) #puts "#{response.body}" body = response.body.chomp # If we don't get the first line like this, there was something # wrong with the data (404 error, new data formet, etc). return [] if body !~ /Date,Open,High,Low,Close,Volume,Adj Close/ # Parse into an array of arrays. rows = CSV.parse( body ) # Remove the first array since it is just the field headers. rows.shift #puts "#{rows.length}" return rows } end