5  เงินงวดแบบเปลี่ยนแปลง (Varying Annuities)

Modified

30 พฤษภาคม 2568

Importantหมายเหตุ

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

from sympy import symbols, Eq, solve

เงินงวดแบบเปลี่ยนแปลงคือกรณีที่เงินชำระในแต่ละงวด ไม่เท่ากัน ซึ่งพบได้บ่อยในโลกจริง เช่น เงินสมทบที่เพิ่มขึ้นทุกปี หรือภาระผ่อนชำระที่ลดลงเมื่อเวลาเปลี่ยนไป หรืออาจจะมีค่าไม่เท่ากันแต่รูปแบบที่แน่นอน (pattern) ชัดเจน เช่น เพิ่มขึ้นหรือลดลง 10% ทุกงวดเป็นต้น

5.1 อนุกรมเงินทั่วไป (General Annuity)

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

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

อนุกรมเงินทั่วไป คืออนุกรมเงินที่ชำระไม่จำเป็นต้องเป็นงวดเท่ากันทุกระยะเวลา หรือไม่มีรูปแบบเหมือนบทที่ผ่านมา หรือหัวข้อด้านบน

  • C1 ที่เวลา t1

  • C2 ที่เวลา t2

  • Cn ที่เวลา tn

เราต้องการคำนวณมูลค่าปัจจุบันด้วย PV=k=1nCkvk,โดยที่ v=11+i

ซึ่งสามารถเขียนเป็นผลคูณภายใน (inner product) ระหว่าง

  • เวกเตอร์กระแสเงินสด C=[C1,C2,,Cn]

  • กับเวกเตอร์ส่วนลด v=[v1,v2,,vtn] จะได้ PV=C,v=k=1nCkvk

ถ้า Ci=1,i=1,2,,n ก็คือเนื้อหาบทที่ผ่านมานั่นเอง

ก่อนที่จะการคำนวณด้วยซิมไพโดยใช้ผลคูณภายใน ต้องรู้ถึงการสร้างลำดับ (sequence) ด้วยซิมไพก่อน

ตัวอย่าง เช่นลำดับตัวเลข 1 ถึง 10 จะสร้างเป็นเมตริกซืขนาด 1×10

from sympy import Matrix
seq = Matrix(range(1, 11)).T # สร้างลำดับตั้งแต่เลข 1 แต่ไม่เกิน 11
seq

[12345678910]

Importantหมายเหตุ

ผู้เขียนเลือกที่จะสร้างเมตริกซ์ชนาด 1×n เพื่อที่จะประหยัดกระดาษเท่านั้น ผู้อ่านสามารถใช้คำสั่ง

seq = Matrix(range(1, 11))

ได้เลยโดยไม่ต้องตามด้วยเมท็อด .T (.T คือการเปลี่ยนเป็นเมตริกซ์ผกผัน) และเมื่อทำการหาผลคูณภายในต้องจะเป็นเมติกซ์ทั้งสองตัวต้องมีขนาดเดียวกัน

5.1.1 การเข้าถึงค่าหรือเปลี่ยนแปลงค่าในลำดับ

ตำแหน่งในไพธอนเริ่มต้นจาก 0 ถ้าต้องการเห็นหรือใช้่ค่าใน seq ตัวแรก สามารถทำได้โดย

seq[0]

1

ถ้าต้องการเปลี่ยนค่า seq[0] เท่ากับ 100 ทำได้โดย

seq[0] = 100
seq[0]

100

from sympy import symbols, Matrix, Rational
import numpy as np
# สร้างสัญลักษณ์ v และมูลค่าปัจจุบัน PV
v, PV = symbols('v PV', positive=True) 
# เวลาของแต่ละงวด
t = np.arange(1, 11, 1)  # สร้าง t= [1,2,3,...,10]
# กระแสเงินสด (สมมุติว่าเท่ากัน 1000)
C = Matrix([1000]*len(t)) # C= [1000, 1000,..., 1000] (10 ตัว)
# เวกเตอร์ของ v^t
v_vector = Matrix([v**ti for ti in t])
# หาผลคูณภาพในด้วยเมท๊อด .dot()
eq =Eq(PV, C.dot(v_vector))
eq # แสดงสมการ

PV=1000v10+1000v9+1000v8+1000v7+1000v6+1000v5+1000v4+1000v3+1000v2+1000v

สมมุติใช้อัตราดอกเบี้ย 5% แทนค่าลงไป

eq.subs({v:1/(1.05)}).evalf(7)

PV=7721.735

ถ้าการจ่ายรายงวดแบบทั่วไปที่ไม่ได้มีขนาดยาวมาก เช่นไม่เกิน 10 งวด สามารถสร้างเมตริกซได้เองดังนี้

C = Matrix([1, 2, 4, 6, 100, 10, 100]).T
C

[124610010100]

5.2 เงินงวดเพิ่มขึ้นทุกงวด (Increasing Annuities)

