rupee 0.1.5 → 0.1.6

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.
data/README.rdoc CHANGED
@@ -1,9 +1,10 @@
1
1
  = Rupee - financial tools for Ruby
2
2
 
3
- Homepage:: http://www.brymck.com
4
- Author:: Bryan McKelvey
5
- Copyright:: (c) 2011 Bryan McKelvey
6
- License:: MIT
3
+ Homepage:: http://www.brymck.com
4
+ Author:: Bryan McKelvey
5
+ Copyright:: (c) 2011 Bryan McKelvey
6
+ License:: MIT
7
+ Documentation:: http://rdoc.info/github/brymck/rupee/master/frames
7
8
 
8
9
  /|\
9
10
  / | \
data/ext/rupee/bond.c CHANGED
@@ -224,6 +224,24 @@ macaulay_discrete(self, _times, _cflows, _price)
224
224
  return macaulay(self, _times, _cflows, _price, true);
225
225
  }
226
226
 
227
+ // Modified duration of a discretely compounded bond
228
+ static VALUE
229
+ modified_discrete(self, _times, _cflows, _price)
230
+ VALUE self, _times, _cflows, _price;
231
+ {
232
+ int len = RARRAY_LEN(_cflows);
233
+ double y, D, times[len], cflows[len], price;
234
+
235
+ rtofa(times, _times, len);
236
+ rtofa(cflows, _cflows, len);
237
+ price = NUM2DBL(_price);
238
+
239
+ y = bond_ytm(times, cflows, price, len, true);
240
+ D = bond_dur(times, cflows, y, len, true);
241
+
242
+ return rb_float_new(D / (1 + y));
243
+ };
244
+
227
245
  // Price of a continuously compounded bond
228
246
  static VALUE
229
247
  price_continuous(self, _times, _cflows, _r)
@@ -296,6 +314,8 @@ init_bond()
296
314
  rb_define_alias(singleton, "dur", "duration");
297
315
  rb_define_singleton_method(klass, "macaulay", macaulay_discrete, 3);
298
316
  rb_define_alias(singleton, "macaulay_duration", "macaulay");
317
+ rb_define_singleton_method(klass, "modified", modified_discrete, 3);
318
+ rb_define_alias(singleton, "modified_duration", "modified");
299
319
  rb_define_singleton_method(klass, "price", price_discrete, 3);
300
320
  rb_define_alias(singleton, "value", "price");
301
321
  rb_define_singleton_method(klass, "yield_to_maturity", yield_to_maturity_discrete, 3);
@@ -4,14 +4,14 @@ module Rupee
4
4
  class Source
5
5
  # The name of the source
6
6
  attr :name
7
-
7
+ # The full URL for where the security information is located, where
8
+ # <tt>%s</tt> is a query parameter
9
+ attr :url
8
10
  # The parameters available
9
11
  attr :params
10
12
 
11
- def initialize(name, aliases = [], params = {})
12
- @name = name
13
- @aliases = aliases
14
- @params = params
13
+ def initialize(name, url, params = {})
14
+ @name, @url, @params = name, url, params
15
15
  end
16
16
  end
17
17
 
@@ -27,7 +27,8 @@ module Rupee
27
27
  @sources ||= {}
28
28
 
29
29
  # Bloomberg
