1. 货币时间价值:现值(PV)与终值(FV)的数学推导与Python实现
货币时间价值,说白了就是「今天的100块比明天的100块更值钱」。这个道理听起来简单,但真正在交易系统里用起来,坑可不少。我当年刚入行时,就因为搞混了单利和复利,差点让一个债券定价模型出了大问题。
嗯,咱们今天就把这个最基础、也最重要的概念彻底讲透。
1.1 核心逻辑:为什么钱有时间价值?
你想想看,如果你现在有100万,你可以:
- 存银行吃利息
- 买国债赚收益
- 投项目等回报
但如果你一年后才有这100万,你就白白损失了一年的投资机会。所以,未来的钱必须「打折」才能和现在的钱比较。这个打折的比率,就是利率。
核心公式(一句话版):
终值(FV) = 现值(PV) × (1 + 利率)^时间
现值(PV) = 终值(FV) / (1 + 利率)^时间
1.2 单利 vs 复利:一字之差,天壤之别
我见过不少新手,觉得单利和复利差不多。其实差远了。咱们直接上对比。
| 对比项 | 单利 | 复利 |
|---|---|---|
| 计息基础 | 始终按初始本金 | 本金+累计利息 |
| 增长方式 | 线性增长 | 指数增长 |
| 公式 | FV = PV × (1 + r × t) | FV = PV × (1 + r)^t |
| 适用场景 | 短期借贷、部分债券 | 银行存款、投资、贷款 |
举个例子:100万本金,年利率5%,投资10年。
- 单利终值 = 100万 × (1 + 0.05 × 10) = 150万
- 复利终值 = 100万 × (1 + 0.05)^10 ≈ 162.89万
差了将近13万。时间越长,差距越恐怖。30年的话,单利250万,复利432万——差了182万。
避坑指南: 我曾经在做一个理财产品定价时,对方给的利率是「年化单利5%」,但我直接用复利公式算了现值。结果报价低了,差点亏钱。后来我养成了一个习惯:拿到任何利率,先问清楚是单利还是复利,计息周期是多久。
1.3 数学推导:从定义到公式
咱们来走一遍推导过程。别怕,很简单的。
单利推导:
第一年利息 = PV × r
第二年利息 = PV × r(还是按本金算)
第t年利息 = PV × r
总利息 = PV × r × t
所以:FV = PV + PV × r × t = PV × (1 + r × t)
复利推导:
第一年末:FV₁ = PV × (1 + r)
第二年末:FV₂ = FV₁ × (1 + r) = PV × (1 + r)²
第t年末:FVₜ = PV × (1 + r)^t
反过来,已知终值求现值:
PV = FV / (1 + r)^t
我的小技巧: 在Excel里,我习惯用FV()和PV()函数。但在Python里,我更喜欢手写公式,因为能清楚看到每一步。调试的时候特别有用。
1.4 Python实现:从零开始写代码
咱们直接上代码。我会把单利和复利都实现,再加一个对比函数。
# 单利终值计算
def simple_interest_fv(pv, rate, time):
"""
pv: 现值
rate: 年利率(小数形式,如0.05)
time: 年数
"""
return pv * (1 + rate * time)
# 复利终值计算
def compound_interest_fv(pv, rate, time):
return pv * (1 + rate) ** time
# 现值计算(复利折现)
def present_value(fv, rate, time):
return fv / (1 + rate) ** time
# 来个实际例子
pv = 1000000 # 100万
rate = 0.05 # 5%
time = 10 # 10年
fv_simple = simple_interest_fv(pv, rate, time)
fv_compound = compound_interest_fv(pv, rate, time)
print(f"单利终值: {fv_simple:,.2f} 元")
print(f"复利终值: {fv_compound:,.2f} 元")
print(f"差额: {fv_compound - fv_simple:,.2f} 元")
# 反过来验证:把复利终值折现回来
pv_back = present_value(fv_compound, rate, time)
print(f"折现回现值: {pv_back:,.2f} 元")
输出结果:
单利终值: 1,500,000.00 元
复利终值: 1,628,894.63 元
差额: 128,894.63 元
折现回现值: 1,000,000.00 元
你看,折现回去正好是100万。这说明公式是自洽的。
1.5 知识体系总览
下面这张图,把本章的核心逻辑串起来了。我建议你保存下来,以后忘了随时看。
1.6 实战中的几个坑
代码写完了,图也画了。我再分享几个实战中容易踩的坑。
- 利率单位搞混: 年利率5%是0.05,不是5。我见过有人直接写5,结果算出来离谱的数字。
- 时间单位不一致: 如果利率是年化,时间必须是年。如果是月利率,时间必须是月。我曾经把一个按月付息的产品,直接用年利率×年数算了,结果对不上账。
- 复利频率: 实际中复利可能是按年、按半年、按季度甚至按天。公式要调整为:FV = PV × (1 + r/n)^(n×t),其中n是每年复利次数。
我的习惯: 在写任何金融计算代码之前,先写一个简单的「合理性检查」。比如,利率应该在0到1之间,时间应该是正数,终值应该大于现值(正利率下)。这些小检查,能帮你省下大量debug时间。
好了,货币时间价值这个地基,咱们算是打牢了。后面的章节,我们会在这个基础上,搭建更复杂的金融模型。
公众号:蓝海资料掘金营,微信deep3321