class FinanceEngine::American_Options
Attributes
down_factor[RW]
price[RW]
probability[RW]
rf[RW]
strike[RW]
time[RW]
tree[RW]
up_factor[RW]
vol[RW]
Public Class Methods
new(price, volatility, risk_free_rate, strike)
click to toggle source
# File lib/finance_engine/americanoptionpricing.rb, line 5 def initialize(price, volatility, risk_free_rate, strike) @price = price @vol = volatility @rf = risk_free_rate @strike = strike @tree = {} end
Public Instance Methods
build_american_options(years_to_expiration, periods_in_year)
click to toggle source
# File lib/finance_engine/americanoptionpricing.rb, line 13 def build_american_options(years_to_expiration, periods_in_year) up_fac(periods_in_year**-1) down_fac(periods_in_year**-1) probability_increase_price(periods_in_year**-1) create_tree_for_years(years_to_expiration, periods_in_year**-1) end
call_value(price)
click to toggle source
# File lib/finance_engine/americanoptionpricing.rb, line 49 def call_value(price) [0,strike - price].max.round(4) end
create_tree_for_years(years_to_expiration, periods_in_year, node='original_', price=@price)
click to toggle source
# File lib/finance_engine/americanoptionpricing.rb, line 20 def create_tree_for_years(years_to_expiration, periods_in_year, node='original_', price=@price) @tree[node]={'price'=>price.round(4)} if years_to_expiration.round(3) == 0 @tree[node]['call'] = call_value(price) @tree[node]['put'] = put_value(price) elsif years_to_expiration.round(3) > 0 create_tree_for_years((years_to_expiration - periods_in_year), periods_in_year, node+'u', price * @up_factor ) create_tree_for_years((years_to_expiration - periods_in_year), periods_in_year, node+'d', price * @down_factor) get_put_value(price, node, periods_in_year) get_call_value(price, node, periods_in_year) end end
current_call_price()
click to toggle source
# File lib/finance_engine/americanoptionpricing.rb, line 65 def current_call_price @tree['original_']['call'] end
current_put_price()
click to toggle source
# File lib/finance_engine/americanoptionpricing.rb, line 68 def current_put_price @tree['original_']['put'] end
down_fac(time)
click to toggle source
# File lib/finance_engine/americanoptionpricing.rb, line 57 def down_fac(time) @down_factor = Math::E**(-@vol*(time)**(0.5)) end
get_call_value(price, node, periods_in_year)
click to toggle source
# File lib/finance_engine/americanoptionpricing.rb, line 39 def get_call_value(price, node, periods_in_year) up = @tree[node+'u']['call'] down = @tree[node+'d']['call'] @tree[node]['call'] = [call_value(price), (Math::E**(-@rf* periods_in_year)*(@probability * up)+Math::E**(-@rf* periods_in_year)*((1-@probability) * down)).round(4)].max end
get_put_value(price, node, periods_in_year)
click to toggle source
# File lib/finance_engine/americanoptionpricing.rb, line 33 def get_put_value(price, node, periods_in_year) up = @tree[node+'u']['put'] down = @tree[node+'d']['put'] @tree[node]['put'] = [put_value(price), (Math::E**(-@rf* periods_in_year)*(@probability * up)+Math::E**(-@rf* periods_in_year)*((1-@probability) * down)).round(4)].max end
probability_increase_price(time)
click to toggle source
# File lib/finance_engine/americanoptionpricing.rb, line 61 def probability_increase_price(time) @probability = (Math::E**(time*@rf)-@down_factor)/(@up_factor - @down_factor) end
put_value(price)
click to toggle source
# File lib/finance_engine/americanoptionpricing.rb, line 45 def put_value(price) [0,price - strike].max.round(4) end
up_fac(time)
click to toggle source
# File lib/finance_engine/americanoptionpricing.rb, line 53 def up_fac(time) @up_factor = Math::E**(@vol*(time)**(0.5)) end