原理
以下理论摘自CFA书籍
代码
注意代码中为了精确,使用了Decimal,另外求极限的代码也可以了解一下
import pandas as pd
import numpy as np
from decimal import Decimal
# 计算有效年利率,给定名义年利率,计息期限
def calEAR(NIR, n):
r = Decimal(str(NIR)) / Decimal(str(n))
EAR = (1 + r) ** Decimal(str(n)) - 1
# 转化为%,四舍五入
return str((EAR * 100).quantize(exp=Decimal('0.00'), rounding='ROUND_HALF_UP'))
# 名义年利率为15%,每个月计算利息
print(calEAR(0.15, 12) + '%')
#这个函数对多个期限进行计算,查看EAR的趋势图,发现随着期限增加,极限值为16.18%
def trend(NIR, list):
y = []
for l in list:
y.append(calEAR(NIR, l))
return y
trend(0.15, np.arange(1,10000,2))
import matplotlib.pyplot as plt # 导入模块 pyplot ,并为其指定别名plt
x_values = np.arange(1,1000,2)
y_value = trend(0.15, np.arange(1,1000,2))
fig, ax = plt.subplots()
ax.scatter(x_values, y_value) # 采用颜色映射,根据y的值设置颜色
# 设置图表标题并给坐标轴加上标签
ax.set_xlabel("计息期限", fontproperties="SimHei", fontsize=14) # 变量fontproperties指定字体
ax.set_ylabel("有效年利率", fontproperties="SimHei", fontsize=14)
plt.show() # 该函数打开Matplotlib查看器并显示绘制的图表
# 以下代码计算有效年利率对于计息期限的极限值,约为16.18,从上面的散点图也可以得出这个结论
import sympy
n = sympy.Symbol('n')
sympy.init_printing()
expr = (1 + Decimal('0.15') / n) ** n - 1
result = sympy.limit(expr, n, float('inf'))
# result = sympy.limit(expr, n, sympy.oo) #或者 sympy.oo无穷大
print('limit:', result) #结果为limit: -1 + exp(3/20)
import math
print(((Decimal(str(-1+math.exp(3/20)))*100).quantize(exp=Decimal('0.00'), rounding='ROUND_HALF_UP'))) #极限值为16.18%
PS 2022-10-02:再次查看发现有个问题连续复利极限公式中的r应该指的是名义利率,也就是一年的利率,不是一期的利率。