การออมเงินเป็นประจำ

ถ้าเราออมเงินทุกปี ปีละ 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$

เขียนฟังก์ชั่นเป็นภาษาไพธอนได้ดังนี้:

In [1]:
def future_value(present_value, interest, periods):
    """คำนวณมูลค่าเงินในอนาคต (future value) 
    ถ้าเรารู้ค่าเงินปัจจุบัน (present value), 
    อัตราผลตอบแทนต่อปีหรือต่อเดือน (interest), 
    และจำนวนปีหรือเดือน (periods) ที่ออมเงินไว้ให้งอกเงย
    """
    return present_value * (1+interest) ** periods
In [2]:
# ลองพิมพ์ว่าเงิน 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
In [3]:
# หัดใช้ 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
In [4]:
# ใช้ .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 ดังนี้:

In [5]:
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
In [6]:
# ทดสอบฟังก์ชั่นของเรา ถ้าออม 30 ปี ไม่มีดอกเบี้ย เงินตอนจบก็น่าจะเท่ากับ 30 คูณเงินที่ฝากแต่ละงวด
total_future_value(1, 0.0, 30)
Out[6]:
30.0
In [7]:
# ทดสอบฟังก์ชั่นของเรา ถ้าออม 1 ปี ดอกเบี้ย 5%
total_future_value(1, 0.05, 1)
Out[7]:
1.05
In [8]:
# ทดสอบฟังก์ชั่นของเรา ถ้าออม 3 ปี ดอกเบี้ย 5%

total_future_value(1, 0.05, 3)
Out[8]:
3.310125
In [9]:
# ค่าที่ได้ควรจะเท่ากับค่าข้างบน
future_value(1,0.05,3) + future_value(1,0.05,2) + future_value(1,0.05,1)
Out[9]:
3.310125
In [10]:
# แก้โจทย์ดั้งเดิมของเราที่ว่าถ้าเราออมเงินทุกปี ปีละ 100,000 บาท 
#โดยที่ได้ดอกเบี้ยหรือผลตอบแทนอื่นๆทบต้น 5% ต่อปี
#เมื่อครบ 30 ปีเราจะมีเงินออมรวมเท่าไร

total_future_value(100000, 0.05, 30)
Out[10]:
6976078.987816395

เงินที่เราใส่เข้าไปทั้งหมด 30 x 100,000 บาท = 3 ล้านบาทจะงอกเงยเป็นประมาณ 7 ล้านบาทใน 30 ปี

สมมุติเราเริ่มออมตั้งแต่เริ่มทำงาน และทำงานไป 40 ปี เงินรวมทั้งหมดจะเป็นประมาณ 13 ล้าน (ซึ่งงอกเงยจากเงินฝาก 40 x 100,000 บาท = 4 ล้านบาท)

In [11]:
total_future_value(100000, 0.05, 40)
Out[11]:
12683976.29546177

ถ้าออมเงินทุกปีๆละ 1 บาท ที่ผลตอบแทน 0%, 2%, 5%, 7%, 10%, 15%, 20% เป็นเวลา 10, 20, 30, 40, 50 ปี จะมีเงินรวมตอนจบดังนี้:

In [12]:
ผลตอบแทน = (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