8  พันธบัตรและอัตราผลตอบแทน (Bonds and Yield Rates)

Modified

30 พฤษภาคม 2568

Importantหมายเหตุ

ก่อนเริ่มการคำนวณเชิงสัญลักษณ์ด้วยซิมไพ ขอให้ผู้อ่านทำการเรียกใช้คำสั่งดังต่อไปนี้ก่อน

from sympy import symbols, Eq, solve

เพื่อจะได้ไม่ต้องเรียกใช้งานทุกครั้ง

พันธบัตรเป็นตราสารหนี้ที่ผู้ออกให้คำมั่นว่าจะจ่ายดอกเบี้ยเป็นงวดๆ และจ่ายคืนเงินต้นเมื่อครบกำหนด ในบทนี้จะกล่าวถึงวิธีการคำนวณราคาพันธบัตร การตีความราคาที่สูงหรือต่ำกว่ามูลค่าที่ตราไว้ และการหาอัตราผลตอบแทนที่แท้จริงเมื่อถือพันธบัตรจนครบกำหนด พันธบัตร เป็นคำที่ใช้กับรัฐเป็นผู้ออกตราสารหนี้นี้ ถ้าเป็นเอกชนจะเรียกว่าหุ้นกู้ (dedenture)

8.1 สูตรราคาพันธบัตร (Bond Price Formula)

แผนภาพสมการแห่งมูลค่า

แผนภาพสมการแห่งมูลค่า

สูตรทั่วไปสำหรับการคำนวณราคาพันธบัตร (P) คือ P=Ran|i+Fvn โดยที่

  • P = ราคาปัจจุบันของพันธบัตร

  • R = จำนวนเงินคูปองที่จ่ายในแต่ละงวด

  • F = มูลค่าที่ตราไว้ (Face Value)

  • i = อัตราผลตอบแทน (ต่อหนึ่งงวด) เป็นอัตราดอกเบี้ยของตลาด

  • n = จำนวนงวดทั้งหมดจนกว่าจะครบกำหนด

  • v=11+i

  • an|i=1vni คือมูลค่าปัจจุบันของเงินงวด

ตัวอย่าง พันธบัตรมูลค่าที่ตราไว้ 1,000 บาท จ่ายคูปอง 8% ต่อปี จ่ายทุก ครึ่งปี เท่ากับ R=40 บาท เป็นเวลา 10 ปี รวม 20 งวด ต้องการรู้ราคาพันธบัตรเมื่ออัตราผลตอบแทนคือ 9% ต่อปี (หรือ 4.5% ต่อครึ่งปี)

from sympy import symbols, Rational, N
i, n, v, F, P, R, a_n = symbols('i n v F P R a_n')
F = 1000
R = 40
i = 0.045
v = 1 / (1 + i)
a_n = (1 - v**n) / i
P = R * a_n + F * v**n
P_val = P.subs({n: 20})
P_val.evalf(5)

934.96

ราคาพันธบัตรนี้มีมูลค่าเท่ากับ 934.96 บาท

8.2 การขายแบบพรีเมียมและดิสเคานต์ (Premium and Discount)

ราคาของพันธบัตรขึ้นอยู่กับว่าอัตราคูปอง r เทียบกับอัตราผลตอบแทนที่ต้องการ i

  • ถ้า r>i ขายที่พรีเมียม (ราคาสูงกว่ามูลค่าที่ตราไว้)

  • ถ้า r<i ขายที่ดิสเคานต์ (ราคาต่ำกว่ามูลค่าที่ตราไว้)

  • ถ้า r=i ขายที่ Par Value (เท่ากับมูลค่าที่ตราไว้)

สูตรอีกแบบหนึ่งที่ช่วยวิเคราะห์ได้ P=F+(RFi)an|i มาจากการเปรียบผลตอบแทนที่จะได้รับจากพันธบัตร เทียบกับการลงทุนได้รับจากดอกเบี้ย i

ถ้าลงทุนด้วยซื้อพันธบัตรที่ราคา P จะมีแผนภาพตามรูปที่ผ่านมา และถ้าลงทุนด้วยเงิน F บาทที่อัตราดอกเบี้ย i เป็นเวลาเท่ากับการลงทุนในพันธบัตร จะมีแผนภาพดังนี้

แผนภาพสมการแห่งมูลค่า เมื่อนำสมการแห่งมูลค่าทั้ง 2 มาลบกัน จะได้ PF=Ran|i+FvniFan|iFvnP=F+(RiF)an|i

ซึ่งแสดงว่า ถ้า R>Fi ราคาจะสูงกว่ามูลค่าที่ตราไว้ (Premium)

8.3 อัตราผลตอบแทนเมื่อถือจนครบกำหนด (Yield to Maturity, YTM)

YTM คือ อัตราผลตอบแทนที่แท้จริงของผู้ถือพันธบัตร หากถือไว้จนถึงวันครบกำหนด โดยคำนวณจากสมการ P=Ran|i+Fvn เหมือนเดิม แต่ว่าเราไม่ทราบอัตราดอกเบี้ย จึงต้องแก้สมการนี้เพื่อหาอัตราดอกเบี้ยที่ได้รับจากมากกว่า เทียบเท่า หรือน้อย กว่าอัตราดอกเบี้ยในตลาด

เนื่องจากเป็นการแก้สมการพหุนามทำให้ i จำนวนคำตอบได้สูงสุดเท่ากับจำนวนดีกรี จึงแนะนำให้รู้จัก อีกฟังก์ชันในซิมไพ คือnsolve()

