Python与“货币时间价值”问题
(我今天早些时候问过这个问题,但我没有很好地解释清楚。让我再试一次)
我有一个客户,是一家工业维修公司。他们出售预付费的服务协议,每个协议包含20小时的技术人员服务。有些大客户可能在两周内就用完了这个协议,而一些问题较少的客户可能会在同一个合同上用八个月。我想用Python来帮助预测销售收入,并确定他们每个月需要支付多少小时的服务费。
如果每个客户只购买一个服务合同(从不续约),那么计算销售额就很简单,可以用公式 monthly_revenue = contract_value * qty_contracts_sold
。可计费的小时数也很简单:billable_hrs = hrs_per_contract * qty_contracts_sold
。但是,续约该怎么计算呢?假设90%(或者其他任意比例)的客户会续约,那么他们的月收入应该会呈几何增长。另一个重要的变量是平均客户多久用完一个合同。如何根据不同的续约率和使用率来预测未来3、6或12个月的收入和可计费小时数呢?
我想我可能需要用某种递归函数来解决这个问题,但数学从来不是我的强项。有没有什么建议呢?
编辑:我在想,处理这个问题的最好方法是把它看作一个“货币时间价值”的问题。我已经把问题的标题改成这样。如果你把“每月销售”看作类似于年金支付的问题,这个问题可能会更常见。
2 个回答
如果你想从未来收入的现值来考虑这个问题(我理解的“货币的时间价值”就是这个意思),那么你需要以下几个参数:折扣率D(为了方便,按月计算)、客户用完预付小时所需的时间T、客户在预付小时用完后续费的可能性L、第一次销售的金额F和续费的金额R。当然,这里有几个假设(比如,消费支持服务更快的客户可能更倾向于续费,这个模型没有考虑到),但这可能仍然是一个有用的初步估算。
所以,今天的销售价值是:F立刻就能确定;再加上,在T个月后,以概率L能再获得R;再加上,在2T个月后,以概率LL能再获得R,依此类推。因此,这笔销售的总价值是:F + RL / (DT) + RLL / (D2T) + ... = F + (R*L / DT ) * (1 + L/DT + L2/(DT)**2 + ...。
这个数列收敛到1 / (1 - L/(D**T)),所以最终的公式可以简化成(转到Python代码;-):
def salesworth(D, T, L, F, R):
return F + (R * L) / (D**T * (1 - L / (D**T)))
预期的可计费小时数可以用同样的公式,只需将F和R替换为第一次销售和续费的小时数,并且(如果折扣率的概念不适用于可计费小时)将D设为1(这样T其实不重要,因为1**T == 1对于任何T都是成立的;-)。
谢谢你的帮助,尽管我的需求有点模糊。在咨询了一位非常精通金融数学的朋友后,我发现简单的公式并不适合解决我的问题。
最后,我选择了把每个月拆分成具体的每一天,使用了xrange()这个函数,然后逐天进行处理。在检查每一天的时候,我判断那天是否签了新合同,如果签了,我还要确定这个合同未来需要在哪些日期续签。我把这些续签的日期放进一个列表里,然后把这些日期的值加起来。