ถ้าเราออมเงินทุกปี ปีละ 100,000 บาท โดยที่ได้ดอกเบี้ยหรือผลตอบแทนอื่นๆทบต้น 5% ต่อปี เมื่อครบ 30 ปีเราจะมีเงินออมรวมเท่าไร เราสามารถใช้สูตรคำนวณลำดับและอนุกรม (sequence and series) ได้ แต่ถ้าเด็กๆยังไม่รู้จัก ก็สามารถเขียนโปรแกรมรวมเองได้ตรงไปตรงมาครับ
ก่อนอื่นเราสร้างฟังก์ชั่นคำนวณมูลค่าเงินในอนาคต (future value, FV) ถ้าเรารู้ค่าเงินปัจจุบัน (present value, PV), อัตราผลตอบแทนต่อปีหรือต่อเดือน (interest, r), และจำนวนปีหรือเดือน (periods, n) จากความสัมพันธ์นี้:
$future\ value = (present\ value)(1+interest)^{periods}$
หรือ
$FV = PV (1 + r)^n$
เขียนฟังก์ชั่นเป็นภาษาไพธอนได้ดังนี้:
def future_value(present_value, interest, periods):
"""คำนวณมูลค่าเงินในอนาคต (future value)
ถ้าเรารู้ค่าเงินปัจจุบัน (present value),
อัตราผลตอบแทนต่อปีหรือต่อเดือน (interest),
และจำนวนปีหรือเดือน (periods) ที่ออมเงินไว้ให้งอกเงย
"""
return present_value * (1+interest) ** periods
# ลองพิมพ์ว่าเงิน 100 บาท ได้ดอกเบี้ยทบต้น 5% ต่อปีมีค่าเท่าไรเมื่อสิ้นปีที่ 1, 2, ..., 10
# อย่าลืมว่าเราต้องใส่ค่า 0.05 สำหรับดอกเบี้ย 5%
for year in range(0,11):
print(year, future_value(100, 0.05, year))
0 100.0 1 105.0 2 110.25 3 115.76250000000002 4 121.55062500000003 5 127.62815625000003 6 134.00956406250003 7 140.71004226562505 8 147.7455443789063 9 155.13282159785163 10 162.8894626777442
# หัดใช้ f-string เพื่อจัดรูปแบบข้อความ
# \t คือเว้นวรรค
for year in range(0,11):
#print(year, future_value(100, 0.05, year))
print(f"{year}\t{future_value(100, 0.05, year)}")
0 100.0 1 105.0 2 110.25 3 115.76250000000002 4 121.55062500000003 5 127.62815625000003 6 134.00956406250003 7 140.71004226562505 8 147.7455443789063 9 155.13282159785163 10 162.8894626777442
# ใช้ .2f ใน f-string เพื่อแสดงทศนิยมสองตำแหน่ง
# ดูตัวอย่างและคำอธิบายเพิ่มเติมเรื่อง f-string ได้ที่ https://realpython.com/python-f-strings/
for year in range(0,11):
#print(year, future_value(100, 0.05, year))
print(f"{year}\t{future_value(100, 0.05, year):.2f}")
0 100.00 1 105.00 2 110.25 3 115.76 4 121.55 5 127.63 6 134.01 7 140.71 8 147.75 9 155.13 10 162.89
ถ้าเราออมเงินเป็นก้อนเท่าๆกันทุกปี 30 ครั้ง เงินแต่ละก้อนก็จะเติบโตทบต้นปีละ 5% เงินก้อนแรกจะโต 30 ปี ก้อนที่สองจะโต 29 ปี ก้อนที่ 3 จะโต 28 ปี ... ก้อนที่ 30 ก็จะโต 1 ปี
เงินรวมตอนจบจะเท่ากับ $(present\ value)(1+interest)^{30} + (present\ value)(1+interest)^{29} + (present\ value)(1+interest)^{28} + \dots + (present\ value)(1+interest)^{3} + (present\ value)(1+interest)^{2} + (present\ value)(1+interest)^{1}$
เราเขียนเป็นฟังก์ชั่นคำนวณมูลค่าเงินทั้งหมดเมื่อมูลค่าเงินที่ออมทุกปี = deposit อัตราผลตอบแทนต่อปีหรือต่อเดือน = interest และจำนวนปีหรือเดือน = n_periods ดังนี้:
def total_future_value(deposit, interest, n_periods):
"""คำนวณค่าเงินในอนาคตทั้งหมด ถ้าออมเงินเท่าๆกันทุกปี = deposit
ด้วยผลตอบแทนต่อปี = interest (เช่น 5% = 0.05)
เป็นจำนวนปีทั้งหมด = n_periods
"""
sum = 0.0
for i in range(1,n_periods+1):
sum = sum + future_value(deposit, interest, i)
return sum
# ทดสอบฟังก์ชั่นของเรา ถ้าออม 30 ปี ไม่มีดอกเบี้ย เงินตอนจบก็น่าจะเท่ากับ 30 คูณเงินที่ฝากแต่ละงวด
total_future_value(1, 0.0, 30)
30.0
# ทดสอบฟังก์ชั่นของเรา ถ้าออม 1 ปี ดอกเบี้ย 5%
total_future_value(1, 0.05, 1)
1.05
# ทดสอบฟังก์ชั่นของเรา ถ้าออม 3 ปี ดอกเบี้ย 5%
total_future_value(1, 0.05, 3)
3.310125
# ค่าที่ได้ควรจะเท่ากับค่าข้างบน
future_value(1,0.05,3) + future_value(1,0.05,2) + future_value(1,0.05,1)
3.310125
# แก้โจทย์ดั้งเดิมของเราที่ว่าถ้าเราออมเงินทุกปี ปีละ 100,000 บาท
#โดยที่ได้ดอกเบี้ยหรือผลตอบแทนอื่นๆทบต้น 5% ต่อปี
#เมื่อครบ 30 ปีเราจะมีเงินออมรวมเท่าไร
total_future_value(100000, 0.05, 30)
6976078.987816395
เงินที่เราใส่เข้าไปทั้งหมด 30 x 100,000 บาท = 3 ล้านบาทจะงอกเงยเป็นประมาณ 7 ล้านบาทใน 30 ปี
สมมุติเราเริ่มออมตั้งแต่เริ่มทำงาน และทำงานไป 40 ปี เงินรวมทั้งหมดจะเป็นประมาณ 13 ล้าน (ซึ่งงอกเงยจากเงินฝาก 40 x 100,000 บาท = 4 ล้านบาท)
total_future_value(100000, 0.05, 40)
12683976.29546177
ถ้าออมเงินทุกปีๆละ 1 บาท ที่ผลตอบแทน 0%, 2%, 5%, 7%, 10%, 15%, 20% เป็นเวลา 10, 20, 30, 40, 50 ปี จะมีเงินรวมตอนจบดังนี้:
ผลตอบแทน = (0,2,5,7,10,15,20)
print("ปีที่ออม", end="")
for i in ผลตอบแทน:
print(f"\t{i}%", end="")
print()
for ปี in (10, 20, 30, 40, 50):
print(f"{ปี}", end="")
for i in ผลตอบแทน:
print(f"\t{total_future_value(1,i/100,ปี):.0f}", end="")
print()
ปีที่ออม 0% 2% 5% 7% 10% 15% 20% 10 10 11 13 15 18 23 31 20 20 25 35 44 63 118 224 30 30 41 70 101 181 500 1418 40 40 62 127 214 487 2046 8813 50 50 86 220 435 1280 8300 54597