การประมาณค่าในช่วงและการปรับเส้นโค้ง (Interpolation & Curve Fitting)
เส้นโค้งอัตราผลตอบแทน (Yield Curves) และพื้นผิวความผันผวน (Volatility Surfaces) ต้องการการประมาณค่าในช่วงระหว่างจุดเสาหลักตลาดที่ไม่ต่อเนื่อง (เช่น 1M, 3M, 6M, 1Y, 5Y, 10Y, 30Y)
รูปแบบการประมาณค่าในช่วง (Interpolation Schemes)
1. การประมาณค่าเชิงเส้น (LinearInterpolator)
ฟังก์ชันต่อเนื่องเป็นช่วงๆ ( continuous) รวดเร็วและคงทิศทางเดิม (Monotonic) แต่มีความชันไม่เรียบที่จุดต่อ (Knot points)
2. Natural Cubic Spline (CubicSpline)
หาอนุพันธ์ได้สองครั้งอย่างต่อเนื่อง ( continuous) ลดความโค้งของเส้นที่จุดต่อให้เหลือน้อยที่สุด:
3. PCHIP Hermite (PchipInterpolator)
Piecewise Cubic Hermite Interpolating Polynomial รักษารูปทรงและคงทิศทางเดิมอย่างเคร่งครัด (Shape-preserving and strictly monotonic)—ช่วยป้องกันปัญหาการแกว่งล้นเกินจริง (Overshoot) ที่ Cubic Spline ทั่วไปมักสร้างขึ้นในตัวคูณคิดลดและอัตราดอกเบี้ยล่วงหน้า (Forward Rates)
ตัวอย่างโค้ดในภาษา Rust
use sabiquant::math::interpolation::{LinearInterpolator, PchipInterpolator, Interpolator1D};
fn main() -> Result<(), Box<dyn std::error::Error>> { // จุดเสาหลักของ Zero Curve: [อายุคงเหลือเป็นปี, อัตราดอกเบี้ย Zero Rate %] let maturities = vec![0.5, 1.0, 2.0, 5.0, 10.0, 30.0]; let zero_rates = vec![0.035, 0.038, 0.041, 0.045, 0.048, 0.051];
// สร้างเส้นโค้ง PCHIP Hermite แบบ Monotonic let pchip = PchipInterpolator::new(&maturities, &zero_rates)?;
// สอบถามอัตราดอกเบี้ยที่อายุ 3.5 ปี let rate_3_5y = pchip.interpolate(3.5)?; println!("Interpolated 3.5Y Zero Rate: {:.4}%", rate_3_5y * 100.0);
// คำนวณอนุพันธ์อันดับหนึ่ง (ใช้แทน Forward Rate) let slope = pchip.derivative(3.5)?; println!("Curve Slope (dRate/dt): {:.6}", slope);
Ok(())}