Implementation:Avhz RustQuant Forward Start Backend
| Knowledge Sources | |
|---|---|
| Domains | Option_Pricing, Quantitative_Finance |
| Last Updated | 2026-02-07 19:00 GMT |
Overview
Concrete tool for pricing forward start options using the Rubinstein (1990) analytical formula provided by the RustQuant library.
Description
This module implements the ForwardStartOption struct for pricing options whose strike is set at a future date as a proportion of the underlying price at that time. The strike is determined by the alpha parameter:
- alpha < 1 -- The call (put) starts in-the-money (out-of-the-money) by (1 - alpha)%.
- alpha = 1 -- The option starts at-the-money.
- alpha > 1 -- The call (put) starts out-of-the-money (in-the-money) by (alpha - 1)%.
The price() method implements Rubinstein's (1990) closed-form formula using a standard BSM-like framework with cost of carry b = r - q. The formula uses d1 = (ln(1/alpha) + (b + v^2/2)(T - t)) / (v * sqrt(T - t)) where t is the start date and T is the end date. The struct supports the builder pattern via derive_builder. Returns a tuple of (call_price, put_price).
Usage
Use when pricing forward start options where the strike is determined at a future date relative to the then-prevailing spot price, such as in employee stock option plans or cliquet structures.
Code Reference
Source Location
- Repository: RustQuant
- File: crates/RustQuant_instruments/src/backends/forward_start.rs
- Lines: 1-128
Signature
#[derive(derive_builder::Builder, Debug)]
pub struct ForwardStartOption {
pub initial_price: f64,
pub alpha: f64,
pub risk_free_rate: f64,
pub volatility: f64,
pub dividend_rate: f64,
pub valuation_date: Option<Date>,
pub start: Date,
pub end: Date,
}
impl ForwardStartOption {
#[must_use]
pub fn price(&self) -> (f64, f64)
}
Import
use RustQuant::instruments::ForwardStartOption;
I/O Contract
Inputs
| Name | Type | Required | Description |
|---|---|---|---|
| initial_price | f64 | Yes | Initial underlying price (S) |
| alpha | f64 | Yes | Strike proportion factor; strike = alpha * S at the start date |
| risk_free_rate | f64 | Yes | Risk-free interest rate (r) |
| volatility | f64 | Yes | Volatility parameter (v) |
| dividend_rate | f64 | Yes | Continuous dividend rate (q) |
| valuation_date | Option<Date> | No | Valuation date; defaults to today |
| start | Date | Yes | Date when the strike is set (T) |
| end | Date | Yes | Option expiration date (t) |
Outputs
| Name | Type | Description |
|---|---|---|
| (call, put) | (f64, f64) | Tuple of forward start call and put prices |
Usage Examples
use RustQuant::instruments::ForwardStartOption;
use RustQuant::time::today;
use time::Duration;
let fwd_start = ForwardStartOption {
initial_price: 60.0,
alpha: 1.1, // starts 10% OTM for calls
risk_free_rate: 0.08,
volatility: 0.3,
dividend_rate: 0.04,
valuation_date: None,
start: today() + Duration::days(91),
end: today() + Duration::days(365),
};
let (call_price, put_price) = fwd_start.price();