เป็นกรณีที่เงินงวดเพิ่มขึ้นตามลำดับ เช่น R,2R,3R,,nR จะมี มูลค่าปัจจุบัน (Present Value) PV=k=1nkRvk ใช้ชิมไพหาคำตอบได้ดังนี้

from sympy import symbols, diff, Sum, sympify
k, n, v, R, A, PV =symbols('k n v R A PV')
A = Sum(k*R*v**k,(k, 1, n))
A

k=1nRkvk

ผลรวมจากการคำนวณด้วยซิมไพ

A.doit()

R({n22+n2forv=1v(nvvnnvnvn+1)(v1)2otherwise)

ถ้าต้องการพิสูจน์สูตรน้ีด้วยซิมไพ สามารถทำได้ดังนี้โดยเริ่ม สิ่งที่รู้จากบทที่ผ่านมาคือ

an|i=k=1nvk=v1vn1v หาอนุพันธ์ dan|idv=k=1nkvk1 ใช้ซิมไพ

dA=diff(Sum(v**k, (k, 1, n)), v )
dA.doit()

{n22+n2forv=1v(nvvnnvnvn+1)(v1)2otherwisev

เมื่อคูณ v เข้าไปจะได้ vdan|idv=k=1nkvk ดังนั้นจะได้

sympify(v*dA.doit())

{n22+n2forv=1v(nvvnnvnvn+1)(v1)2otherwise

คูณ v เข้าไปในสมการทั้งสองข้างจะได้ vdan|idv=k=1nkvk นั่นคือสูตรการจ่ายรายงวดที่ได้

A = Sum(v**k,(k, 1, n)).doit()
dA = diff(Sum(v**k,(k, 1, n)).doit(),v)

# ดึงเฉพาะกรณีที่เงื่อนไขเป็น True จาก v ไม่เท่ากับ 1
for e, cond in dA.args:
    if cond == True:
        result = e

dA = result
dA

1vn+1(n+1)v1v+vvn+1(1v)2

คูณ dA ด้วย v จะได้

vdA = v*dA
vdA

v(1vn+1(n+1)v1v+vvn+1(1v)2)

ทดสอบการคำนวณด้วยการแทนค่าโดยใช้ผลคูณภายในและผลการคำนวณโดยใช้สูตรที่ได้จากซิมไพ

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

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

กำหนดอัตราดอกเบี้ยเท่ากับ 5% จะได้

v, PV = symbols('v PV', positive=True) 
# เวลาของแต่ละงวด
t = np.arange(1, 11, 1)  # สร้าง t= [1,2,3,...,10]
# กระแสเงินสด (สมมุติว่าเท่ากัน 1000)
C = Matrix([10]*t).T # C= [10 20,..., 100] (10 ตัว)
# เวกเตอร์ของ v^t
v_t = Matrix([v**ti for ti in t])
PV =C.dot(v_t)
PV

100v10+90v9+80v8+70v7+60v6+50v5+40v4+30v3+20v2+10v

แทนค่า v=1/1.05

PV.subs({v:1/1.05}).evalf(5)

393.74

แทนค่าสูตรที่คำนวณได้จากตัวอย่างที่ผ่านมา

vdA

v(1vn+1(n+1)v1v+vvn+1(1v)2)

PV = 10*vdA.subs({n:10, v:1/1.05}).doit().evalf(5)
PV

10v(1.011.0v101.0v+v11+v(1.0v)2)

ทั้งสองวิธีมีค่าเท่ากัน ผู้อ่านต้องเลือกใช้งานให้เหมาะสมตามความถนัดของตนเอง ในทางคณิตศาสตร์การเงินเราใช้สัญลักษณ์สำหรับรายงวดที่ลักษณ์เพิ่มขึ้นงวดละ 1 หน่วย มีมูลค่าปัจจุบันเท่ากับ PV=(Ia)n|i=a¨n|invni และมูลค่าในอนาคต ณ ปีที่ n คือ FV=(Is)n|i=(1+i)n(Ia)n|i=s¨n|ini

5.3 เงินงวดลดลงทุกงวด (Decreasing Annuities)

เงินงวดลดลงทีละงวด เช่น nR,(n1)R,,R

มูลค่าปัจจุบัน (Present Value) สำหรับรายงวด n,n1,,1 คือ PV=k=1n(nk+1)Rvk=(Da)n|i=nan|ii และมูลค่าอนาคต ณ สิ้นปีที่ n FV=(Ds)n|i=(1+i)n(Da)n|i=n(1+i)nsn|ii

ผู้อ่านสามารถใช้ได้ทั้งแบบการคำนวณแบบใช้ผลคูณภายใน หรือใช้การหาผลรวมโดยตรง หรือจะใช้สูตรที่ใช้ก็สามารถใช้ซิมไพทำได้ทั้งหมด

5.4 เงินงวดแบบขั้นบันได (Step Annuities)

เงินงวดที่เปลี่ยนค่าทีละช่วง เช่น R,R,R, 2R,2R,2R, 3R,3R,3R,

สามารถกำหนดแบบเป็นช่วงด้วย Piecewise() ในซิมไพ

5.5 สูตรทั่วไปโดยใช้อัตราการเติบโต (General Formulas with Symbolic Series)

กำหนดให้อัตราการเติบโตของเงินงวดคือ g (growth rate)

มูลค่าปัจจุบันแบบทั่วไป

PV=k=1nR(1+g)k1(1+i)k

กรณีนี้รวมทั้งอนุกรมที่โตตาม g และสามารถประยุกต์ได้กับการเติบโตแบบเรขาคณิต (Geometric growth annuities)

5.6 การทำให้ง่ายขึ้นด้วยคำสั่ง simplify() (Simplifying with simplify())

เมื่อใช้ .doit() เพื่อหาผลรวมของอนุกรม มักได้ผลลัพธ์ที่ซับซ้อน ลองใช้คำสั่ง simplify() เพื่อลดรูป

from sympy import simplify
simplified_pv = simplify(PV_expr.doit())

5.7 ตัวอย่างการคำนวณมูลค่าปัจจุบัน (Example: Computing Present Value)

กำหนด: R=100, i=0.05, n=5 ใช้ซิมไพคำนวณ

PV_num = PV_inc.subs({R: 100, i: 0.05, n: 5}).doit()
(PV_num)  # ได้ผลลัพธ์เชิงตัวเลข

5.8 สรุปเปรียบเทียบประเภทของเงินงวด (Summary of Varying Annuities)

ประเภท (Type) เงินงวด (Payment) การเขียนในซิมไพ(SymPy Expression)
เพิ่มขึ้น (Increasing) kR k * R / (1+i)**k
ลดลง (Decreasing) (nk+1)R (n - k + 1) * R / (1+i)**k
ขั้นบันได (Step) เปลี่ยนช่วง Piecewise(...)
โตตาม g (Growth) R(1+g)k1 R * (1 + g)**(k-1) / (1 + i)**k

5.9 กรณีที่ใช้สัญลักษณ์ทั้งหมด

# สร้างสัญลักษณ์ cashflow และเวลา
n = 3
C = symbols(f'C1:{n+1}')       # C1, C2, C3
T = symbols(f't1:{n+1}')       # t1, t2, t3

# เวกเตอร์
C_vec = Matrix(C)
v_vec = Matrix([v**T[k] for k in range(n)])

# มูลค่าปัจจุบันทั่วไป
PV = C_vec.dot(v_vec)
print(PV)

ได้ผลลัพธ์เป็น

PV=C1vt1+C2vt2+C3vt3

5.10 สรุป

องค์ประกอบ ความหมาย
Ck กระแสเงินสดในงวดที่ k
tk เวลาที่จ่ายเงินสดในงวดที่ k
v=11+i อัตราส่วนลด
PV=Cvt มูลค่าปัจจุบันของ general annuity

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

  1. ให้สร้างสูตรของมูลค่าปัจจุบันของเงินงวดที่เพิ่มขึ้นปีละ 1 หน่วยจนครบ n งวด โดยใช้อัตราดอกเบี้ย i

  2. คำนวณมูลค่าปัจจุบันของเงินงวดเพิ่มขึ้นปีละ 100 บาท เป็นเวลา 5 ปี ที่อัตราดอกเบี้ย 6%

  3. สร้างสูตรของมูลค่าปัจจุบันสำหรับเงินงวดที่ลดลงปีละ 1 หน่วย เริ่มจาก n หน่วย

  4. เงินงวดเพิ่มขึ้นแบบเรขาคณิต จงสร้่างสูตรสำหรับเงินงวดที่เพิ่มขึ้นตามเรขาคณิตด้วยอัตรา g โดยเริ่มจาก 1 หน่วย

  5. หาค่าประมาณของเงินงวดเรขาคณิต คำนวณมูลค่าปัจจุบันของเงินงวดที่เพิ่มขึ้น 3% ต่อปี เป็นเวลา 10 ปี ด้วยดอกเบี้ย 5%

  6. การใช้สูตรลัดสำหรับเงินงวดเลขคณิต

ใช้สูตรลัด I¨an|i=an|invni เพื่อหามูลค่าปัจจุบันของเงินงวดที่เพิ่มขึ้น

  1. ใช้ซิมไพแสดงผลรวมของลำดับเลขคณิต และตรวจสอบว่าสามารถเทียบเท่ากับสูตรทั่วไปได้

  2. ให้ใช้ไลบรารี Matplotlib แสดงกระแสเงินสดที่เพิ่มขึ้นปีละ 1 หน่วย จากปี 1 ถึงปี 5

  3. ความสัมพันธ์กับสูตรพื้นฐาน จงอธิบายว่าเงินงวดที่เพิ่มขึ้นสามารถสร้างจากการผสมระหว่างเงินงวดคงที่และอนุกรมเลขคณิตอย่างไร พร้อมใช้ ซิมไพแสดงให้เห็น