1

我知道我的问题在这里得到了回答..具有 xirr 和 xnpv 功能的金融 python 库?..

def xirr(transactions):
    years = [(ta[0] - transactions[0][0]).days / 365.0 for ta in transactions]
    residual = 1
    step = 0.05
    guess = 0.05
    epsilon = 0.0001
    limit = 10000
    while abs(residual) > epsilon and limit > 0:
        limit -= 1
        residual = 0.0
        for i, ta in enumerate(transactions):
            residual += ta[1] / pow(guess, years[i])
        if abs(residual) > epsilon:
            if residual > 0:
                guess += step
            else:
                guess -= step
                step /= 2.0
    return guess-1

当我为基金交易执行上述代码时,我在第一次迭代中得到负残差。guess=0.5-0.5=0 因此,我在下一次迭代中得到zerodivisionerror 。为什么我得到负残差..如何处理这个?/提前谢谢

4

1 回答 1

0

我通过以下方式解决了这个问题:guess+1在 pow 函数中使用,并-1从结果中删除了部分:

def xirr(...):
    while ...:
        for ...:
            residual += ta[1] / pow(guess+1, years[i])
    ...
    return guess

我也遇到了性能问题,因为这段代码是用纯 python 编写的。所以我使用引擎盖下的锈创建了更快的版本。它的工作速度比 python 实现快 100 倍以上。

于 2021-05-28T19:30:38.333 回答