【问题标题】:numpy array point in time present valuenumpy 数组时间点现值
【发布时间】:2020-08-19 15:32:28
【问题描述】:

我有一个 numpy 数组的未来现金流和 0.01 的贴现率。我想计算每个时间点未来现金流的现值。例如,如果我想计算 t=0 时的现值,我会这样做:

cash_flow = np.array([3, 4, 5, 3, 5])
pv_0 = sum(cf/((1+0.01)**i) for i,cf in emunerate(cash_flow, start=1))

所以在 t = 1 时,我会做同样的事情,除了将所有内容向前移动一个周期:

cash_flow_1 = np.array([4, 5, 3, 5])
pv_1 = sum(cf/((1+0.01)**i) for i,cf in emunerate(cash_flow_1, start=1))

我希望最终结果是一个 numpy 数组作为原始 cash_flow 数组。有没有比在每个元素上编写 for 循环更聪明的方法?

编辑: 受下面对话的启发,我有一个“数组”方法(这只是我说没有循环的方式......):

discount_array = np.geomspace((1/1.01)**5, 1/1.01, 5)
(np.cumsum(cash_flow[::-1]*discount_array)*np.geomspace((1.01)**4, 1, 5))[::-1]

【问题讨论】:

    标签: python arrays numpy finance


    【解决方案1】:

    尝试以下方法:

    def cf_calc(arr):
        return sum(cf/((1+0.01)**i) for i,cf in enumerate(arr, start=1))
    
    cfs_array = np.array([])   
    for p in range(len(cash_flow)):
        cfs_array = np.append(cfs_array, cf_calc(cash_flow[p:]))
    cfs_array
    

    输出:

    array([19.38470144, 16.57854845, 12.74433394,  7.87177728,  4.95049505])
    

    【讨论】:

    • 这还在循环,对吧?我希望是否有任何基于数组的方法
    • @ian_chan 是的,它是基于循环的——我不知道其他方式。不确定“基于数组的方法”是什么意思。
    • 我不是 python 专家,所以我对速度和效率等了解不多。但我想到的是类似于 np.cumsum(cash_flow_array * discount_array) 的反转数组,我认为在我输入此评论时可能可行
    • 我已经根据我们的谈话,根据我的想法编辑了原始帖子
    猜你喜欢
    • 2021-08-04
    • 2019-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-25
    • 2021-12-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多