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

Modified

30 พฤษภาคม 2568

Importantหมายเหตุ

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

from sympy import symbols, Eq, solve

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

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

\(\displaystyle 934.96\)

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

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

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

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

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

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

สูตรอีกแบบหนึ่งที่ช่วยวิเคราะห์ได้ \[ P = F + (R - F \cdot i) \cdot a_{\overline{n}|i} \] มาจากการเปรียบผลตอบแทนที่จะได้รับจากพันธบัตร เทียบกับการลงทุนได้รับจากดอกเบี้ย \(i\)

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

แผนภาพสมการแห่งมูลค่า เมื่อนำสมการแห่งมูลค่าทั้ง 2 มาลบกัน จะได้ \[\begin{aligned} P-F &=R\cdot a_{\overline{n}|i}+F\cdot v^n-iF\cdot a_{\overline{n}|i}-F\cdot v^n\\ P &= F+(R-iF)\cdot a_{\overline{n}|i} \end{aligned}\]

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

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

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)

\(\displaystyle 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)

\(\displaystyle 2.095\)

ซึ่งเป็นคำตอบของ \(x^3 - 2x - 5 = 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 = Fr a_{\overline{n}|i} + C v^n\) และคำนวณราคาพันธบัตรเมื่อ
  • \(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 = \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\)

  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 บาท) และวิเคราะห์ว่าอัตราผลตอบแทนนั้นคุ้มค่าหรือไม่

OSZAR »