from sympy import symbols, Eq, solve
8 พันธบัตรและอัตราผลตอบแทน (Bonds and Yield Rates)
พันธบัตรเป็นตราสารหนี้ที่ผู้ออกให้คำมั่นว่าจะจ่ายดอกเบี้ยเป็นงวดๆ และจ่ายคืนเงินต้นเมื่อครบกำหนด ในบทนี้จะกล่าวถึงวิธีการคำนวณราคาพันธบัตร การตีความราคาที่สูงหรือต่ำกว่ามูลค่าที่ตราไว้ และการหาอัตราผลตอบแทนที่แท้จริงเมื่อถือพันธบัตรจนครบกำหนด พันธบัตร เป็นคำที่ใช้กับรัฐเป็นผู้ออกตราสารหนี้นี้ ถ้าเป็นเอกชนจะเรียกว่าหุ้นกู้ (dedenture)
8.1 สูตรราคาพันธบัตร (Bond Price Formula)
สูตรทั่วไปสำหรับการคำนวณราคาพันธบัตร \((P)\) คือ \[P = R \cdot a_{\overline{n}|i} + F \cdot v^n\] โดยที่
\(P\) = ราคาปัจจุบันของพันธบัตร
\(R\) = จำนวนเงินคูปองที่จ่ายในแต่ละงวด
\(F\) = มูลค่าที่ตราไว้ (Face Value)
\(i\) = อัตราผลตอบแทน (ต่อหนึ่งงวด) เป็นอัตราดอกเบี้ยของตลาด
\(n\) = จำนวนงวดทั้งหมดจนกว่าจะครบกำหนด
\(v = \frac{1}{1 + i}\)
\(a_{\overline{n}|i} = \frac{1 - v^n}{i}\) คือมูลค่าปัจจุบันของเงินงวด
ตัวอย่าง พันธบัตรมูลค่าที่ตราไว้ 1,000 บาท จ่ายคูปอง 8% ต่อปี จ่ายทุก ครึ่งปี เท่ากับ \(R = 40\) บาท เป็นเวลา 10 ปี รวม 20 งวด ต้องการรู้ราคาพันธบัตรเมื่ออัตราผลตอบแทนคือ 9% ต่อปี (หรือ 4.5% ต่อครึ่งปี)
from sympy import symbols, Rational, N
= symbols('i n v F P R a_n')
i, n, v, F, P, R, a_n = 1000
F = 40
R = 0.045
i = 1 / (1 + i)
v = (1 - v**n) / i
a_n = R * a_n + F * v**n
P = P.subs({n: 20})
P_val 5) P_val.evalf(
\(\displaystyle 934.96\)
ราคาพันธบัตรนี้มีมูลค่าเท่ากับ 934.96 บาท
8.3 อัตราผลตอบแทนเมื่อถือจนครบกำหนด (Yield to Maturity, YTM)
YTM คือ อัตราผลตอบแทนที่แท้จริงของผู้ถือพันธบัตร หากถือไว้จนถึงวันครบกำหนด โดยคำนวณจากสมการ \[ P = R \cdot a_{\overline{n}|i} + F \cdot v^n \] เหมือนเดิม แต่ว่าเราไม่ทราบอัตราดอกเบี้ย จึงต้องแก้สมการนี้เพื่อหาอัตราดอกเบี้ยที่ได้รับจากมากกว่า เทียบเท่า หรือน้อย กว่าอัตราดอกเบี้ยในตลาด
เนื่องจากเป็นการแก้สมการพหุนามทำให้ \(i\) จำนวนคำตอบได้สูงสุดเท่ากับจำนวนดีกรี จึงแนะนำให้รู้จัก อีกฟังก์ชันในซิมไพ คือnsolve()
from sympy import symbols, Eq, nsolve, N
= symbols('i v a_n F R P')
i, v, a_n, F, R, P = 1 / (1 + i)
v = (1 - v**20) / i
a_n = 1000
P = 100
R = 1000
F = Eq(P, R * a_n + F * v**20)
eq = nsolve(eq, i, 0.07)
ytm 2) ytm.evalf(
\(\displaystyle 0.1\)
ข้อสังเกตุของพันธบัตรใกล้ครบกำหนด (Bonds Near Maturity)
เมื่อพันธบัตรใกล้ครบกำหนด
มูลค่าปัจจุบันจะเข้าใกล้กับมูลค่าที่ตราไว้ \(F\)
ราคาของพันธบัตรจะอ่อนไหวต่ออัตราคูปองและอัตราดอกเบี้ยน้อยลง
ความต่างระหว่างราคาและ \(F\) มักจะเล็กลง
8.4 แบบฝึกหัดท้ายบท
- คำนวณราคาพันธบัตร (Bond Price) สร้างสมการราคาพันธบัตร \(P = Fr a_{\overline{n}|i} + C v^n\) และคำนวณราคาพันธบัตรเมื่อ
- \(F = 1{,}000\), \(r = 6\%\), \(i = 5\%\), \(n = 10\), \(C = F\)
หา Yield Rate จากราคาพันธบัตร ใช้
solve()
หาอัตราผลตอบแทน \(i\) ที่ทำให้พันธบัตรราคา 950 บาท โดยใช้สูตรในข้อ 1สร้างฟังก์ชันคำนวณราคาพันธบัตร ให้เขียนฟังก์ชันใน Python ที่รับพารามิเตอร์ \(F, r, n, i\) แล้วคืนค่าราคาพันธบัตร
คำนวณราคาเมื่อมีการจ่ายคูปองแบบรายครึ่งปี ให้ปรับสูตรเพื่อรองรับการจ่ายคูปอง 2 ครั้ง/ปี (m = 2) และคำนวณราคาพันธบัตรที่มีระยะเวลา 5 ปี
คำนวณ Duration แบบ Macaulay Duration ด้วยสูตร \[ D = \frac{\sum_{t=1}^{n} t \cdot R \cdot v^t + n \cdot C \cdot v^n}{P} \] โดยใช้
SymPy
แสดงสูตรและหาค่าเมื่อ \(R = 60\), \(C = 1{,}000\), \(v = 1/1.05\), \(n = 10\)เปรียบเทียบราคาพันธบัตรเมื่อ Yield เพิ่มขึ้นทีละ 0.5% สร้างกราฟใน Python แสดงความสัมพันธ์ระหว่าง Yield Rate (i) กับราคาพันธบัตร \(P(i)\)
หา Yield Rate โดยใช้
nsolve()
ให้ใช้nsolve()
จากsympy
เพื่อประมาณค่าผลตอบแทน \(i\) ที่ทำให้ราคาพันธบัตรเท่ากับ 1,100 บาทอัตราผลตอบแทนเทียบเท่า (Equivalent Yield) จงเปรียบเทียบอัตราผลตอบแทนรายปีแบบจ่ายปีละครั้ง กับแบบจ่ายราย 6 เดือน และหารายปีเทียบเท่า
คำนวณราคาพันธบัตรที่ขายด้วย premium และ discount ให้สร้างตัวอย่างพันธบัตรที่ราคาขาย > face value และ < face value แล้วคำนวณราคาทั้งสองกรณี
วิเคราะห์ break-even yield หาผลตอบแทนที่ทำให้ราคาพันธบัตรเท่ากับมูลค่าที่ต้องการลงทุน (เช่น 1,000 บาท) และวิเคราะห์ว่าอัตราผลตอบแทนนั้นคุ้มค่าหรือไม่