yahoo_finance 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +4 -0
- data/Gemfile +4 -0
- data/Rakefile +1 -0
- data/lib/yahoo_finance/historical.rb +74 -0
- data/lib/yahoo_finance/version.rb +3 -0
- data/lib/yahoo_finance.rb +5 -0
- data/spec/historical_spec.rb +50 -0
- data/spec/spec_helper.rb +1 -0
- data/yahoo_finance.gemspec +22 -0
- metadata +73 -0
data/.gitignore
ADDED
data/Gemfile
ADDED
data/Rakefile
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require "bundler/gem_tasks"
|
@@ -0,0 +1,74 @@
|
|
1
|
+
require "open-uri"
|
2
|
+
require "csv"
|
3
|
+
require "ostruct"
|
4
|
+
|
5
|
+
module YahooFinance
|
6
|
+
class Historical
|
7
|
+
include Enumerable
|
8
|
+
|
9
|
+
attr_reader :ticker, :start_date, :end_date, :group
|
10
|
+
|
11
|
+
BASE_URL = "http://ichart.finance.yahoo.com/table.csv"
|
12
|
+
|
13
|
+
GROUPS = {
|
14
|
+
:daily => "d",
|
15
|
+
:weekly => "w",
|
16
|
+
:monthly => "m"
|
17
|
+
}
|
18
|
+
|
19
|
+
def self.daily(ticker, options = {})
|
20
|
+
new(ticker, options.merge(:group => GROUPS[:daily]))
|
21
|
+
end
|
22
|
+
|
23
|
+
def self.weekly(ticker, options = {})
|
24
|
+
new(ticker, options.merge(:group => GROUPS[:weekly]))
|
25
|
+
end
|
26
|
+
|
27
|
+
def self.monthly(ticker, options = {})
|
28
|
+
new(ticker, options.merge(:group => GROUPS[:monthly]))
|
29
|
+
end
|
30
|
+
|
31
|
+
def initialize(ticker, options = {})
|
32
|
+
@ticker = ticker
|
33
|
+
@start_date = options[:from]
|
34
|
+
@end_date = options[:to]
|
35
|
+
@group = options[:group] || GROUPS[:daily]
|
36
|
+
end
|
37
|
+
|
38
|
+
def each(&block)
|
39
|
+
result.reverse_each(&block)
|
40
|
+
end
|
41
|
+
|
42
|
+
private
|
43
|
+
|
44
|
+
def result
|
45
|
+
@result ||= Array.new.tap do |result|
|
46
|
+
CSV.parse(raw_data, :return_headers => false, :converters => :all, :headers => [:date, :open, :high, :low, :close, :volume, :adjusted_close]).each_with_index do |line, index|
|
47
|
+
next if index.zero?
|
48
|
+
line[:date] = Date.parse(line[:date])
|
49
|
+
result << OpenStruct.new(line.to_hash)
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
def raw_data
|
55
|
+
@raw_data ||= open(url).read
|
56
|
+
end
|
57
|
+
|
58
|
+
def url
|
59
|
+
"#{BASE_URL}?s=#{URI.escape(ticker)}&g=#{group}&ignore=.csv".tap do |url|
|
60
|
+
if start_date
|
61
|
+
url << "&a=#{start_date.month - 1}"
|
62
|
+
url << "&b=#{start_date.day}"
|
63
|
+
url << "&c=#{start_date.year}"
|
64
|
+
end
|
65
|
+
|
66
|
+
if end_date
|
67
|
+
url << "&d=#{end_date.month - 1}"
|
68
|
+
url << "&e=#{end_date.day}"
|
69
|
+
url << "&f=#{end_date.year}"
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe YahooFinance::Historical do
|
4
|
+
let(:ticker) { "AAPL" }
|
5
|
+
let(:start_date) { Date.new(2011, 11, 11) }
|
6
|
+
let(:end_date) { Date.new(2011, 11, 21) }
|
7
|
+
|
8
|
+
shared_examples_for "a valid instance" do
|
9
|
+
its(:ticker) { should == ticker }
|
10
|
+
its(:start_date) { should == start_date }
|
11
|
+
its(:end_date) { should == end_date }
|
12
|
+
its(:group) { should_not be_nil }
|
13
|
+
end
|
14
|
+
|
15
|
+
describe ".daily" do
|
16
|
+
subject { described_class.daily ticker, :from => start_date, :to => end_date }
|
17
|
+
it_behaves_like "a valid instance"
|
18
|
+
its(:group) { should == YahooFinance::Historical::GROUPS[:daily] }
|
19
|
+
end
|
20
|
+
|
21
|
+
describe ".weekly" do
|
22
|
+
subject { described_class.weekly ticker, :from => start_date, :to => end_date }
|
23
|
+
it_behaves_like "a valid instance"
|
24
|
+
its(:group) { should == YahooFinance::Historical::GROUPS[:weekly] }
|
25
|
+
end
|
26
|
+
|
27
|
+
describe ".monthly" do
|
28
|
+
subject { described_class.monthly ticker, :from => start_date, :to => end_date }
|
29
|
+
it_behaves_like "a valid instance"
|
30
|
+
its(:group) { should == YahooFinance::Historical::GROUPS[:monthly] }
|
31
|
+
end
|
32
|
+
|
33
|
+
describe "#each" do
|
34
|
+
subject { described_class.daily ticker, :from => start_date, :to => end_date }
|
35
|
+
|
36
|
+
it "iterates by ascending date order" do
|
37
|
+
subject.to_a.first.date.should < subject.to_a.last.date
|
38
|
+
end
|
39
|
+
|
40
|
+
context "when a period is specified" do
|
41
|
+
it "returns only records after the start date" do
|
42
|
+
subject.all? { |data| data.date >= start_date }.should be_true
|
43
|
+
end
|
44
|
+
|
45
|
+
it "returns only records until the end date" do
|
46
|
+
subject.all? { |data| data.date <= end_date }.should be_true
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require "yahoo_finance"
|
@@ -0,0 +1,22 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
$:.push File.expand_path("../lib", __FILE__)
|
3
|
+
require "yahoo_finance/version"
|
4
|
+
|
5
|
+
Gem::Specification.new do |s|
|
6
|
+
s.name = "yahoo_finance"
|
7
|
+
s.version = YahooFinance::VERSION
|
8
|
+
s.authors = ["Rodrigo Navarro"]
|
9
|
+
s.email = ["reu@rnavarro.com.br"]
|
10
|
+
s.homepage = ""
|
11
|
+
s.summary = %q{Simple wrapper for yahoo finance API}
|
12
|
+
s.description = %q{Simple wrapper for yahoo finance API}
|
13
|
+
|
14
|
+
s.rubyforge_project = "yahoo_finance"
|
15
|
+
|
16
|
+
s.files = `git ls-files`.split("\n")
|
17
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
18
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
19
|
+
s.require_paths = ["lib"]
|
20
|
+
|
21
|
+
s.add_development_dependency "rspec"
|
22
|
+
end
|
metadata
ADDED
@@ -0,0 +1,73 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: yahoo_finance
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Rodrigo Navarro
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2011-11-23 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: rspec
|
16
|
+
requirement: &2152396840 !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '0'
|
22
|
+
type: :development
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: *2152396840
|
25
|
+
description: Simple wrapper for yahoo finance API
|
26
|
+
email:
|
27
|
+
- reu@rnavarro.com.br
|
28
|
+
executables: []
|
29
|
+
extensions: []
|
30
|
+
extra_rdoc_files: []
|
31
|
+
files:
|
32
|
+
- .gitignore
|
33
|
+
- Gemfile
|
34
|
+
- Rakefile
|
35
|
+
- lib/yahoo_finance.rb
|
36
|
+
- lib/yahoo_finance/historical.rb
|
37
|
+
- lib/yahoo_finance/version.rb
|
38
|
+
- spec/historical_spec.rb
|
39
|
+
- spec/spec_helper.rb
|
40
|
+
- yahoo_finance.gemspec
|
41
|
+
homepage: ''
|
42
|
+
licenses: []
|
43
|
+
post_install_message:
|
44
|
+
rdoc_options: []
|
45
|
+
require_paths:
|
46
|
+
- lib
|
47
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
48
|
+
none: false
|
49
|
+
requirements:
|
50
|
+
- - ! '>='
|
51
|
+
- !ruby/object:Gem::Version
|
52
|
+
version: '0'
|
53
|
+
segments:
|
54
|
+
- 0
|
55
|
+
hash: -2453551953507377743
|
56
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
58
|
+
requirements:
|
59
|
+
- - ! '>='
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
segments:
|
63
|
+
- 0
|
64
|
+
hash: -2453551953507377743
|
65
|
+
requirements: []
|
66
|
+
rubyforge_project: yahoo_finance
|
67
|
+
rubygems_version: 1.8.6
|
68
|
+
signing_key:
|
69
|
+
specification_version: 3
|
70
|
+
summary: Simple wrapper for yahoo finance API
|
71
|
+
test_files:
|
72
|
+
- spec/historical_spec.rb
|
73
|
+
- spec/spec_helper.rb
|