单利计息与复利计息
单利计息:如果单位本金经历了任意一个单位计息期的投资所产生的利息为常数,则计息方式为单利计息,计算公式为
a
(
t
)
=
1
+
r
t
a(t)=1+rt
a(t)=1+rt
复利计息:如果单位本金经过任意一个单位计息期产生的利率为常数,则对应的计息方式为复利计息,计算公式为
a
(
t
)
=
(
1
+
r
)
t
a(t)=(1+r)^t
a(t)=(1+r)t
案例
单位本金,计息期为 5 5 5年,年利率为 5 % 5\% 5%,每年计息两次,计算单利收益和复利收益
代码
#include <iostream>
#include <cstring>
#include <cmath>
using namespace std;
// 单利计息
inline double simple(const double &tm, const double &r){
double at=1.00;
return (at+r*tm);
}
// 复利计息
inline double compound(const double &tm, const double &r){
double at=1.00;
return pow(1+r, tm);
}
int main(){
double tm=2*5;
double r=0.05;
cout<<"simple: "<<simple(tm, r)<<endl;
cout<<"compound: "<<compound(tm, r)<<endl;
return 0;
}
可以发现复利计息获得的利息要超过单利计息,一般无特殊说明金融资产中均指复利计息.
贴现函数
如果
t
t
t时刻的单位资金在
0
0
0时刻的价值记为
a
−
1
(
t
)
a^{-1}(t)
a−1(t),则当
t
t
t变动时,
a
−
1
(
t
)
a^{-1}(t)
a−1(t)为贴现函数.
在单利计息下
a
−
1
(
t
)
=
(
1
+
r
t
)
−
1
a^{-1}(t)=(1+rt)^{-1}
a−1(t)=(1+rt)−1
在复利计息下
a
−
1
(
t
)
=
(
1
+
r
)
−
t
a^{-1}(t)=(1+r)^{-t}
a−1(t)=(1+r)−t
案例
假设贴现率为 5 % 5\% 5%,求未来 10 10 10年末单位资金的贴现函数值
代码
#include <iostream>
#include <cstring>
#include <cmath>
using namespace std;
// 单利贴现
inline double discount_simple(const double &tm, const double &r){return pow(1+tm*r, -1);}
// 复利贴现
inline double discount_compound(const double &tm, const double &r){return pow(1+r, -tm);}
int main(){
double tm=10;
double r=0.05;
cout<<"discount simple: "<<discount_simple(tm, r)<<endl;
cout<<"discount compound: "<<discount_compound(tm, r)<<endl;
return 0;
}
计息次数
如果利息要在一年内多次计算复利,相应的年利率又叫做名义利率,实际利率
r
r
r与名义利率
r
(
m
)
r^{(m)}
r(m)的关系如下
1
+
r
=
(
1
+
r
(
m
)
m
)
1+r=(1+\frac{r^{(m)}}{m})
1+r=(1+mr(m))
案例
对比两种投资方案
- 年名义利率为 8 % 8\% 8%,每半年付息一次
- 年名义利率为 8 % 8\% 8%,每季度付息一次
根据公式计算出
方案1收益为
(
1
+
8
%
2
)
2
−
1
(1+\frac{8\%}{2})^2-1
(1+28%)2−1
方案2收益为
(
1
+
8
%
4
)
4
−
1
(1+\frac{8\%}{4})^4-1
(1+48%)4−1
代码
#include <iostream>
#include <cstring>
#include <cmath>
using namespace std;
inline double f(const int &tm, const double &r){return pow(1+r/tm, tm)-1.00;}
int main(){
double tm_1=2;
double tm_2=4;
double r=0.08;
cout<<"tm 1: "<<f(tm_1, r)<<endl;
cout<<"tm 2: "<<f(tm_2, r)<<endl;
return 0;
}
连续复利
本金
A
A
A以年名义利率
r
r
r投资
n
n
n年,若每年复利计息
m
m
m次,则终值(FV)为
F
V
=
A
(
1
+
r
m
)
m
n
=
m
→
∞
A
e
r
n
FV=A(1+\frac{r}{m})^{mn}\xlongequal{m\to\infty}Ae^{rn}
FV=A(1+mr)mnm→∞Aern
多期复利
∑
t
=
1
n
C
t
(
1
+
r
)
t
\sum_{t=1}^{n}C_t(1+r)^t
∑t=1nCt(1+r)t是期数为
n
n
n,第
t
t
t期现金流是
C
t
C_t
Ct,利率是
r
r
r的多期复利终值,记为
F
V
n
FV_n
FVn.
∑
t
=
1
n
C
t
(
1
+
r
)
−
t
\sum_{t=1}^nC_t(1+r)^{-t}
∑t=1nCt(1+r)−t是期数为
n
n
n,第
t
t
t期现金流是
C
t
C_t
Ct,贴现率是
r
r
r的多期复利现值,记为
P
V
n
PV_n
PVn.
案例1
一份存钱计划一年后存入100元,两年后存入200元,三年后存入300元,四年后存入400元,如果年存款利率是 10 % 10\% 10%,求五年后的多期复利终值
代码
#include <iostream>
#include <cstring>
#include <cmath>
#include <vector>
using namespace std;
double fvn(const vector<int> &vtm, const vector<double> &vp, double &r){
double ans=0.00;
for(int i=0; i<vtm.size(); ++i){ans+=vp[i]*pow(1+r, 4-vtm[i]);}
return ans;
}
int main(){
vector<int> vtm; // 存钱时间点
vector<double> vp; // 存钱金额
double r=0.1;
for(int i=1; i<=4; ++i){vtm.push_back(i); vp.push_back(100.00*i);}
cout<<fvn(vtm, vp, r)<<endl;
return 0;
}
案例2
计算5年现金流的现值,其中第 i i i年末现金流为 i × 100 i\times100 i×100元
代码
#include <iostream>
#include <cstring>
#include <cmath>
#include <vector>
using namespace std;
double pvn(const vector<int> &vtm, const vector<double> &vp, double &r){
double ans=0.00;
for(int i=0; i<vtm.size(); ++i){ans+=vp[i]*pow(1+r, -vtm[i]);}
return ans;
}
int main(){
vector<int> vtm; // 现金流时间点
vector<double> vp; // 现金流金额
double r=0.1;
for(int i=1; i<=5; ++i){vtm.push_back(i); vp.push_back(100.00*i);}
cout<<pvn(vtm, vp, r)<<endl;
return 0;
}