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