from sympy import symbols, Eq, solve
8 พันธบัตรและอัตราผลตอบแทน (Bonds and Yield Rates)
พันธบัตรเป็นตราสารหนี้ที่ผู้ออกให้คำมั่นว่าจะจ่ายดอกเบี้ยเป็นงวดๆ และจ่ายคืนเงินต้นเมื่อครบกำหนด ในบทนี้จะกล่าวถึงวิธีการคำนวณราคาพันธบัตร การตีความราคาที่สูงหรือต่ำกว่ามูลค่าที่ตราไว้ และการหาอัตราผลตอบแทนที่แท้จริงเมื่อถือพันธบัตรจนครบกำหนด พันธบัตร เป็นคำที่ใช้กับรัฐเป็นผู้ออกตราสารหนี้นี้ ถ้าเป็นเอกชนจะเรียกว่าหุ้นกู้ (dedenture)
8.1 สูตรราคาพันธบัตร (Bond Price Formula)
สูตรทั่วไปสำหรับการคำนวณราคาพันธบัตร
= ราคาปัจจุบันของพันธบัตร = จำนวนเงินคูปองที่จ่ายในแต่ละงวด = มูลค่าที่ตราไว้ (Face Value) = อัตราผลตอบแทน (ต่อหนึ่งงวด) เป็นอัตราดอกเบี้ยของตลาด = จำนวนงวดทั้งหมดจนกว่าจะครบกำหนด คือมูลค่าปัจจุบันของเงินงวด
ตัวอย่าง พันธบัตรมูลค่าที่ตราไว้ 1,000 บาท จ่ายคูปอง 8% ต่อปี จ่ายทุก ครึ่งปี เท่ากับ
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(
ราคาพันธบัตรนี้มีมูลค่าเท่ากับ 934.96 บาท
8.3 อัตราผลตอบแทนเมื่อถือจนครบกำหนด (Yield to Maturity, YTM)
YTM คือ อัตราผลตอบแทนที่แท้จริงของผู้ถือพันธบัตร หากถือไว้จนถึงวันครบกำหนด โดยคำนวณจากสมการ
เนื่องจากเป็นการแก้สมการพหุนามทำให้ 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(
ข้อสังเกตุของพันธบัตรใกล้ครบกำหนด (Bonds Near Maturity)
เมื่อพันธบัตรใกล้ครบกำหนด
มูลค่าปัจจุบันจะเข้าใกล้กับมูลค่าที่ตราไว้
ราคาของพันธบัตรจะอ่อนไหวต่ออัตราคูปองและอัตราดอกเบี้ยน้อยลง
ความต่างระหว่างราคาและ
มักจะเล็กลง
8.4 แบบฝึกหัดท้ายบท
- คำนวณราคาพันธบัตร (Bond Price) สร้างสมการราคาพันธบัตร
และคำนวณราคาพันธบัตรเมื่อ
, , , ,
หา Yield Rate จากราคาพันธบัตร ใช้
solve()
หาอัตราผลตอบแทน ที่ทำให้พันธบัตรราคา 950 บาท โดยใช้สูตรในข้อ 1สร้างฟังก์ชันคำนวณราคาพันธบัตร ให้เขียนฟังก์ชันใน Python ที่รับพารามิเตอร์
แล้วคืนค่าราคาพันธบัตรคำนวณราคาเมื่อมีการจ่ายคูปองแบบรายครึ่งปี ให้ปรับสูตรเพื่อรองรับการจ่ายคูปอง 2 ครั้ง/ปี (m = 2) และคำนวณราคาพันธบัตรที่มีระยะเวลา 5 ปี
คำนวณ Duration แบบ Macaulay Duration ด้วยสูตร
โดยใช้SymPy
แสดงสูตรและหาค่าเมื่อ , , ,เปรียบเทียบราคาพันธบัตรเมื่อ Yield เพิ่มขึ้นทีละ 0.5% สร้างกราฟใน Python แสดงความสัมพันธ์ระหว่าง Yield Rate (i) กับราคาพันธบัตร
หา Yield Rate โดยใช้
nsolve()
ให้ใช้nsolve()
จากsympy
เพื่อประมาณค่าผลตอบแทน ที่ทำให้ราคาพันธบัตรเท่ากับ 1,100 บาทอัตราผลตอบแทนเทียบเท่า (Equivalent Yield) จงเปรียบเทียบอัตราผลตอบแทนรายปีแบบจ่ายปีละครั้ง กับแบบจ่ายราย 6 เดือน และหารายปีเทียบเท่า
คำนวณราคาพันธบัตรที่ขายด้วย premium และ discount ให้สร้างตัวอย่างพันธบัตรที่ราคาขาย > face value และ < face value แล้วคำนวณราคาทั้งสองกรณี
วิเคราะห์ break-even yield หาผลตอบแทนที่ทำให้ราคาพันธบัตรเท่ากับมูลค่าที่ต้องการลงทุน (เช่น 1,000 บาท) และวิเคราะห์ว่าอัตราผลตอบแทนนั้นคุ้มค่าหรือไม่