首页 > 解决方案 > 累计金额未知利率求解

问题描述

嗨,我正在寻找一种方法来迭代未知值。有 18 个现金流(cf_1 到 cf_18)及其对应的累积期(t1 到 t18),存储在 2 个列表中。我希望将累积金额的总和(以未知利率 i 表示)等于 500000,并解决这个 i。

公式为:500000 = 累计值 = cf1 * (1+i)^t1 +...+ cf_18 * (1+i)^t18。我可以考虑使用 sympy 求解器:

solve(cf1 * (1+i)**t1 +...+ cf_18 * (1+i)**t18 - 500000, i) 

为 i 求解。但显然for循环不能取这个未知的i。那么除了输入全部 18 个表达式,我还能做什么呢?

这是数据和我尝试过的:

from sympy.solvers import solve
from sympy import Symbol

i = Symbol('i')

cashflow = [13000,
12500,
12000,
11500,
11000,
10500,
10000,
9500,
9000,
8500,
8000,
7500,
7000,
6500,
6000,
5500,
5000,
4500,]

years_accum = [22.75,
22.5,
20.5,
20,
19.25,
19,
18.75,
12,
10.25,
10,
9.75,
9,
8.5,
8,
7.5,
5,
3.5,
3.25,]

for cf in cashflow:
    for yr in years_accum:
        S_t = sum(cf* (1+i)^yr)
        print(S_t)
solve(S_t - 500000, i)

任何帮助表示赞赏!

标签: pythoniterationsympysolver

解决方案


您的双循环是不正确的,因为它会增加所有年份的每笔现金流。我会做的

>>> eq = sum([cf*(1+i)**yr for cf,yr in zip(cashflow, years_accum)]) - 500000

但是要在一个循环中看到它可能是

>>> S_t = 0
>>> for cf, yr in zip(cashflow, years_accum):
...    S_t = S_t + cf*(1+i)**yr

>>> eq = S_t - 500000

现在解决......solve如果我们期望一个简单的答案(来自一个相对简单的方程)会很好。由于这是高度非线性的nsolve(对于数值解决方案)是一个更好的选择:

>>> nsolve(eq, 0)  # assume i is close to 0
0.0747836528616713

推荐阅读