from sympy import symbols, Eq, nsolve, N

i, v, a_n, F, R, P = symbols('i v a_n F R P')
v = 1 / (1 + i)
a_n = (1 - v**20) / i
P = 1000
R = 100
F = 1000
eq = Eq(P, R * a_n + F * v**20)
ytm = nsolve(eq, i, 0.07)
ytm.evalf(2)

0.1

Noteคำสั่้ง nsolve()

ในซิมไพฟังก์ชัน nsolve() ใช้สำหรับ หาคำตอบของสมการเชิงตัวเลข (numerical solution) ด้วยวิธีทางตัวเลข เช่น Newton-Raphson หรือ secant method ต่างจาก solve() ที่ใช้ วิธีเชิงสัญลักษณ์ (symbolic) ซึ่งอาจหาคำตอบไม่ได้ในบางกรณี

from sympy import symbols, Eq, nsolve
x = symbols('x')
eq = Eq(x**3 - 2*x - 5, 0)

# ใช้ค่าเริ่มต้น x = 2 ในการหาคำตอบเชิงตัวเลข
solution = nsolve(eq, x, 2)
solution.evalf(4)

2.095

ซึ่งเป็นคำตอบของ x32x5=0 โดยประมาณ

พารามิเตอร์

nsolve(f, symbol(s), guess)
ชื่อ ความหมาย
f สมการ หรือระบบสมการ
symbol(s) ตัวแปรที่ต้องการหาคำตอบ (หนึ่งตัวหรือหลายตัว)
guess ค่าเริ่มต้นในการเริ่มหาคำตอบ

ข้อควรระวัง

  • nsolve() ใช้สำหรับสมการที่ไม่สามารถแก้เชิงสัญลักษณ์ได้ง่าย เช่น สมการพหุนามดีกรีสูง หรือสมการทรานส์เซนเดนทัล (มี exp,log,sin, ฯลฯ)

  • ต้องกำหนด “ค่าเริ่มต้น (initial guess)” ที่เหมาะสม มิฉะนั้นอาจหาคำตอบไม่ได้หรือได้ค่าที่ผิด

เปรียบเทียบกับ solve()

ฟังก์ชัน วิธีการ ผลลัพธ์
solve() เชิงสัญลักษณ์ คำตอบในรูปสูตร
nsolve() เชิงตัวเลข ค่าประมาณเชิงทศนิยม

ข้อสังเกตุของพันธบัตรใกล้ครบกำหนด (Bonds Near Maturity)

เมื่อพันธบัตรใกล้ครบกำหนด

  • มูลค่าปัจจุบันจะเข้าใกล้กับมูลค่าที่ตราไว้ F

  • ราคาของพันธบัตรจะอ่อนไหวต่ออัตราคูปองและอัตราดอกเบี้ยน้อยลง

  • ความต่างระหว่างราคาและ F มักจะเล็กลง

8.4 แบบฝึกหัดท้ายบท

  1. คำนวณราคาพันธบัตร (Bond Price) สร้างสมการราคาพันธบัตร P=Fran|i+Cvn และคำนวณราคาพันธบัตรเมื่อ
  • F=1,000, r=6%, i=5%, n=10, C=F
  1. หา Yield Rate จากราคาพันธบัตร ใช้ solve() หาอัตราผลตอบแทน i ที่ทำให้พันธบัตรราคา 950 บาท โดยใช้สูตรในข้อ 1

  2. สร้างฟังก์ชันคำนวณราคาพันธบัตร ให้เขียนฟังก์ชันใน Python ที่รับพารามิเตอร์ F,r,n,i แล้วคืนค่าราคาพันธบัตร

  3. คำนวณราคาเมื่อมีการจ่ายคูปองแบบรายครึ่งปี ให้ปรับสูตรเพื่อรองรับการจ่ายคูปอง 2 ครั้ง/ปี (m = 2) และคำนวณราคาพันธบัตรที่มีระยะเวลา 5 ปี

  4. คำนวณ Duration แบบ Macaulay Duration ด้วยสูตร D=t=1ntRvt+nCvnP โดยใช้ SymPy แสดงสูตรและหาค่าเมื่อ R=60, C=1,000, v=1/1.05, n=10

  5. เปรียบเทียบราคาพันธบัตรเมื่อ Yield เพิ่มขึ้นทีละ 0.5% สร้างกราฟใน Python แสดงความสัมพันธ์ระหว่าง Yield Rate (i) กับราคาพันธบัตร P(i)

  6. หา Yield Rate โดยใช้ nsolve() ให้ใช้ nsolve() จาก sympy เพื่อประมาณค่าผลตอบแทน i ที่ทำให้ราคาพันธบัตรเท่ากับ 1,100 บาท

  7. อัตราผลตอบแทนเทียบเท่า (Equivalent Yield) จงเปรียบเทียบอัตราผลตอบแทนรายปีแบบจ่ายปีละครั้ง กับแบบจ่ายราย 6 เดือน และหารายปีเทียบเท่า

  8. คำนวณราคาพันธบัตรที่ขายด้วย premium และ discount ให้สร้างตัวอย่างพันธบัตรที่ราคาขาย > face value และ < face value แล้วคำนวณราคาทั้งสองกรณี

  9. วิเคราะห์ break-even yield หาผลตอบแทนที่ทำให้ราคาพันธบัตรเท่ากับมูลค่าที่ต้องการลงทุน (เช่น 1,000 บาท) และวิเคราะห์ว่าอัตราผลตอบแทนนั้นคุ้มค่าหรือไม่