30
- @sources[:bloomberg] = Source.new(:bloomberg, [:bberg, :bb, :b],
30
+ @sources[:bloomberg] = Source.new(:bloomberg,
31
+ "http://www.bloomberg.com/apps/quote?ticker=%s",
31
32
  :price => /(?:PRICE|VALUE): <span class="amount">([0-9.,NA-]{1,})/,
32
33
  :change => /Change<\/td>\n<td class="value[^>]+>([0-9.,NA-]{1,})/,
33
34
  :pct_change => /Change<\/td>\n<td class="value[^>]+>[0-9.,NA-]{1,} \(([0-9NA.,-]{1,})\%/,
@@ -41,8 +42,8 @@ module Rupee
41
42
  :volume => /Volume<\/td>\n<td class="value[^>]+>([0-9.,NA-]{1,})/,
42
43
  :mkt_cap => /Market Cap[^<]+<\/td>\n<td class="value">([0-9.,NA-]{1,})/,
43
44
  :p_e => /Price\/Earnings[^<]+<\/td>\n<td class="value">([0-9.,NA-]{1,})/)
44
- @sources[:yahoo] = Source.new(:yahoo)
45
- @sources[:google] = Source.new(:google)
45
+ @sources[:yahoo] = Source.new(:yahoo, "yahoo.com")
46
+ @sources[:google] = Source.new(:google, "google.com")
46
47
  @default_source = :bloomberg
47
48
  end
48
49
  end
data/lib/rupee/quote.rb CHANGED
@@ -49,7 +49,7 @@ module Rupee
49
49
  def initialize(ticker, opts = {})
50
50
  opts = { :source => :bloomberg, :frequency => 15 }.merge opts
51
51
  @ticker = ticker
52
- @source = shorten_source(Quote.sources[opts[:source]])
52
+ @source = Quote.sources[opts[:source]]
53
53
  @frequency = opts[:frequency]
54
54
  @next_pull = Time.now
55
55
  end
@@ -61,10 +61,9 @@ module Rupee
61
61
 
62
62
  if now >= @next_pull
63
63
  @next_pull = now + @frequency
64
- url = BLOOMBERG_URL % ticker
65
64
  @results = {}
66
- url = URI.parse(url)
67
- @html = Net::HTTP.start(url.host, url.port) do |http|
65
+ url = URI.parse(@source.url % ticker)
66
+ html = Net::HTTP.start(url.host, url.port) do |http|
68
67
  http.get url.request_uri
69
68
  end.body
70
69
 
@@ -84,9 +83,9 @@ module Rupee
84
83
  end
85
84
  end
86
85
 
87
- # call-seq: Rupee#price
86
+ # call-seq: #price
88
87
  #
89
- # Blah
88
+ # Test
90
89
  [:price, :change, :pct_change, :date, :time, :bid, :ask, :open, :high,
91
90
  :low, :volume, :mkt_cap, :p_e].each do |method_name|
92
91
  define_method method_name do
@@ -101,21 +100,6 @@ module Rupee
101
100
 
102
101
  private
103
102
 
104
- # The URL for Bloomberg's quotes service
105
- BLOOMBERG_URL = "http://www.bloomberg.com/apps/quote?ticker=%s"
106
-
107
- # Returns an intepretation of an abbreviated source name
108
- def shorten_source(source)
109
- case source.downcase.to_sym
110
- when :"", :bloomberg, :bberg, :bb, :b
111
- :bloomberg
112
- when :google, :goog, :g
113
- :google
114
- when :yahoo!, :yahoo, :yhoo, :y!, :y
115
- :yahoo
116
- end
117
- end
118
-
119
103
  # Parses an object that might be a number
120
104
  #
121
105
  # parse "15" #=> 15
data/lib/rupee/version.rb CHANGED
@@ -1,4 +1,4 @@
1
1
  module Rupee
2
2
  # The current version
3
- VERSION = "0.1.5"
3
+ VERSION = "0.1.6"
4
4
  end
data/rupee.gemspec CHANGED
@@ -3,25 +3,27 @@ $:.push File.expand_path("../lib", __FILE__)
3
3
  require "rupee/version"
4
4
 
5
5
  Gem::Specification.new do |s|
6
- s.name = "rupee"
7
- s.version = Rupee::VERSION
8
- s.authors = ["Bryan McKelvey"]
9
- s.email = ["bryan.mckelvey@gmail.com"]
10
- s.homepage = "https://github.com/brymck/rupee"
11
- s.summary = "Financial tools for Ruby"
12
- s.description = "rupee aims to provide user-friendly tools for use in financial gems and applications."
6
+ s.name = "rupee"
7
+ s.version = Rupee::VERSION
8
+ s.authors = ["Bryan McKelvey"]
9
+ s.email = ["bryan.mckelvey@gmail.com"]
10
+ s.homepage = "https://github.com/brymck/rupee"
11
+ s.summary = "Financial tools for Ruby"
12
+ s.description = <<-eos
13
+ rupee aims to provide user-friendly tools for use in
14
+ financial gems and applications.
15
+ eos
13
16
 
14
17
  s.rubyforge_project = "rupee"
15
18
 
16
- s.files = `git ls-files`.split("\n")
17
- s.test_files = `git ls-files -- spec/**/*_spec.rb`.split("\n")
18
- s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
19
- s.extensions = "ext/rupee/extconf.rb"
20
- s.require_paths = ["lib", "ext"]
19
+ s.files = `git ls-files`.split("\n")
20
+ s.test_files = `git ls-files -- spec/**/*_spec.rb`.split("\n")
21
+ s.executables = `git ls-files -- bin/*`.split("\n").map do |f|
22
+ File.basename(f)
23
+ end
24
+ s.extensions = "ext/rupee/extconf.rb"
25
+ s.require_paths = ["lib", "ext"]
21
26
 
22
- # specify any dependencies here; for example:
23
- s.add_development_dependency "bundler", "~> 1.0"
24
- s.add_development_dependency "rspec", "~> 2.0"
25
- s.add_development_dependency "autotest", "~> 4.0"
26
- # s.add_runtime_dependency "rest-client"
27
+ s.add_development_dependency "bundler", "~> 1.0"
28
+ s.add_development_dependency "rspec", "~> 2.0"
27
29
  end
data/spec/c/bond_spec.rb CHANGED
@@ -1,7 +1,6 @@
1
1
  require File.dirname(__FILE__) + "/../spec_helper"
2
2
 
3
3
  # Discrete discounting
4
- # bond duration modified = 2.5128
5
4
  # new bond price = 100
6
5
  #Continous discounting
7
6
  # bond yield to maturity = 0.09
@@ -16,20 +15,27 @@ describe Rupee::Bond do
16
15
  end
17
16
 
18
17
  describe "with discrete discounting" do
18
+ before :each do
19
+ @price = Rupee::Bond.price(@times, @cflows, @r)
20
+ end
21
+
19
22
  it "should produce an accurate price" do
20
- Rupee::Bond.price(@times, @cflows, @r).should be_within(@tolerance).of 102.531
23
+ @price.should be_within(@tolerance).of 102.531
21
24
  end
22
25
 
23
26
  it "should produce an accurate duration" do
24
27
  Rupee::Bond.duration(@times, @cflows, @r).should be_within(@tolerance).of 2.73895
25
28
  end
26
29
 
30
+ it "should produce an accurate modified duration" do
31
+ Rupee::Bond.modified(@times, @cflows, @price).should be_within(@tolerance).of 2.5128
32
+ end
33
+
27
34
  it "should produce an accurate convexity" do
28
35
  Rupee::Bond.convexity(@times, @cflows, @r).should be_within(@tolerance).of 8.93248
29
36
  end
30
37
 
31
38
  it "should produce an accurate yield to maturity" do
32
- @price = Rupee::Bond.price(@times, @cflows, @r)
33
39
  Rupee::Bond.yield_to_maturity(@times, @cflows, @price).should be_within(@tolerance).of @r
34
40
  end
35
41
  end
@@ -2,12 +2,15 @@ require File.dirname(__FILE__) + "/../spec_helper"
2
2
 
3
3
  describe Rupee::Future do
4
4
  before :each do
5
+ @tolerance = 0.001
5
6
  @underlying = 100
6
7
  @rfr = 0.10
7
8
  @ttm = 0.5
8
9
  end
9
10
 
10
11
  it "should produce an accurate price" do
11
- Rupee::Future.price(@underlying, @rfr, @ttm).should be_within(TOLERANCE).of 105.127
12
+ Rupee::Future.price(@underlying, @rfr, @ttm).should(
13
+ be_within(@tolerance).of 105.127
14
+ )
12
15
  end
13
16
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rupee
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.5
4
+ version: 0.1.6
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2011-09-28 00:00:00.000000000 Z
12
+ date: 2011-09-29 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: bundler
16
- requirement: &84129210 !ruby/object:Gem::Requirement
16
+ requirement: &70967150 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ~>
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: '1.0'
22
22
  type: :development
23
23
  prerelease: false
24
- version_requirements: *84129210
24
+ version_requirements: *70967150
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: rspec
27
- requirement: &84128900 !ruby/object:Gem::Requirement
27
+ requirement: &70966890 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ~>
@@ -32,20 +32,9 @@ dependencies:
32
32
  version: '2.0'
33
33
  type: :development
34
34
  prerelease: false
35
- version_requirements: *84128900
36
- - !ruby/object:Gem::Dependency
37
- name: autotest
38
- requirement: &84127610 !ruby/object:Gem::Requirement
39
- none: false
40
- requirements:
41
- - - ~>
42
- - !ruby/object:Gem::Version
43
- version: '4.0'
44
- type: :development
45
- prerelease: false
46
- version_requirements: *84127610
47
- description: rupee aims to provide user-friendly tools for use in financial gems and
48
- applications.
35
+ version_requirements: *70966890
36
+ description: ! " rupee aims to provide user-friendly tools for
37
+ use in\n financial gems and applications.\n"
49
38
  email:
50
39
  - bryan.mckelvey@gmail.com
51
40
  executables: []
@@ -53,7 +42,6 @@ extensions:
53
42
  - ext/rupee/extconf.rb
54
43
  extra_rdoc_files: []
55
44
  files:
56
- - .autotest
57
45
  - .gitignore
58
46
  - .rspec
59
47
  - COPYING
data/.autotest DELETED
@@ -1,2 +0,0 @@
1
- # ~.autotest
2
- require 'rubygems'