ข้ามไปยังเนื้อหา

การประมาณค่าในช่วงและการปรับเส้นโค้ง (Interpolation & Curve Fitting)

เส้นโค้งอัตราผลตอบแทน (Yield Curves) และพื้นผิวความผันผวน (Volatility Surfaces) ต้องการการประมาณค่าในช่วงระหว่างจุดเสาหลักตลาดที่ไม่ต่อเนื่อง (เช่น 1M, 3M, 6M, 1Y, 5Y, 10Y, 30Y)

รูปแบบการประมาณค่าในช่วง (Interpolation Schemes)

1. การประมาณค่าเชิงเส้น (LinearInterpolator)

ฟังก์ชันต่อเนื่องเป็นช่วงๆ (C0C^0 continuous) รวดเร็วและคงทิศทางเดิม (Monotonic) แต่มีความชันไม่เรียบที่จุดต่อ (Knot points)

2. Natural Cubic Spline (CubicSpline)

หาอนุพันธ์ได้สองครั้งอย่างต่อเนื่อง (C2C^2 continuous) ลดความโค้งของเส้นที่จุดต่อให้เหลือน้อยที่สุด:

S′′(x0)=S′′(xn)=0S''(x_0) = S''(x_n) = 0

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(())
}