กระแสเงินสดและสัญญา (Cashflows & Legs)
ใน SabiQuant สัญญาทางการเงินที่ซับซ้อน (เช่น พันธบัตรอัตราดอกเบี้ยคงที่, หุ้นกู้ลอยตัว, และสัญญาแลกเปลี่ยนอัตราดอกเบี้ย Interest Rate Swaps) จะประกอบขึ้นจาก Leg ตั้งแต่หนึ่งขาขึ้นไป โดยแต่ละ Leg จะบรรจุชุดของ Cashflow ที่เรียงตามลำดับเวลา
ชนิดของกระแสเงินสด (Cashflow Types)
SimpleCashFlow: การจ่ายเงินก้อนเดี่ยว ณ วันที่ระบุ (เช่น การจ่ายคืนเงินต้นเมื่อครบกำหนด)FixedRateCoupon: คูปองดอกเบี้ย คำนวณจาก โดย คือสัดส่วนปีตามอนุสัญญาการนับวันตลอดงวดการสะสมดอกเบี้ย
มูลค่าปัจจุบันสุทธิ (Net Present Value - NPV)
มูลค่าปัจจุบันของ Leg เมื่อกำหนดตัวคูณคิดลด :
ตัวอย่างโค้ดในภาษา Rust
use sabiquant::core::Date;use sabiquant::schedules::{Leg, SimpleCashFlow, FixedRateCoupon};
fn main() -> Result<(), Box<dyn std::error::Error>> { let mut fixed_leg = Leg::new();
// เพิ่มกระแสเงินสดคูปองตามกำหนด let c1_date = Date::from_ymd(2025, 6, 30)?; let c2_date = Date::from_ymd(2025, 12, 31)?; let maturity = Date::from_ymd(2025, 12, 31)?;
// คูปองจ่ายทุกครึ่งปี 2 งวด งวดละ $25,000 บนเงินต้น $1,000,000 (ดอกเบี้ย 5.0% ต่อปี) fixed_leg.push(SimpleCashFlow::new(c1_date, 25_000.0)); fixed_leg.push(SimpleCashFlow::new(c2_date, 25_000.0));
// จ่ายคืนเงินต้นเมื่อครบกำหนด fixed_leg.push(SimpleCashFlow::new(maturity, 1_000_000.0));
// พารามิเตอร์การประเมินมูลค่า let settlement = Date::from_ymd(2025, 1, 1)?; let discount_rate = 0.048; // อัตราคิดลดคงที่ 4.8% ต่อปี
let npv = fixed_leg.npv(settlement, discount_rate)?; println!("Total Leg NPV: ${:.2}", npv);
Ok(())}