yahoo-finance 0.0.2 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/HISTORY +14 -3
- data/{README → README.md} +101 -70
- data/lib/yahoo-finance.rb +1 -0
- data/lib/yahoo_finance.rb +201 -169
- metadata +42 -43
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: c6a015a18c3319e26d41dbacde9bf2d76c5db9bf
|
4
|
+
data.tar.gz: 9cde1310a1f8aa6585f1907a5300b732a3177410
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 451ea63a655451a65a446c4d8596b32907140d9b01fbfd83353fbf1c401bc334e521eaa873caff4defdaae6348ecac853c959796efb4ff6270d0e4a8548fa4ce
|
7
|
+
data.tar.gz: 95647240723348756960cab2ecd423b9df7f98f50b5414fba507a17b1c7bb876bf1c77c0f17943abdd927f6d66221167dd3f8c87eb136f55586fe09bbfca4c65
|
data/HISTORY
CHANGED
@@ -1,8 +1,19 @@
|
|
1
|
-
|
1
|
+
0.2.0 - Nov 24, 2014
|
2
|
+
====================
|
3
|
+
* Allow fetching a single symbol with the `quote` method
|
4
|
+
* Multiple fixes to comply w/ Yahoo API changes
|
5
|
+
* Optional start/end dates (the quotes method now takes an options hash)
|
6
|
+
|
7
|
+
0.1.0 - Apr 05, 2011
|
8
|
+
===============================
|
9
|
+
* Use ruby CSV
|
10
|
+
* Refactor
|
11
|
+
|
12
|
+
0.0.2 - Aug 05, 2007
|
2
13
|
===============================
|
3
14
|
* Type-casting: pass the option :raw => false to the quotes method to get columns converted from string to specific types (mostly float, date, time and datetime)
|
4
15
|
* Historical quotes: a convenient method to get historical quotes for a given symbol in an interval, getting either daily, weekly or monthly quotes - or dividend yields only
|
5
16
|
|
6
|
-
|
17
|
+
0.0.1 - Aug 04, 2007
|
7
18
|
===============================
|
8
|
-
* Initial implementation - no bells, no whristles :)
|
19
|
+
* Initial implementation - no bells, no whristles :)
|
data/{README → README.md}
RENAMED
@@ -1,131 +1,162 @@
|
|
1
|
-
Ruby's Yahoo Finance Wrapper
|
2
|
-
============================
|
3
|
-
|
1
|
+
# Ruby's Yahoo Finance Wrapper
|
4
2
|
A dead simple wrapper for yahoo finance quotes end-point.
|
5
3
|
|
6
|
-
|
4
|
+
## Installation:
|
5
|
+
|
6
|
+
`gem install 'yahoo-finance'`
|
7
|
+
`require 'yahoo_finance'`
|
8
|
+
|
9
|
+
If using bundler:
|
10
|
+
`gem 'yahoo-finance', require: 'yahoo_finance'`
|
11
|
+
|
12
|
+
## Usage:
|
7
13
|
|
8
|
-
|
9
|
-
----------------------------------------------
|
10
|
-
Just pass an array of symbols (stock names, indexes, exchange rates) and a list of fields you want:
|
14
|
+
### Getting latest quotes for a set of symbols
|
11
15
|
|
16
|
+
Pass an array of valid symbols (stock names, indexes, exchange rates) and a list of fields you want:
|
17
|
+
|
18
|
+
```ruby
|
12
19
|
data = YahooFinance.quotes(["BVSP", "NATU3.SA", "USDJPY=X"], [:ask, :bid, :last_trade_date])
|
13
|
-
|
14
|
-
puts data[0].symbol + " value is: " + data[0].ask
|
20
|
+
```
|
15
21
|
|
16
|
-
|
22
|
+
Data is now an array of results. You now have accessor methods to retrieve the data, with the return results being strings:
|
17
23
|
|
18
|
-
|
19
|
-
# ask will be a float here:
|
24
|
+
```ruby
|
20
25
|
puts data[0].symbol + " value is: " + data[0].ask
|
26
|
+
```
|
27
|
+
|
28
|
+
Passing `raw: false` will return numerical values
|
29
|
+
|
30
|
+
```ruby
|
31
|
+
data = YahooFinance.quotes(["BVSP", "NATU3.SA", "USDJPY=X"], [:ask, :bid, :last_trade_date], { raw: false } )
|
32
|
+
data[0].ask # This is now a float
|
33
|
+
```
|
21
34
|
|
22
35
|
The full list of fields follows:
|
23
36
|
|
37
|
+
``` ruby
|
38
|
+
:after_hours_change_real_time
|
39
|
+
:annualized_gain
|
24
40
|
:ask
|
25
|
-
:
|
41
|
+
:ask_real_time
|
26
42
|
:ask_size
|
43
|
+
:average_daily_volume
|
27
44
|
:bid
|
28
|
-
:ask_real_time
|
29
45
|
:bid_real_time
|
30
|
-
:
|
31
|
-
:
|
32
|
-
:chance_and_percent_change
|
46
|
+
:bid_size
|
47
|
+
:book_value
|
33
48
|
:change
|
34
|
-
:
|
49
|
+
:change_and_percent_change
|
50
|
+
:change_from_200_day_moving_average
|
51
|
+
:change_from_50_day_moving_average
|
52
|
+
:change_from_52_week_high
|
53
|
+
:change_From_52_week_low
|
54
|
+
:change_in_percent
|
55
|
+
:change_percent_realtime
|
35
56
|
:change_real_time
|
36
|
-
:
|
57
|
+
:close
|
58
|
+
:comission
|
59
|
+
:day_value_change
|
60
|
+
:day_value_change_realtime
|
61
|
+
:days_range
|
62
|
+
:days_range_realtime
|
63
|
+
:dividend_pay_date
|
37
64
|
:dividend_per_share
|
38
|
-
:
|
39
|
-
:trade_date
|
65
|
+
:dividend_yield
|
40
66
|
:earnings_per_share
|
41
|
-
:
|
67
|
+
:ebitda
|
42
68
|
:eps_estimate_current_year
|
43
|
-
:eps_estimate_next_year
|
44
69
|
:eps_estimate_next_quarter
|
70
|
+
:eps_estimate_next_year
|
71
|
+
:error_indicator
|
72
|
+
:ex_dividend_date
|
45
73
|
:float_shares
|
46
|
-
:low
|
47
74
|
:high
|
48
|
-
:low_52_weeks
|
49
75
|
:high_52_weeks
|
50
|
-
:
|
51
|
-
:annualized_gain
|
76
|
+
:high_limit
|
52
77
|
:holdings_gain
|
78
|
+
:holdings_gain_percent
|
53
79
|
:holdings_gain_percent_realtime
|
54
80
|
:holdings_gain_realtime
|
55
|
-
:
|
56
|
-
:
|
57
|
-
:
|
58
|
-
:
|
59
|
-
:ebitda
|
60
|
-
:change_From_52_week_low
|
61
|
-
:percent_change_from_52_week_low
|
81
|
+
:holdings_value
|
82
|
+
:holdings_value_realtime
|
83
|
+
:last_trade_date
|
84
|
+
:last_trade_price
|
62
85
|
:last_trade_realtime_withtime
|
63
|
-
:change_percent_realtime
|
64
86
|
:last_trade_size
|
65
|
-
:
|
66
|
-
:percent_change_from_52_week_high
|
87
|
+
:last_trade_time
|
67
88
|
:last_trade_with_time
|
68
|
-
:
|
69
|
-
:
|
70
|
-
:high_limit
|
89
|
+
:low
|
90
|
+
:low_52_weeks
|
71
91
|
:low_limit
|
72
|
-
:
|
73
|
-
:
|
74
|
-
:
|
92
|
+
:market_cap_realtime
|
93
|
+
:market_capitalization
|
94
|
+
:more_info
|
75
95
|
:moving_average_200_day
|
76
|
-
:
|
77
|
-
:percent_change_from_200_day_moving_average
|
78
|
-
:change_from_50_day_moving_average
|
79
|
-
:percent_change_from_50_day_moving_average
|
96
|
+
:moving_average_50_day
|
80
97
|
:name
|
81
98
|
:notes
|
99
|
+
:one_year_target_price
|
82
100
|
:open
|
83
|
-
:
|
84
|
-
:price_paid
|
85
|
-
:change_in_percent
|
86
|
-
:price_per_sales
|
87
|
-
:price_per_book
|
88
|
-
:ex_dividend_date
|
101
|
+
:order_book
|
89
102
|
:pe_ratio
|
90
|
-
:dividend_pay_date
|
91
103
|
:pe_ratio_realtime
|
92
104
|
:peg_ratio
|
105
|
+
:percent_change_from_200_day_moving_average
|
106
|
+
:percent_change_from_50_day_moving_average
|
107
|
+
:percent_change_from_52_week_high
|
108
|
+
:percent_change_from_52_week_low
|
109
|
+
:previous_close
|
93
110
|
:price_eps_estimate_current_year
|
94
111
|
:price_eps_Estimate_next_year
|
95
|
-
:
|
112
|
+
:price_paid
|
113
|
+
:price_per_book
|
114
|
+
:price_per_sales
|
96
115
|
:shares_owned
|
97
116
|
:short_ratio
|
98
|
-
:
|
99
|
-
:
|
117
|
+
:stock_exchange
|
118
|
+
:symbol
|
100
119
|
:ticker_trend
|
101
|
-
:
|
120
|
+
:trade_date
|
121
|
+
:trade_links
|
102
122
|
:volume
|
103
|
-
:holdings_value
|
104
|
-
:holdings_value_realtime
|
105
123
|
:weeks_range_52
|
106
|
-
|
107
|
-
:day_value_change_realtime
|
108
|
-
:stock_exchange
|
109
|
-
:dividend_yield
|
110
|
-
|
124
|
+
```
|
111
125
|
|
112
|
-
|
113
|
-
-----------------------------
|
126
|
+
### Getting historical quotes
|
114
127
|
|
115
128
|
Here you can specify a date range and a symbol, and retrieve historical data for it.
|
116
129
|
The last parameter (options) can include, besides the "raw" option, a "period" option.
|
117
130
|
The period can be specified as :daily, :monthly, :weekly or :dividends_only
|
118
131
|
|
119
|
-
|
132
|
+
```ruby
|
133
|
+
data = YahooFinance.historical_quotes("AAPL") # entire historical data
|
134
|
+
```
|
135
|
+
|
136
|
+
or
|
137
|
+
|
138
|
+
```ruby
|
139
|
+
data = YahooFinance.historical_quotes("AAPL", { start_date: Time::now-(24*60*60*10), end_date: Time::now }) # 10 days worth of data
|
140
|
+
```
|
120
141
|
|
121
142
|
or
|
122
143
|
|
123
|
-
|
144
|
+
``` ruby
|
145
|
+
data = YahooFinance.historical_quotes("AAPL", { raw: false, period: :monthly })
|
146
|
+
```
|
124
147
|
|
148
|
+
### Getting splits
|
125
149
|
|
150
|
+
You can also retrieve split data.
|
126
151
|
|
152
|
+
```ruby
|
153
|
+
data = YahooFinance.splits('AAPL', :start_date => Date.today - 10*365)
|
154
|
+
data[0].date # Date<2014-06-09>
|
155
|
+
data[0].before # 1
|
156
|
+
data[0].after # 7
|
157
|
+
```
|
127
158
|
|
128
159
|
|
129
160
|
Enjoy! :-)
|
130
161
|
|
131
|
-
- Herval (
|
162
|
+
- Herval (hervalfreire@gmail.com)
|
@@ -0,0 +1 @@
|
|
1
|
+
require 'yahoo_finance'
|
data/lib/yahoo_finance.rb
CHANGED
@@ -1,100 +1,112 @@
|
|
1
1
|
require 'open-uri'
|
2
2
|
require 'ostruct'
|
3
|
+
require 'json'
|
4
|
+
|
5
|
+
if RUBY_VERSION >= "1.9"
|
6
|
+
require 'csv'
|
7
|
+
else
|
8
|
+
require 'rubygems'
|
9
|
+
require 'fastercsv'
|
10
|
+
class Object
|
11
|
+
CSV = FCSV
|
12
|
+
alias_method :CSV, :FCSV
|
13
|
+
end
|
14
|
+
end
|
3
15
|
|
4
16
|
class YahooFinance
|
5
|
-
|
6
|
-
VERSION = '0.0
|
17
|
+
|
18
|
+
VERSION = '0.2.0'
|
7
19
|
|
8
20
|
COLUMNS = {
|
9
|
-
:ask =>
|
10
|
-
:average_daily_volume =>
|
11
|
-
:ask_size =>
|
12
|
-
:bid =>
|
13
|
-
:ask_real_time =>
|
14
|
-
:bid_real_time =>
|
15
|
-
:book_value =>
|
16
|
-
:bid_size =>
|
17
|
-
:
|
18
|
-
:change =>
|
19
|
-
:comission =>
|
20
|
-
:change_real_time =>
|
21
|
-
:after_hours_change_real_time =>
|
22
|
-
:dividend_per_share =>
|
23
|
-
:last_trade_date =>
|
24
|
-
:trade_date =>
|
25
|
-
:earnings_per_share =>
|
26
|
-
:error_indicator =>
|
27
|
-
:eps_estimate_current_year =>
|
28
|
-
:eps_estimate_next_year =>
|
29
|
-
:eps_estimate_next_quarter =>
|
30
|
-
:float_shares =>
|
31
|
-
:low =>
|
32
|
-
:high =>
|
33
|
-
:low_52_weeks =>
|
34
|
-
:high_52_weeks =>
|
35
|
-
:holdings_gain_percent =>
|
36
|
-
:annualized_gain =>
|
37
|
-
:holdings_gain =>
|
38
|
-
:holdings_gain_percent_realtime =>
|
39
|
-
:holdings_gain_realtime =>
|
40
|
-
:more_info =>
|
41
|
-
:order_book =>
|
42
|
-
:market_capitalization =>
|
43
|
-
:market_cap_realtime =>
|
44
|
-
:ebitda =>
|
45
|
-
:change_From_52_week_low =>
|
46
|
-
:percent_change_from_52_week_low =>
|
47
|
-
:last_trade_realtime_withtime =>
|
48
|
-
:change_percent_realtime =>
|
49
|
-
:last_trade_size =>
|
50
|
-
:change_from_52_week_high =>
|
51
|
-
:percent_change_from_52_week_high =>
|
52
|
-
:last_trade_with_time =>
|
53
|
-
:last_trade_price =>
|
54
|
-
:close =>
|
55
|
-
:high_limit =>
|
56
|
-
:low_limit =>
|
57
|
-
:days_range =>
|
58
|
-
:days_range_realtime =>
|
59
|
-
:moving_average_50_day =>
|
60
|
-
:moving_average_200_day =>
|
61
|
-
:change_from_200_day_moving_average =>
|
62
|
-
:percent_change_from_200_day_moving_average =>
|
63
|
-
:change_from_50_day_moving_average =>
|
64
|
-
:percent_change_from_50_day_moving_average =>
|
65
|
-
:name =>
|
66
|
-
:notes =>
|
67
|
-
:open =>
|
68
|
-
:previous_close =>
|
69
|
-
:price_paid =>
|
70
|
-
:change_in_percent =>
|
71
|
-
:price_per_sales =>
|
72
|
-
:price_per_book =>
|
73
|
-
:ex_dividend_date =>
|
74
|
-
:pe_ratio =>
|
75
|
-
:dividend_pay_date =>
|
76
|
-
:pe_ratio_realtime =>
|
77
|
-
:peg_ratio =>
|
78
|
-
:price_eps_estimate_current_year =>
|
79
|
-
:price_eps_Estimate_next_year =>
|
80
|
-
:symbol =>
|
81
|
-
:shares_owned =>
|
82
|
-
:short_ratio =>
|
83
|
-
:last_trade_time =>
|
84
|
-
:trade_links =>
|
85
|
-
:ticker_trend =>
|
86
|
-
:one_year_target_price =>
|
87
|
-
:volume =>
|
88
|
-
:holdings_value =>
|
89
|
-
:holdings_value_realtime =>
|
90
|
-
:weeks_range_52 =>
|
91
|
-
:day_value_change =>
|
92
|
-
:day_value_change_realtime =>
|
93
|
-
:stock_exchange =>
|
94
|
-
:dividend_yield =>
|
95
|
-
:adjusted_close =>
|
21
|
+
:ask => "a",
|
22
|
+
:average_daily_volume => "a2",
|
23
|
+
:ask_size => "a5",
|
24
|
+
:bid => "b",
|
25
|
+
:ask_real_time => "b2",
|
26
|
+
:bid_real_time => "b3",
|
27
|
+
:book_value => "b4",
|
28
|
+
:bid_size => "b6",
|
29
|
+
:change_and_percent_change => "c",
|
30
|
+
:change => "c1",
|
31
|
+
:comission => "c3",
|
32
|
+
:change_real_time => "c6",
|
33
|
+
:after_hours_change_real_time => "c8",
|
34
|
+
:dividend_per_share => "d",
|
35
|
+
:last_trade_date => "d1",
|
36
|
+
:trade_date => "d2",
|
37
|
+
:earnings_per_share => "e",
|
38
|
+
:error_indicator => "e1",
|
39
|
+
:eps_estimate_current_year => "e7",
|
40
|
+
:eps_estimate_next_year => "e8",
|
41
|
+
:eps_estimate_next_quarter => "e9",
|
42
|
+
:float_shares => "f6",
|
43
|
+
:low => "g",
|
44
|
+
:high => "h",
|
45
|
+
:low_52_weeks => "j",
|
46
|
+
:high_52_weeks => "k",
|
47
|
+
:holdings_gain_percent => "g1",
|
48
|
+
:annualized_gain => "g3",
|
49
|
+
:holdings_gain => "g4",
|
50
|
+
:holdings_gain_percent_realtime => "g5",
|
51
|
+
:holdings_gain_realtime => "g6",
|
52
|
+
:more_info => "i",
|
53
|
+
:order_book => "i5",
|
54
|
+
:market_capitalization => "j1",
|
55
|
+
:market_cap_realtime => "j3",
|
56
|
+
:ebitda => "j4",
|
57
|
+
:change_From_52_week_low => "j5",
|
58
|
+
:percent_change_from_52_week_low => "j6",
|
59
|
+
:last_trade_realtime_withtime => "k1",
|
60
|
+
:change_percent_realtime => "k2",
|
61
|
+
:last_trade_size => "k3",
|
62
|
+
:change_from_52_week_high => "k4",
|
63
|
+
:percent_change_from_52_week_high => "k5",
|
64
|
+
:last_trade_with_time => "l",
|
65
|
+
:last_trade_price => "l1",
|
66
|
+
:close => "l1",
|
67
|
+
:high_limit => "l2",
|
68
|
+
:low_limit => "l3",
|
69
|
+
:days_range => "m",
|
70
|
+
:days_range_realtime => "m2",
|
71
|
+
:moving_average_50_day => "m3",
|
72
|
+
:moving_average_200_day => "m4",
|
73
|
+
:change_from_200_day_moving_average => "m5",
|
74
|
+
:percent_change_from_200_day_moving_average => "m6",
|
75
|
+
:change_from_50_day_moving_average => "m7",
|
76
|
+
:percent_change_from_50_day_moving_average => "m8",
|
77
|
+
:name => "n",
|
78
|
+
:notes => "n4",
|
79
|
+
:open => "o",
|
80
|
+
:previous_close => "p",
|
81
|
+
:price_paid => "p1",
|
82
|
+
:change_in_percent => "p2",
|
83
|
+
:price_per_sales => "p5",
|
84
|
+
:price_per_book => "p6",
|
85
|
+
:ex_dividend_date => "q",
|
86
|
+
:pe_ratio => "r",
|
87
|
+
:dividend_pay_date => "r1",
|
88
|
+
:pe_ratio_realtime => "r2",
|
89
|
+
:peg_ratio => "r5",
|
90
|
+
:price_eps_estimate_current_year => "r6",
|
91
|
+
:price_eps_Estimate_next_year => "r7",
|
92
|
+
:symbol => "s",
|
93
|
+
:shares_owned => "s1",
|
94
|
+
:short_ratio => "s7",
|
95
|
+
:last_trade_time => "t1",
|
96
|
+
:trade_links => "t6",
|
97
|
+
:ticker_trend => "t7",
|
98
|
+
:one_year_target_price => "t8",
|
99
|
+
:volume => "v",
|
100
|
+
:holdings_value => "v1",
|
101
|
+
:holdings_value_realtime => "v7",
|
102
|
+
:weeks_range_52 => "w",
|
103
|
+
:day_value_change => "w1",
|
104
|
+
:day_value_change_realtime => "w4",
|
105
|
+
:stock_exchange => "x",
|
106
|
+
:dividend_yield => "y",
|
107
|
+
:adjusted_close => nil # this one only comes in historical quotes
|
96
108
|
}
|
97
|
-
|
109
|
+
|
98
110
|
HISTORICAL_MODES = {
|
99
111
|
:daily => "d",
|
100
112
|
:weekly => "w",
|
@@ -102,98 +114,118 @@ require 'ostruct'
|
|
102
114
|
:dividends_only => "v"
|
103
115
|
}
|
104
116
|
|
105
|
-
|
117
|
+
SYMBOLS_PER_REQUEST = 50
|
106
118
|
|
107
119
|
# retrieve the quote data (an OpenStruct per quote)
|
108
120
|
# the options param can be used to specify the following attributes:
|
109
121
|
# :raw - if true, each column will be converted (to numbers, dates, etc)
|
110
|
-
def self.quotes(symbols_array, columns_array = [:symbol, :last_trade_price, :last_trade_date, :change, :previous_close], options = {
|
111
|
-
|
112
|
-
cols = columns_array.collect { |c| COLUMNS[c][0] }.join
|
113
|
-
types = columns_array.collect { |c| COLUMNS[c][1] }.join if options[:raw]
|
114
|
-
|
115
|
-
i = 0
|
116
|
-
k = 0
|
117
|
-
while i < symbols_array.size
|
118
|
-
subset = symbols_array[i..i+ROWS_PER_REQUEST]
|
119
|
-
symb_str = subset.collect { |s| "#{s}" }.join("+")
|
120
|
-
|
121
|
-
lines = read_lines(symb_str, cols)
|
122
|
-
for line in lines
|
123
|
-
ret << extract_data(line, symbols_array[k], columns_array, options)
|
124
|
-
k+=1
|
125
|
-
end
|
122
|
+
def self.quotes(symbols_array, columns_array = [:symbol, :last_trade_price, :last_trade_date, :change, :previous_close], options = { })
|
123
|
+
options[:raw] ||= true
|
126
124
|
|
127
|
-
|
128
|
-
|
125
|
+
ret = []
|
126
|
+
symbols_array.each_slice(SYMBOLS_PER_REQUEST) do |symbols|
|
127
|
+
read_quotes(symbols.join("+"), columns_array).map do |row|
|
128
|
+
ret << OpenStruct.new(row.to_hash)
|
129
|
+
end
|
130
|
+
end
|
131
|
+
ret
|
132
|
+
end
|
129
133
|
|
130
|
-
|
134
|
+
def self.quote(symbol, columns_array = [:symbol, :last_trade_price, :last_trade_date, :change, :previous_close], options = { })
|
135
|
+
options[:raw] ||= true
|
136
|
+
quotes([symbol], columns_array, options).first
|
131
137
|
end
|
132
|
-
|
133
|
-
def self.historical_quotes(symbol,
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
cols = [:dividend_pay_date, :dividend_yield]
|
140
|
-
else
|
141
|
-
cols = [:trade_date, :open, :high, :low, :close, :volume, :adjusted_close]
|
142
|
-
end
|
143
|
-
|
144
|
-
for line in lines
|
145
|
-
ret << extract_data(line, symbol, cols, options)
|
146
|
-
end
|
147
|
-
|
148
|
-
return ret
|
138
|
+
|
139
|
+
def self.historical_quotes(symbol, options = {})
|
140
|
+
options[:raw] ||= true
|
141
|
+
options[:period] ||= :daily
|
142
|
+
read_historical(symbol, options).map do |row|
|
143
|
+
OpenStruct.new(row.to_hash.merge(:symbol => symbol))
|
144
|
+
end
|
149
145
|
end
|
150
|
-
|
151
|
-
private
|
152
|
-
|
153
|
-
def self.extract_data(raw_line, symbol, columns_array, options)
|
154
|
-
datamap = {}
|
155
|
-
datamap[:symbol] = symbol
|
156
|
-
data = raw_line.split(',')
|
157
|
-
|
158
|
-
for j in (0..data.size-1)
|
159
|
-
if !options[:raw]
|
160
|
-
datamap[columns_array[j]] = format(data[j], COLUMNS[columns_array[j]][1])
|
161
|
-
else
|
162
|
-
datamap[columns_array[j]] = data[j]
|
163
|
-
end
|
164
|
-
end
|
165
146
|
|
166
|
-
|
147
|
+
def self.symbols(query)
|
148
|
+
ret = []
|
149
|
+
read_symbols(query).each do |row|
|
150
|
+
ret << OpenStruct.new(row)
|
151
|
+
end
|
152
|
+
ret
|
167
153
|
end
|
168
|
-
|
169
|
-
def self.
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
else str
|
154
|
+
|
155
|
+
def self.splits(symbol, options = {})
|
156
|
+
rows = read_splits(symbol, options).select{|row| row[0] == 'SPLIT'}
|
157
|
+
rows.map do |row|
|
158
|
+
type, date, value = row
|
159
|
+
after, before = value.split(':')
|
160
|
+
OpenStruct.new(:symbol => symbol, :date => Date.strptime(date.strip, '%Y%m%d'), :before => before.to_i, :after => after.to_i)
|
176
161
|
end
|
177
162
|
end
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
163
|
+
|
164
|
+
private
|
165
|
+
|
166
|
+
def self.read_quotes(symb_str, cols)
|
167
|
+
columns = "#{cols.map {|col| COLUMNS[col] }.join('')}"
|
168
|
+
conn = open("http://download.finance.yahoo.com/d/quotes.csv?s=#{URI.escape(symb_str)}&f=#{columns}")
|
169
|
+
CSV.parse(conn.read, :headers => cols)
|
170
|
+
end
|
171
|
+
|
172
|
+
def self.read_historical(symbol, options)
|
173
|
+
params = {
|
174
|
+
:s => URI.escape(symbol),
|
175
|
+
:g => HISTORICAL_MODES[options[:period]],
|
176
|
+
:ignore => '.csv',
|
177
|
+
}
|
178
|
+
if options[:start_date]
|
179
|
+
params[:a] = options[:start_date].month-1
|
180
|
+
params[:b] = options[:start_date].day
|
181
|
+
params[:c] = options[:start_date].year
|
182
|
+
end
|
183
|
+
if options[:end_date]
|
184
|
+
params[:d] = options[:end_date].month-1
|
185
|
+
params[:e] = options[:end_date].day
|
186
|
+
params[:f] = options[:end_date].year
|
187
|
+
end
|
188
|
+
|
189
|
+
url = "http://ichart.finance.yahoo.com/table.csv?#{params.map{|k, v| "#{k}=#{v}"}.join('&')}"
|
190
|
+
conn = open(url)
|
191
|
+
cols =
|
192
|
+
if options[:period] == :dividends_only
|
193
|
+
[:dividend_pay_date, :dividend_yield]
|
194
|
+
else
|
195
|
+
[:trade_date, :open, :high, :low, :close, :volume, :adjusted_close]
|
196
|
+
end
|
197
|
+
result = CSV.parse(conn.read, :headers => cols) #:first_row, :header_converters => :symbol)
|
198
|
+
result.delete(0) # drop returned header
|
199
|
+
result
|
184
200
|
end
|
185
|
-
|
186
|
-
def self.
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
201
|
+
|
202
|
+
def self.read_splits(symbol, options)
|
203
|
+
params = {
|
204
|
+
:s => URI.escape(symbol),
|
205
|
+
:g => 'v'
|
206
|
+
}
|
207
|
+
if options[:start_date]
|
208
|
+
params[:a] = options[:start_date].month-1
|
209
|
+
params[:b] = options[:start_date].day
|
210
|
+
params[:c] = options[:start_date].year
|
192
211
|
end
|
193
|
-
|
212
|
+
if options[:end_date]
|
213
|
+
params[:d] = options[:end_date].month-1
|
214
|
+
params[:e] = options[:end_date].day
|
215
|
+
params[:f] = options[:end_date].year
|
216
|
+
end
|
217
|
+
|
218
|
+
url = "http://ichart.finance.yahoo.com/x?#{params.map{|k, v| "#{k}=#{v}"}.join('&')}"
|
219
|
+
conn = open(url)
|
220
|
+
CSV.parse(conn.read)
|
221
|
+
end
|
194
222
|
|
195
|
-
|
196
|
-
|
223
|
+
def self.read_symbols(query)
|
224
|
+
conn = open("http://d.yimg.com/autoc.finance.yahoo.com/autoc?query=#{query}&callback=YAHOO.Finance.SymbolSuggest.ssCallback")
|
225
|
+
result = conn.read
|
226
|
+
result.sub!('YAHOO.Finance.SymbolSuggest.ssCallback(', '').chomp!(')')
|
227
|
+
json_result = JSON.parse(result)
|
228
|
+
json_result["ResultSet"]["Result"]
|
197
229
|
end
|
198
|
-
|
199
|
-
end
|
230
|
+
|
231
|
+
end
|
metadata
CHANGED
@@ -1,49 +1,48 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
2
|
-
rubygems_version: 0.9.4
|
3
|
-
specification_version: 1
|
1
|
+
--- !ruby/object:Gem::Specification
|
4
2
|
name: yahoo-finance
|
5
|
-
version: !ruby/object:Gem::Version
|
6
|
-
version: 0.0
|
7
|
-
date: 2007-08-05 00:00:00 -03:00
|
8
|
-
summary: A wrapper to Yahoo! Finance market data (quotes and exchange rates) feed
|
9
|
-
require_paths:
|
10
|
-
- lib
|
11
|
-
email: herval@hervalicio.us
|
12
|
-
homepage: http://hervalicio.us/blog
|
13
|
-
rubyforge_project:
|
14
|
-
description:
|
15
|
-
autorequire: yahoo_finance
|
16
|
-
default_executable:
|
17
|
-
bindir: bin
|
18
|
-
has_rdoc: false
|
19
|
-
required_ruby_version: !ruby/object:Gem::Version::Requirement
|
20
|
-
requirements:
|
21
|
-
- - ">"
|
22
|
-
- !ruby/object:Gem::Version
|
23
|
-
version: 0.0.0
|
24
|
-
version:
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.2.0
|
25
5
|
platform: ruby
|
26
|
-
|
27
|
-
cert_chain:
|
28
|
-
post_install_message:
|
29
|
-
authors:
|
6
|
+
authors:
|
30
7
|
- Herval Freire
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
extra_rdoc_files:
|
40
|
-
- README
|
41
|
-
- HISTORY
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2014-11-24 00:00:00.000000000 Z
|
12
|
+
dependencies: []
|
13
|
+
description:
|
14
|
+
email: herval@hervalicio.us
|
42
15
|
executables: []
|
43
|
-
|
44
16
|
extensions: []
|
45
|
-
|
17
|
+
extra_rdoc_files:
|
18
|
+
- README.md
|
19
|
+
- HISTORY
|
20
|
+
files:
|
21
|
+
- HISTORY
|
22
|
+
- README.md
|
23
|
+
- lib/yahoo-finance.rb
|
24
|
+
- lib/yahoo_finance.rb
|
25
|
+
homepage: http://hervalicio.us/blog
|
26
|
+
licenses: []
|
27
|
+
metadata: {}
|
28
|
+
post_install_message:
|
29
|
+
rdoc_options: []
|
30
|
+
require_paths:
|
31
|
+
- lib
|
32
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
33
|
+
requirements:
|
34
|
+
- - ">="
|
35
|
+
- !ruby/object:Gem::Version
|
36
|
+
version: '0'
|
37
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
38
|
+
requirements:
|
39
|
+
- - ">="
|
40
|
+
- !ruby/object:Gem::Version
|
41
|
+
version: '0'
|
46
42
|
requirements: []
|
47
|
-
|
48
|
-
|
49
|
-
|
43
|
+
rubyforge_project:
|
44
|
+
rubygems_version: 2.2.2
|
45
|
+
signing_key:
|
46
|
+
specification_version: 4
|
47
|
+
summary: A wrapper to Yahoo! Finance market data (quotes and exchange rates) feed
|
48
|
+
test_files: []
|