from sympy import symbols, Eq, solve
5 เงินงวดแบบเปลี่ยนแปลง (Varying Annuities)
เงินงวดแบบเปลี่ยนแปลงคือกรณีที่เงินชำระในแต่ละงวด ไม่เท่ากัน ซึ่งพบได้บ่อยในโลกจริง เช่น เงินสมทบที่เพิ่มขึ้นทุกปี หรือภาระผ่อนชำระที่ลดลงเมื่อเวลาเปลี่ยนไป หรืออาจจะมีค่าไม่เท่ากันแต่รูปแบบที่แน่นอน (pattern) ชัดเจน เช่น เพิ่มขึ้นหรือลดลง 10% ทุกงวดเป็นต้น
5.1 อนุกรมเงินทั่วไป (General Annuity)
อนุกรมเงินทั่วไป คืออนุกรมเงินที่ชำระไม่จำเป็นต้องเป็นงวดเท่ากันทุกระยะเวลา หรือไม่มีรูปแบบเหมือนบทที่ผ่านมา หรือหัวข้อด้านบน
ที่เวลา ที่เวลา ที่เวลา
เราต้องการคำนวณมูลค่าปัจจุบันด้วย
ซึ่งสามารถเขียนเป็นผลคูณภายใน (inner product) ระหว่าง
เวกเตอร์กระแสเงินสด
กับเวกเตอร์ส่วนลด
จะได้
ถ้า
ก่อนที่จะการคำนวณด้วยซิมไพโดยใช้ผลคูณภายใน ต้องรู้ถึงการสร้างลำดับ (sequence) ด้วยซิมไพก่อน
ตัวอย่าง เช่นลำดับตัวเลข 1 ถึง 10 จะสร้างเป็นเมตริกซืขนาด
from sympy import Matrix
= Matrix(range(1, 11)).T # สร้างลำดับตั้งแต่เลข 1 แต่ไม่เกิน 11
seq seq
5.1.1 การเข้าถึงค่าหรือเปลี่ยนแปลงค่าในลำดับ
ตำแหน่งในไพธอนเริ่มต้นจาก 0 ถ้าต้องการเห็นหรือใช้่ค่าใน seq ตัวแรก สามารถทำได้โดย
0] seq[
ถ้าต้องการเปลี่ยนค่า seq[0] เท่ากับ 100 ทำได้โดย
0] = 100
seq[0] seq[
from sympy import symbols, Matrix, Rational
import numpy as np
# สร้างสัญลักษณ์ v และมูลค่าปัจจุบัน PV
= symbols('v PV', positive=True)
v, PV # เวลาของแต่ละงวด
= np.arange(1, 11, 1) # สร้าง t= [1,2,3,...,10]
t # กระแสเงินสด (สมมุติว่าเท่ากัน 1000)
= Matrix([1000]*len(t)) # C= [1000, 1000,..., 1000] (10 ตัว)
C # เวกเตอร์ของ v^t
= Matrix([v**ti for ti in t])
v_vector # หาผลคูณภาพในด้วยเมท๊อด .dot()
=Eq(PV, C.dot(v_vector))
eq # แสดงสมการ eq
สมมุติใช้อัตราดอกเบี้ย 5% แทนค่าลงไป
1/(1.05)}).evalf(7) eq.subs({v:
ถ้าการจ่ายรายงวดแบบทั่วไปที่ไม่ได้มีขนาดยาวมาก เช่นไม่เกิน 10 งวด สามารถสร้างเมตริกซได้เองดังนี้
= Matrix([1, 2, 4, 6, 100, 10, 100]).T
C C
5.2 เงินงวดเพิ่มขึ้นทุกงวด (Increasing Annuities)
เป็นกรณีที่เงินงวดเพิ่มขึ้นตามลำดับ เช่น
from sympy import symbols, diff, Sum, sympify
=symbols('k n v R A PV')
k, n, v, R, A, PV = Sum(k*R*v**k,(k, 1, n))
A A
ผลรวมจากการคำนวณด้วยซิมไพ
A.doit()
ถ้าต้องการพิสูจน์สูตรน้ีด้วยซิมไพ สามารถทำได้ดังนี้โดยเริ่ม สิ่งที่รู้จากบทที่ผ่านมาคือ
=diff(Sum(v**k, (k, 1, n)), v )
dA dA.doit()
เมื่อคูณ
*dA.doit()) sympify(v
คูณ
= Sum(v**k,(k, 1, n)).doit()
A = diff(Sum(v**k,(k, 1, n)).doit(),v)
dA
# ดึงเฉพาะกรณีที่เงื่อนไขเป็น True จาก v ไม่เท่ากับ 1
for e, cond in dA.args:
if cond == True:
= e
result
= result
dA dA
คูณ
= v*dA
vdA vdA
ทดสอบการคำนวณด้วยการแทนค่าโดยใช้ผลคูณภายในและผลการคำนวณโดยใช้สูตรที่ได้จากซิมไพ
กำหนดอัตราดอกเบี้ยเท่ากับ 5% จะได้
= symbols('v PV', positive=True)
v, PV # เวลาของแต่ละงวด
= np.arange(1, 11, 1) # สร้าง t= [1,2,3,...,10]
t # กระแสเงินสด (สมมุติว่าเท่ากัน 1000)
= Matrix([10]*t).T # C= [10 20,..., 100] (10 ตัว)
C # เวกเตอร์ของ v^t
= Matrix([v**ti for ti in t])
v_t =C.dot(v_t)
PV PV
แทนค่า
1/1.05}).evalf(5) PV.subs({v:
แทนค่าสูตรที่คำนวณได้จากตัวอย่างที่ผ่านมา
vdA
= 10*vdA.subs({n:10, v:1/1.05}).doit().evalf(5)
PV PV
ทั้งสองวิธีมีค่าเท่ากัน ผู้อ่านต้องเลือกใช้งานให้เหมาะสมตามความถนัดของตนเอง ในทางคณิตศาสตร์การเงินเราใช้สัญลักษณ์สำหรับรายงวดที่ลักษณ์เพิ่มขึ้นงวดละ 1 หน่วย มีมูลค่าปัจจุบันเท่ากับ
5.3 เงินงวดลดลงทุกงวด (Decreasing Annuities)
เงินงวดลดลงทีละงวด เช่น
มูลค่าปัจจุบัน (Present Value) สำหรับรายงวด
ผู้อ่านสามารถใช้ได้ทั้งแบบการคำนวณแบบใช้ผลคูณภายใน หรือใช้การหาผลรวมโดยตรง หรือจะใช้สูตรที่ใช้ก็สามารถใช้ซิมไพทำได้ทั้งหมด
5.4 เงินงวดแบบขั้นบันได (Step Annuities)
เงินงวดที่เปลี่ยนค่าทีละช่วง เช่น
สามารถกำหนดแบบเป็นช่วงด้วย Piecewise()
ในซิมไพ
5.5 สูตรทั่วไปโดยใช้อัตราการเติบโต (General Formulas with Symbolic Series)
กำหนดให้อัตราการเติบโตของเงินงวดคือ
มูลค่าปัจจุบันแบบทั่วไป
กรณีนี้รวมทั้งอนุกรมที่โตตาม
5.6 การทำให้ง่ายขึ้นด้วยคำสั่ง simplify()
(Simplifying with simplify()
)
เมื่อใช้ .doit()
เพื่อหาผลรวมของอนุกรม มักได้ผลลัพธ์ที่ซับซ้อน ลองใช้คำสั่ง simplify()
เพื่อลดรูป
from sympy import simplify
= simplify(PV_expr.doit()) simplified_pv
5.7 ตัวอย่างการคำนวณมูลค่าปัจจุบัน (Example: Computing Present Value)
กำหนด:
= PV_inc.subs({R: 100, i: 0.05, n: 5}).doit()
PV_num # ได้ผลลัพธ์เชิงตัวเลข (PV_num)
5.8 สรุปเปรียบเทียบประเภทของเงินงวด (Summary of Varying Annuities)
ประเภท (Type) | เงินงวด (Payment) | การเขียนในซิมไพ(SymPy Expression) |
---|---|---|
เพิ่มขึ้น (Increasing) | k * R / (1+i)**k |
|
ลดลง (Decreasing) | (n - k + 1) * R / (1+i)**k |
|
ขั้นบันได (Step) | เปลี่ยนช่วง | Piecewise(...) |
โตตาม g (Growth) | R * (1 + g)**(k-1) / (1 + i)**k |
5.9 กรณีที่ใช้สัญลักษณ์ทั้งหมด
# สร้างสัญลักษณ์ cashflow และเวลา
= 3
n = symbols(f'C1:{n+1}') # C1, C2, C3
C = symbols(f't1:{n+1}') # t1, t2, t3
T
# เวกเตอร์
= Matrix(C)
C_vec = Matrix([v**T[k] for k in range(n)])
v_vec
# มูลค่าปัจจุบันทั่วไป
= C_vec.dot(v_vec)
PV print(PV)
ได้ผลลัพธ์เป็น
5.10 สรุป
องค์ประกอบ | ความหมาย |
---|---|
กระแสเงินสดในงวดที่ |
|
เวลาที่จ่ายเงินสดในงวดที่ |
|
อัตราส่วนลด | |
มูลค่าปัจจุบันของ general annuity |
5.11 แบบฝึกหัดท้ายบท
ให้สร้างสูตรของมูลค่าปัจจุบันของเงินงวดที่เพิ่มขึ้นปีละ 1 หน่วยจนครบ
งวด โดยใช้อัตราดอกเบี้ยคำนวณมูลค่าปัจจุบันของเงินงวดเพิ่มขึ้นปีละ 100 บาท เป็นเวลา 5 ปี ที่อัตราดอกเบี้ย 6%
สร้างสูตรของมูลค่าปัจจุบันสำหรับเงินงวดที่ลดลงปีละ 1 หน่วย เริ่มจาก
หน่วยเงินงวดเพิ่มขึ้นแบบเรขาคณิต จงสร้่างสูตรสำหรับเงินงวดที่เพิ่มขึ้นตามเรขาคณิตด้วยอัตรา
โดยเริ่มจาก 1 หน่วยหาค่าประมาณของเงินงวดเรขาคณิต คำนวณมูลค่าปัจจุบันของเงินงวดที่เพิ่มขึ้น 3% ต่อปี เป็นเวลา 10 ปี ด้วยดอกเบี้ย 5%
การใช้สูตรลัดสำหรับเงินงวดเลขคณิต
ใช้สูตรลัด
ใช้ซิมไพแสดงผลรวมของลำดับเลขคณิต และตรวจสอบว่าสามารถเทียบเท่ากับสูตรทั่วไปได้
ให้ใช้ไลบรารี Matplotlib แสดงกระแสเงินสดที่เพิ่มขึ้นปีละ 1 หน่วย จากปี 1 ถึงปี 5
ความสัมพันธ์กับสูตรพื้นฐาน จงอธิบายว่าเงินงวดที่เพิ่มขึ้นสามารถสร้างจากการผสมระหว่างเงินงวดคงที่และอนุกรมเลขคณิตอย่างไร พร้อมใช้ ซิมไพแสดงให้เห็น