convex_bonds/
lib.rs

1//! # Convex Bonds
2//!
3//! Bond pricing and analytics for the Convex fixed income analytics library.
4//!
5//! This crate provides:
6//!
7//! - **Instruments**: Fixed coupon bonds, zero coupon bonds, floating rate notes
8//! - **Pricing**: Present value, clean/dirty price, yield-to-maturity
9//! - **Cash Flows**: Coupon schedule generation with business day adjustments
10//! - **Risk**: Duration, convexity, DV01, key rate durations
11//!
12//! ## Example
13//!
14//! ```rust,ignore
15//! use convex_bonds::prelude::*;
16//! use convex_core::types::{Date, Currency, Frequency};
17//! use rust_decimal_macros::dec;
18//!
19//! // Create a fixed coupon bond
20//! let bond = FixedBondBuilder::new()
21//!     .isin("US912828Z229")
22//!     .coupon_rate(dec!(2.5))
23//!     .maturity(Date::from_ymd(2030, 5, 15).unwrap())
24//!     .frequency(Frequency::SemiAnnual)
25//!     .currency(Currency::USD)
26//!     .build()
27//!     .unwrap();
28//!
29//! // Calculate yield-to-maturity
30//! let settlement = Date::from_ymd(2025, 1, 15).unwrap();
31//! let price = Price::new(dec!(98.50), Currency::USD);
32//! let ytm = bond.yield_to_maturity(price, settlement).unwrap();
33//! ```
34
35#![warn(missing_docs)]
36#![warn(clippy::all)]
37#![warn(clippy::pedantic)]
38#![allow(clippy::module_name_repetitions)]
39#![allow(clippy::missing_errors_doc)]
40#![allow(clippy::missing_panics_doc)]
41#![allow(clippy::must_use_candidate)]
42#![allow(clippy::cast_precision_loss)]
43#![allow(clippy::cast_possible_wrap)]
44#![allow(clippy::cast_sign_loss)]
45#![allow(clippy::cast_possible_truncation)]
46#![allow(clippy::doc_markdown)]
47#![allow(clippy::cast_lossless)]
48#![allow(clippy::similar_names)]
49#![allow(clippy::too_many_lines)]
50#![allow(clippy::unreadable_literal)]
51#![allow(clippy::if_not_else)]
52#![allow(clippy::match_same_arms)]
53#![allow(clippy::uninlined_format_args)]
54#![allow(clippy::struct_field_names)]
55#![allow(clippy::return_self_not_must_use)]
56#![allow(clippy::needless_pass_by_value)]
57#![allow(clippy::items_after_statements)]
58#![allow(clippy::redundant_closure_for_method_calls)]
59#![allow(clippy::unnecessary_unwrap)]
60#![allow(clippy::trivially_copy_pass_by_ref)]
61#![allow(clippy::useless_conversion)]
62#![allow(clippy::unused_self)]
63#![allow(clippy::missing_fields_in_debug)]
64#![allow(clippy::unnecessary_wraps)]
65#![allow(clippy::single_match)]
66#![allow(clippy::unnecessary_map_or)]
67#![allow(clippy::float_cmp)]
68#![allow(clippy::while_let_loop)]
69#![allow(clippy::used_underscore_items)]
70#![allow(clippy::borrowed_box)]
71#![allow(dead_code)]
72
73pub mod cashflows;
74pub mod conventions;
75pub mod curve_instruments;
76pub mod error;
77pub mod indices;
78pub mod instruments;
79pub mod options;
80pub mod pricing;
81pub mod risk;
82pub mod traits;
83pub mod types;
84
85/// Prelude module for convenient imports.
86pub mod prelude {
87    // Cash flows
88    pub use crate::cashflows::{
89        AccruedInterestCalculator, CashFlowGenerator, Schedule, ScheduleConfig, StubType,
90    };
91
92    // Conventions
93    pub use crate::conventions::{BondConventions, BondConventionsBuilder};
94
95    // Curve instruments
96    pub use crate::curve_instruments::{
97        day_count_factor, GovernmentCouponBond, GovernmentZeroCoupon, MarketConvention,
98    };
99
100    // Errors
101    pub use crate::error::{BondError, BondResult, IdentifierError};
102
103    // Indices (for FRN support)
104    pub use crate::indices::{
105        ArrearConvention, IndexConventions, IndexFixing, IndexFixingStore, IndexSource,
106        OvernightCompounding, PublicationTime, ShiftType,
107    };
108
109    // Instruments
110    pub use crate::instruments::{
111        AccelerationOption, CallableBond, CallableBondBuilder, FixedBond, FixedBondBuilder,
112        FixedRateBond, FixedRateBondBuilder, FloatingRateNote, FloatingRateNoteBuilder,
113        SinkingFundBond, SinkingFundBondBuilder, SinkingFundPayment, SinkingFundSchedule,
114        ZeroCouponBond,
115    };
116
117    // Pricing
118    pub use crate::pricing::{
119        current_yield, current_yield_from_bond, BondPricer, PriceResult, YieldResult, YieldSolver,
120    };
121
122    // Options (for OAS pricing)
123    pub use crate::options::{BinomialTree, HullWhite, ModelError, ShortRateModel};
124
125    // Risk
126    pub use crate::risk::{DurationResult, RiskMetrics};
127
128    // Traits
129    pub use crate::traits::{
130        AmortizingBond, Bond, BondAnalytics, BondCashFlow, CashFlowType, EmbeddedOptionBond,
131        FixedCouponBond, FloatingCouponBond, InflationLinkedBond,
132    };
133
134    // Types
135    pub use crate::types::{
136        AccruedConvention, AmortizationEntry, AmortizationSchedule, AmortizationType,
137        BondIdentifiers, BondType, CalendarId, CallEntry, CallSchedule, CallType, Cusip, Figi,
138        InflationIndexType, Isin, PriceQuote, PriceQuoteConvention, PutEntry, PutSchedule, PutType,
139        RateIndex, RoundingConvention, SOFRConvention, Sedol, Tenor, YieldConvention,
140    };
141}
142
143pub use error::{BondError, BondResult};
144pub use indices::{
145    ArrearConvention, IndexConventions, IndexFixing, IndexFixingStore, IndexSource,
146    OvernightCompounding, PublicationTime, ShiftType,
147};
148pub use instruments::{
149    AccelerationOption, CallableBond, CallableBondBuilder, FixedBond, FixedBondBuilder,
150    FixedRateBond, FixedRateBondBuilder, FloatingRateNote, FloatingRateNoteBuilder,
151    SinkingFundBond, SinkingFundBondBuilder, SinkingFundPayment, SinkingFundSchedule,
152};