Python 年收益转换函数返回复数值

Python 年收益转换函数返回复数值,python,python-3.x,finance,complex-numbers,Python,Python 3.x,Finance,Complex Numbers,我正在编写一个Python函数,将复合回报率转换为年度回报率: annual_rate = ((1 + ((1 + compound_rate) ** (1 / nb_days) - 1)) ** 365 - 1) 这个很好用 compound_rate = 0.1 nb_days = 100 >>0.41606536550485806 但在某些情况下,会返回复数 compound_rate = -1.8536 nb_days = 362 >>(-1.85219206

我正在编写一个Python函数,将复合回报率转换为年度回报率:

annual_rate = ((1 + ((1 + compound_rate) ** (1 / nb_days) - 1)) ** 365 - 1)
这个很好用

compound_rate = 0.1
nb_days = 100
>>0.41606536550485806
但在某些情况下,会返回复数

compound_rate = -1.8536
nb_days = 362
>>(-1.852192062046392-0.022192088919279443j)
下面是一个真实的例子:

如果我有以下付款存款表:

03/03/2018  £1000
03/04/2018  £1000
03/05/2018  £1000
03/06/2018  £1000
03/07/2018  £1000
03/08/2018  £1000
03/09/2018  £1000
03/10/2018  £1000
03/11/2018  £1000
03/12/2018  £1000
03/01/2019  £1000
03/02/2019  £1000
。。如果我损失了所有的钱,在2019年2月底得到100英镑,我将在362天内投入12000英镑,损失11900英镑

如果从那里应用公式,将返回一个复数(参见上面的第二个示例)


有什么我没看到的吗?确切地说,这个结果对我来说并不真实。

这可能就是你想要的:

import numpy as np
l = [-1000]*12
l.append(100)
print(l)
#[-1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 100]
print(np.irr(l))
#-0.9090909090908827

您正在将一个负数(任何小于-1的
composite\u rate
提高到一个分数(任何
nb\u天
大于1)。这是一个复数,因为除非提升到一个整奇数整数,否则实数不能产生负数。@NicolasBerthier实数幂的复数可以再次变为实数(最简单的例子是i^2=-1),其中有
**365
。莫茨指出的(因为你在复合利率中加了一个),这并不能回答你的问题——但你是在试图计算这些现金流的回报率吗?您可能想看看
numpy.irr
谢谢大家,这很有意义。你知道我如何用一个实数来表示上面例子中的年化回报率吗?如果复合回报率低于-1,你会期望得到什么结果?它没有物理意义。尽管我用来表述这个问题的术语可能有些混乱,但这实际上解决了它,以估算当月存款的时间为代价。您可以使用一个包含365天现金流的数组或列表,而不是仅包含13天现金流的数组或列表,以获得更好的近似值(其余天数的现金流为0)。然而,这种改进将是非常好的一点。现在我将继续使用这个近似值,并记住另一个解决方案。谢谢你的帮助