Time Value of Money คืออะไร
Time Value of Money (TVM) หรือมูลค่าเงินตามเวลา เป็นแนวคิดพื้นฐานที่สำคัญที่สุดในการเงิน หลักการง่ายๆคือ เงิน 1 บาทวันนี้มีมูลค่ามากกว่าเงิน 1 บาทในอนาคต เพราะเงินวันนี้สามารถนำไปลงทุนสร้างผลตอบแทนได้
TVM เป็นพื้นฐานของการวิเคราะห์การลงทุน การคำนวณสินเชื่อ การวางแผนเกษียณ การประเมินมูลค่าธุรกิจ และการตัดสินใจทางการเงินทุกประเภท สูตรหลักที่ต้องรู้คือ Present Value (PV), Future Value (FV), Annuity, NPV และ IRR
| แนวคิด | สูตร | ใช้เมื่อ |
|---|---|---|
| Future Value | FV = PV × (1+r)^n | คำนวณเงินในอนาคต |
| Present Value | PV = FV / (1+r)^n | คำนวณมูลค่าปัจจุบัน |
| Annuity PV | PV = PMT × [1-(1+r)^-n] / r | สินเชื่อ ค่างวด |
| Annuity FV | FV = PMT × [(1+r)^n - 1] / r | การออมสม่ำเสมอ |
| NPV | NPV = Σ CF_t / (1+r)^t | ประเมินโครงการ |
| IRR | NPV = 0 → หา r | อัตราผลตอบแทน |
Python — TVM Calculator
# tvm_calculator.py — Time Value of Money Calculator
import numpy as np
from dataclasses import dataclass
from typing import List, Optional
class TVMCalculator:
"""คำนวณ Time Value of Money"""
@staticmethod
def future_value(pv: float, rate: float, periods: int,
compounding: int = 1) -> float:
"""Future Value — มูลค่าอนาคต
pv: เงินต้น
rate: อัตราดอกเบี้ยต่อปี (เช่น 0.05 = 5%)
periods: จำนวนปี
compounding: จำนวนครั้งที่ทบต้นต่อปี (1=ปีละครั้ง, 12=รายเดือน)
"""
r = rate / compounding
n = periods * compounding
return pv * (1 + r) ** n
@staticmethod
def present_value(fv: float, rate: float, periods: int,
compounding: int = 1) -> float:
"""Present Value — มูลค่าปัจจุบัน"""
r = rate / compounding
n = periods * compounding
return fv / (1 + r) ** n
@staticmethod
def annuity_pv(pmt: float, rate: float, periods: int) -> float:
"""Present Value of Annuity — มูลค่าปัจจุบันของเงินงวด"""
if rate == 0:
return pmt * periods
return pmt * (1 - (1 + rate) ** (-periods)) / rate
@staticmethod
def annuity_fv(pmt: float, rate: float, periods: int) -> float:
"""Future Value of Annuity — มูลค่าอนาคตของเงินออม"""
if rate == 0:
return pmt * periods
return pmt * ((1 + rate) ** periods - 1) / rate
@staticmethod
def loan_payment(principal: float, rate: float, periods: int) -> float:
"""คำนวณค่างวดสินเชื่อ (PMT)"""
if rate == 0:
return principal / periods
return principal * rate / (1 - (1 + rate) ** (-periods))
@staticmethod
def npv(rate: float, cash_flows: List[float]) -> float:
"""Net Present Value"""
return sum(cf / (1 + rate) ** t
for t, cf in enumerate(cash_flows))
@staticmethod
def irr(cash_flows: List[float], guess: float = 0.1,
tolerance: float = 1e-8, max_iter: int = 1000) -> float:
"""Internal Rate of Return (Newton's Method)"""
rate = guess
for _ in range(max_iter):
npv = sum(cf / (1 + rate) ** t
for t, cf in enumerate(cash_flows))
dnpv = sum(-t * cf / (1 + rate) ** (t + 1)
for t, cf in enumerate(cash_flows))
if abs(dnpv) < 1e-12:
break
new_rate = rate - npv / dnpv
if abs(new_rate - rate) < tolerance:
return new_rate
rate = new_rate
return rate
@staticmethod
def payback_period(cash_flows: List[float]) -> float:
"""Payback Period — ระยะเวลาคืนทุน"""
cumulative = 0
for t, cf in enumerate(cash_flows):
cumulative += cf
if cumulative >= 0:
# Interpolate
prev_cum = cumulative - cf
return t + abs(prev_cum) / cf if cf != 0 else t
return float("inf")
# === ตัวอย่างการใช้งาน ===
calc = TVMCalculator()
# 1. Future Value — ฝากเงิน 100,000 บาท ดอกเบี้ย 5% 10 ปี
fv = calc.future_value(100000, 0.05, 10)
print(f"1. Future Value: {fv:,.2f} บาท")
# 2. Present Value — ต้องการ 1,000,000 ใน 20 ปี ดอกเบี้ย 6%
pv = calc.present_value(1000000, 0.06, 20)
print(f"2. Present Value: {pv:,.2f} บาท")
# 3. ออมเดือนละ 5,000 ดอกเบี้ย 7%/ปี 30 ปี
fv_annuity = calc.annuity_fv(5000, 0.07/12, 30*12)
print(f"3. Retirement Fund: {fv_annuity:,.2f} บาท")
# 4. สินเชื่อบ้าน 3,000,000 ดอกเบี้ย 5.5% 25 ปี
pmt = calc.loan_payment(3000000, 0.055/12, 25*12)
print(f"4. Monthly Payment: {pmt:,.2f} บาท")
# 5. NPV — ลงทุน 1M ได้ Cash Flow 300K/ปี 5 ปี
cash_flows = [-1000000, 300000, 350000, 400000, 350000, 300000]
npv_result = calc.npv(0.10, cash_flows)
print(f"5. NPV (10%): {npv_result:,.2f} บาท")
# 6. IRR
irr_result = calc.irr(cash_flows)
print(f"6. IRR: {irr_result:.2%}")
# 7. Payback Period
pp = calc.payback_period(cash_flows)
print(f"7. Payback Period: {pp:.1f} ปี")
Loan Amortization Schedule
# loan_amortization.py — ตารางผ่อนชำระสินเชื่อ
class LoanAmortization:
"""สร้างตารางผ่อนชำระสินเชื่อ"""
def __init__(self, principal, annual_rate, years):
self.principal = principal
self.monthly_rate = annual_rate / 12
self.months = years * 12
self.monthly_payment = self._calc_payment()
def _calc_payment(self):
r = self.monthly_rate
n = self.months
if r == 0:
return self.principal / n
return self.principal * r / (1 - (1 + r) ** (-n))
def generate_schedule(self):
"""สร้างตารางผ่อนชำระ"""
balance = self.principal
schedule = []
total_interest = 0
total_principal = 0
for month in range(1, self.months + 1):
interest = balance * self.monthly_rate
principal_paid = self.monthly_payment - interest
balance -= principal_paid
total_interest += interest
total_principal += principal_paid
schedule.append({
"month": month,
"payment": round(self.monthly_payment, 2),
"principal": round(principal_paid, 2),
"interest": round(interest, 2),
"balance": round(max(0, balance), 2),
"total_interest": round(total_interest, 2),
})
return schedule
def print_summary(self):
"""แสดงสรุป"""
schedule = self.generate_schedule()
total_paid = self.monthly_payment * self.months
total_interest = schedule[-1]["total_interest"]
print(f"\n{'='*50}")
print(f"Loan Amortization Summary")
print(f"{'='*50}")
print(f" Principal: {self.principal:>15,.2f} บาท")
print(f" Annual Rate: {self.monthly_rate*12:>14.2%}")
print(f" Term: {self.months:>12} เดือน ({self.months//12} ปี)")
print(f" Monthly Payment: {self.monthly_payment:>15,.2f} บาท")
print(f" Total Paid: {total_paid:>15,.2f} บาท")
print(f" Total Interest: {total_interest:>15,.2f} บาท")
print(f" Interest Ratio: {total_interest/total_paid:>14.1%}")
# แสดงปีแรกและปีสุดท้าย
print(f"\n{'Month':<8} {'Payment':>12} {'Principal':>12} "
f"{'Interest':>12} {'Balance':>15}")
print("-" * 63)
for s in schedule[:6]:
print(f"{s['month']:<8} {s['payment']:>12,.2f} "
f"{s['principal']:>12,.2f} {s['interest']:>12,.2f} "
f"{s['balance']:>15,.2f}")
print(" ...")
for s in schedule[-3:]:
print(f"{s['month']:<8} {s['payment']:>12,.2f} "
f"{s['principal']:>12,.2f} {s['interest']:>12,.2f} "
f"{s['balance']:>15,.2f}")
def compare_extra_payment(self, extra_monthly=0, extra_yearly=0):
"""เปรียบเทียบการผ่อนเพิ่ม"""
# Normal
normal_interest = sum(
s["interest"] for s in self.generate_schedule()
)
normal_months = self.months
# With Extra Payment
balance = self.principal
months = 0
total_interest = 0
while balance > 0 and months < self.months:
months += 1
interest = balance * self.monthly_rate
total_interest += interest
principal_paid = self.monthly_payment - interest + extra_monthly
# Extra yearly payment
if extra_yearly > 0 and months % 12 == 0:
principal_paid += extra_yearly
balance -= principal_paid
if balance < 0:
balance = 0
saved_interest = normal_interest - total_interest
saved_months = normal_months - months
print(f"\n{'='*50}")
print(f"Extra Payment Comparison")
print(f"{'='*50}")
print(f" Normal: {normal_months} months, "
f"Interest: {normal_interest:,.0f}")
print(f" Extra: {months} months, "
f"Interest: {total_interest:,.0f}")
print(f" Saved: {saved_months} months, "
f"{saved_interest:,.0f} บาท interest")
# ตัวอย่าง: สินเชื่อบ้าน 3 ล้าน ดอกเบี้ย 5.5% 25 ปี
loan = LoanAmortization(3000000, 0.055, 25)
loan.print_summary()
loan.compare_extra_payment(extra_monthly=2000)
Investment Comparison
# investment_compare.py — เปรียบเทียบการลงทุน
calc = TVMCalculator()
projects = [
{
"name": "Project A — ร้านกาแฟ",
"cash_flows": [-500000, 150000, 180000, 200000, 220000, 250000],
},
{
"name": "Project B — ร้านออนไลน์",
"cash_flows": [-300000, 80000, 120000, 150000, 180000, 200000],
},
{
"name": "Project C — ตู้จำหน่ายสินค้า",
"cash_flows": [-200000, 60000, 70000, 80000, 90000, 100000],
},
]
discount_rate = 0.08 # 8%
print(f"\n{'='*60}")
print(f"Investment Comparison (Discount Rate: {discount_rate:.0%})")
print(f"{'='*60}")
print(f"\n{'Project':<30} {'NPV':>12} {'IRR':>8} {'Payback':>10}")
print("-" * 62)
for p in projects:
npv = calc.npv(discount_rate, p["cash_flows"])
irr = calc.irr(p["cash_flows"])
pp = calc.payback_period(p["cash_flows"])
invest = abs(p["cash_flows"][0])
pi = (npv + invest) / invest # Profitability Index
print(f"{p['name']:<30} {npv:>12,.0f} {irr:>7.1%} {pp:>8.1f} ปี")
print(f"\nRecommendation: เลือกโครงการที่ NPV สูงสุดและ IRR > {discount_rate:.0%}")
แนวคิดสำคัญ
- Compound Interest: ดอกเบี้ยทบต้นเป็นพลังที่ทรงพลังที่สุดในการเงิน ยิ่งลงทุนนานยิ่งได้ผลตอบแทนมาก
- Opportunity Cost: เงินที่ไม่ได้ลงทุนคือเงินที่สูญเสียผลตอบแทน ต้องเปรียบเทียบทางเลือกเสมอ
- Inflation: ต้องคำนึงถึงเงินเฟ้อ Real Return = Nominal Return - Inflation
- Risk-Return Tradeoff: ผลตอบแทนสูงมาพร้อมความเสี่ยงสูง ใช้ Risk-adjusted Return เปรียบเทียบ
- Diversification: กระจายการลงทุนลดความเสี่ยง อย่าใส่ไข่ในตะกร้าใบเดียว
- DCA: Dollar Cost Averaging ลงทุนสม่ำเสมอลดผลกระทบจาก Market Timing
Time Value of Money คืออะไร
แนวคิดที่ว่าเงินวันนี้มีมูลค่ามากกว่าเงินจำนวนเดียวกันในอนาคต เพราะนำไปลงทุนสร้างผลตอบแทนได้ เป็นพื้นฐานของการวิเคราะห์การลงทุน สินเชื่อ การออม และการวางแผนการเงิน
Present Value และ Future Value ต่างกันอย่างไร
PV คือมูลค่าปัจจุบันของเงินอนาคต คำนวณโดย Discount กลับ FV คือมูลค่าอนาคตของเงินปัจจุบัน คำนวณโดย Compound ไปข้างหน้า สูตร FV = PV × (1+r)^n เป็นสูตรกลับกัน
NPV คืออะไร และใช้อย่างไร
Net Present Value ผลรวม PV ของ Cash Flows ทั้งหมดลบเงินลงทุน NPV บวกน่าลงทุน NPV ลบไม่น่าลงทุน เปรียบเทียบหลายโครงการเลือก NPV สูงสุด
IRR คืออะไร
Internal Rate of Return อัตราคิดลดที่ทำให้ NPV เท่ากับศูนย์ เป็นอัตราผลตอบแทนที่แท้จริง ถ้า IRR สูงกว่า Required Rate น่าลงทุน ใช้เปรียบเทียบโครงการขนาดต่างกัน
สรุป
Time Value of Money เป็นพื้นฐานสำคัญที่สุดในการเงิน เงินวันนี้มีค่ามากกว่าเงินในอนาคต สูตรหลักที่ต้องรู้คือ FV, PV, Annuity, NPV และ IRR ใช้ NPV และ IRR ประเมินโครงการลงทุน ใช้ Amortization Schedule วิเคราะห์สินเชื่อ ใช้ Annuity คำนวณการออมเกษียณ สิ่งสำคัญคือเริ่มลงทุนเร็ว ให้ Compound Interest ทำงาน และกระจายความเสี่ยง
