ข้อตกลงการนับวัน (Day-Count Conventions)
อนุสัญญาการนับวันใช้สำหรับคำนวณสัดส่วนของปี () ระหว่างวันที่สองวัน และ เพื่อใช้คิดดอกเบี้ยค้างรับและตัวคูณคิดลด (Discount Factors):
อนุสัญญาที่รองรับ (Supported Conventions)
1. Actual/Actual ICMA (มาตรฐานตราสารหนี้)
ใช้สำหรับพันธบัตรรัฐบาลและหุ้นกู้เอกชน คำนวณวันจริงเทียบกับจำนวนวันจริงในรอบการจ่ายคูปองปัจจุบัน:
โดย คือความถี่ในการจ่ายดอกเบี้ยต่อปี และ คือช่วงเวลาอ้างอิงของงวดคูปอง
2. Actual/Actual ISDA (มาตรฐานสัญญา Swap)
แบ่งการคำนวณแยกตามปีปฏิทิน:
3. Actual/360 และ Actual/365 Fixed
- Actual/360: มาตรฐานตลาดเงิน (ตั๋วเงินคลังสหรัฐฯ, ตราสารหนี้ระยะสั้น, ดอกเบี้ยกู้ยืม SOFR/Euribor):
- Actual/365 Fixed: มาตรฐานในสหราชอาณาจักร ประเทศในเครือจักรภพ และตลาดเยน (JPY):
4. ตระกูล 30/360 (US & Eurobond)
กำหนดให้ทุกเดือนมี 30 วัน และหนึ่งปีมี 360 วัน:
- 30/360 US (Bond Basis): ปรับวัน และ ตามกฎสิ้นเดือนและกฎเดือนกุมภาพันธ์
- 30E/360 (Eurobond Basis): หาก และหาก
5. Business/252
ใช้เป็นหลักในตลาดตราสารหนี้ของบราซิลและละตินอเมริกา:
ตัวอย่างโค้ดในภาษา Rust
use sabiquant::core::Date;use sabiquant::core::daycount::{ DayCounter, ActualActualICMA, ActualActualISDA, Actual360, Actual365Fixed, Thirty360US};
fn main() -> Result<(), Box<dyn std::error::Error>> { let d1 = Date::from_ymd(2024, 2, 1)?; // ปีอธิกสุรทิน (Leap year) let d2 = Date::from_ymd(2024, 8, 1)?;
let act_360 = Actual360::default(); let act_365 = Actual365Fixed::default(); let thirty_360 = Thirty360US::default(); let isda = ActualActualISDA::default();
println!("Actual/360: {:.6}", act_360.year_fraction(d1, d2)?); println!("Actual/365: {:.6}", act_365.year_fraction(d1, d2)?); println!("30/360 US: {:.6}", thirty_360.year_fraction(d1, d2)?); println!("Act/Act ISDA: {:.6}", isda.year_fraction(d1, d2)?);
Ok(())}