greeks 1.1 → 1.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/greeks.gemspec +1 -1
- data/lib/greeks.rb +1 -1
- data/lib/greeks/calculations/time_values.rb +15 -10
- data/spec/greeks/calculations/iv_spec.rb +4 -0
- data/spec/greeks/greeks_spec.rb +6 -0
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6ce6ee63e7be1cf00d2a33bf5fabc7384edbd151
|
4
|
+
data.tar.gz: 319eddb79151564febe9384bb402057f78e3c4d6
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: cc93e88a7ef6f8096a0c18c003faf6005ee46f11e7eb7d77b0539b367c8fecb99266a315896d18b0ab866860f471cfd8073ef0de9167f1a64ae6829b092aaa64
|
7
|
+
data.tar.gz: 359124006d77696012957a0c4633632ef62ab1dd67c64041b67d41fb93b6e481f2bedeb15cd370e11ff1ec5991f5a2fd2417c6029f66eed7fa788ebb1ecfcef3
|
data/greeks.gemspec
CHANGED
data/lib/greeks.rb
CHANGED
@@ -289,7 +289,6 @@ module Math
|
|
289
289
|
:option_type => option_type,
|
290
290
|
:option_strike => option_strike,
|
291
291
|
:option_price => option_price,
|
292
|
-
:break_even => (NilMath.new(break_even) * 100.0).to_f, # break_even * 100
|
293
292
|
:iv => (NilMath.new(iv) * 100.0).to_f, # iv * 100
|
294
293
|
:delta => (NilMath.new(delta) * stock_price / option_price).to_f, # delta * stock_price / option_price
|
295
294
|
:gamma => (NilMath.new(gamma) * stock_price / delta).to_f, # gamma * stock_price / delta
|
@@ -297,6 +296,7 @@ module Math
|
|
297
296
|
:rho => (NilMath.new(rho) * 100.0 / option_price).to_f, # rho * 100 / option_price
|
298
297
|
:theta => (NilMath.new(theta) * 100.0 / option_price).to_f, # theta * 100 / option_price
|
299
298
|
:deta_vs_theta => nil,
|
299
|
+
:break_even => (NilMath.new(break_even) * 100.0).to_f, # break_even * 100
|
300
300
|
}
|
301
301
|
|
302
302
|
# Delta/Theta
|
@@ -81,11 +81,12 @@ module Math
|
|
81
81
|
# If you believe the Chance of Breakeven is less than the probability that a stock will be beyond the
|
82
82
|
# breakeven price at option expiration, then you believe the option is undervalued, and visa versa.
|
83
83
|
def break_even(opts)
|
84
|
-
opts.
|
85
|
-
|
84
|
+
opts.requires_keys_are_present(:option_price, :iv)
|
86
85
|
return nil if opts[:option_price].nil?
|
87
86
|
return nil if opts[:option_price] < 0
|
88
87
|
return nil if opts[:iv].nil?
|
88
|
+
|
89
|
+
opts.requires_keys_are_not_nil(:option_type, :option_price, :option_strike, :option_expires_pct_year, :option_expires_pct_year_sqrt, :stock_price, :stock_dividend_rate_f, :federal_reserve_interest_rate_f, :iv)
|
89
90
|
|
90
91
|
part1 = (opts[:federal_reserve_interest_rate_f] - opts[:stock_dividend_rate_f] - opts[:iv] * opts[:iv] / 2) * opts[:option_expires_pct_year]
|
91
92
|
part2 = opts[:iv] * opts[:option_expires_pct_year_sqrt]
|
@@ -135,35 +136,39 @@ module Math
|
|
135
136
|
|
136
137
|
|
137
138
|
def misc_nd1(opts)
|
138
|
-
opts.
|
139
|
-
|
139
|
+
opts.requires_keys_are_present(:d1)
|
140
140
|
return nil if opts[:d1].nil?
|
141
141
|
|
142
|
+
opts.requires_keys_are_not_nil(:d1)
|
143
|
+
|
142
144
|
Math.exp(-0.5 * opts[:d1] * opts[:d1]) / Math.sqrt(2 * Math::PI)
|
143
145
|
end
|
144
146
|
|
145
147
|
|
146
148
|
def misc_d1(opts)
|
147
|
-
opts.
|
148
|
-
|
149
|
+
opts.requires_keys_are_present(:iv)
|
149
150
|
return nil if opts[:iv].nil?
|
151
|
+
|
152
|
+
opts.requires_keys_are_not_nil(:price_ratio_log_less_rates, :iv, :option_expires_pct_year, :option_expires_pct_year_sqrt)
|
150
153
|
|
151
154
|
(opts[:price_ratio_log_less_rates] + opts[:iv] * opts[:iv] * opts[:option_expires_pct_year] / 2) / (opts[:iv] * opts[:option_expires_pct_year_sqrt])
|
152
155
|
end
|
153
156
|
|
154
157
|
|
155
158
|
def misc_d2(opts)
|
156
|
-
opts.
|
157
|
-
|
159
|
+
opts.requires_keys_are_present(:iv)
|
158
160
|
return nil if opts[:iv].nil?
|
161
|
+
|
162
|
+
opts.requires_keys_are_not_nil(:d1, :iv, :option_expires_pct_year_sqrt)
|
159
163
|
|
160
164
|
opts[:d1] - opts[:iv] * opts[:option_expires_pct_year_sqrt]
|
161
165
|
end
|
162
166
|
|
163
167
|
def misc_d_normal_distribution(opts)
|
164
|
-
opts.
|
165
|
-
|
168
|
+
opts.requires_keys_are_present(:d_value)
|
166
169
|
return nil if opts[:d_value].nil?
|
170
|
+
|
171
|
+
opts.requires_keys_are_not_nil(:option_type, :d_value)
|
167
172
|
|
168
173
|
multiplier = case opts[:option_type]
|
169
174
|
when :call
|
@@ -28,6 +28,10 @@ describe "Math::GreekCalculations::iv" do
|
|
28
28
|
:price_ratio_log_less_rates => 1.0,
|
29
29
|
).should === 21453795590575736000000.0
|
30
30
|
}
|
31
|
+
|
32
|
+
it {
|
33
|
+
iv(:stock_price=>1558.86, :stock_dividend_rate_f=>0.0, :federal_reserve_interest_rate_f=>0.0, :option_type=>:put, :option_price=>0.0, :option_strike=>800.0, :option_expires_pct_year=>0.00821917808219178, :option_expires_pct_year_sqrt=>0.09065968278232492, :iv=>nil).should be_nil
|
34
|
+
}
|
31
35
|
|
32
36
|
it {
|
33
37
|
iv(
|
data/spec/greeks/greeks_spec.rb
CHANGED
@@ -107,4 +107,10 @@ describe Math::Greeks::Calculator do
|
|
107
107
|
it { calc.to_hash[:rho].should === put[:rho] }
|
108
108
|
it { calc.to_hash[:break_even].round(2).should === put[:break_even] }
|
109
109
|
end
|
110
|
+
|
111
|
+
it {
|
112
|
+
calculator = Math::Greeks::Calculator.new(:stock_price=>1558.86, :stock_dividend_rate=>0.0, :federal_reserve_interest_rate=>0.0, :option_type=>:call, :option_price=>751.50, :option_strike=>800.00, :option_expires_in_days=>2)
|
113
|
+
calculator.iv.should be_nil
|
114
|
+
calculator.to_hash[:iv].should be_nil
|
115
|
+
}
|
110
116
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: greeks
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: '1.
|
4
|
+
version: '1.2'
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Glenn Nagel
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2013-05-
|
11
|
+
date: 2013-05-29 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: require_all
|