RustQuant_instruments/options/log.rs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// RustQuant: A Rust library for quantitative finance tools.
// Copyright (C) 2023 https://github.com/avhz
// Dual licensed under Apache 2.0 and MIT.
// See:
// - LICENSE-APACHE.md
// - LICENSE-MIT.md
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
use super::OptionContract;
use crate::Payoff;
/// Log Moneyness Contract.
#[derive(Debug, Clone)]
pub struct LogMoneynessContract {
/// The option contract.
pub contract: OptionContract,
/// Strike price of the option.
pub strike: f64,
}
/// Log Underlying Contract.
#[derive(Debug, Clone)]
pub struct LogUnderlyingContract {
/// The option contract.
pub contract: OptionContract,
/// Strike price of the option.
pub strike: f64,
}
/// Log Option.
#[derive(Debug, Clone)]
pub struct LogOption {
/// The option contract.
pub contract: OptionContract,
/// Strike price of the option.
pub strike: f64,
}
impl Payoff for LogMoneynessContract {
type Underlying = f64;
fn payoff(&self, underlying: Self::Underlying) -> f64 {
(underlying / self.strike).ln()
}
}
impl Payoff for LogUnderlyingContract {
type Underlying = f64;
fn payoff(&self, underlying: Self::Underlying) -> f64 {
underlying.ln()
}
}
impl Payoff for LogOption {
type Underlying = f64;
fn payoff(&self, underlying: Self::Underlying) -> f64 {
(underlying / self.strike).ln().max(0.0)
}
}