python和财务管理_python写的模块:财务管理中关于时间价值的函数 | 学步园

因为工作关系经常需要计算终值、现值、利率等,所以把经常需要用的财务管理中关于时间价值的函数写成了模块。

#!/usr/bin/python

#-*- coding: utf8 -*-

u'''财务管理中与时间价值相关函数

变量的含义:

f 终值

p 现值

a 年金。da:递延年金;ya:永续年金;ja:即付年金

i 利率

n 总期数,如果有递延期则含递延期

s 递延期

'''

def f2p(f, i, n):

u'''求复利现值,f为1时返回值为复利现值系数'''

return f * pow(1.0 + i, 0 - n)

def p2f(p, i, n):

u'''求复利终值,p为1时返回值为复利现值系数'''

return p * pow(1.0 + i, n)

def a2p(a, i, n):

u'''求普通年金现值,a为1时返回值为普通年金现值系数'''

return a * ((1.0 - pow(1.0 + i, 0 - n)) / i) if i else a * n

def a2f(a, i, n):

u'''求普通年金终值,a为1时返回值为普通年金终值系数'''

return a * ((pow(1.0 + i, n) - 1.0) / i) if i else a * n

def f2a(f, i, n):

u'''求偿债基金,已知终值求年金'''

return f / a2f(1.0, i, n)

def p2a(p, i, n):

u'''求年资本回收额,已知现值求年金'''

return p / a2p(1.0, i, n)

def da2p(a, i, n, s):

u'''求递延年金现值'''

return a2p(a, i, n) - a2p(a, i, s)

def da2f(a, i, n, s):

u'''求递延年金终值'''

return a2f(a, i, n) - a2f(a, i, s)

def ya2p(a, i):

u'''求永续年金现值'''

return a / i

def ja2f(a, i, n):

u'''求即付年金终值'''

return a * (a2f(1.0, i, n + 1) - 1)

def ja2p(a, i, n):

u'''求即付年金现值'''

return a * (a2p(1.0, i, n - 1) + 1)

def pf2i(p, f, n):

u'''已知现值、终值求复利利率'''

return pow(f * 1.0 / p, 1.0 / n) - 1.0

def ap2i(a, p, n):

u'''已知现金流现值,年金,求利率'''

fun = lambda li: a2p(a, li, n) - p

return __lilv(fun)

def af2i(a, f, n):

u'''已知现金流终值,年金,求利率'''

fun = lambda li: a2f(a, li, n) - f

return __lilv(fun)

def dap2i(a, p, n, s):

u'''已知递延年金现值,年金,期数,求利率'''

fun = lambda li: da2p(a, li, m, s) - p

return __lilv(fun)

def daf2i(a, f, n, s):

u'''已知递延年金终值,年金,期数,求利率'''

fun = lambda li: da2f(a, li, n, s) - f

return __lilv(fun)

def jap2i(a, p, n):

u'''已知即付年金现值,年金,期数,求利率'''

fun = lambda li: ja2p(a, li, n) - p

return __lilv(fun)

def jaf2i(a, f, n):

u'''已知即付年金终值,年金,期数,求利率'''

fun = lambda li: ja2f(a, li, n) - f

return __lilv(fun)

def c2i(t):

u'''已知各期现金流,求收益率。资本回收额、偿债基金可理解为各期现金流相等的情况。

t 各期现金流构成的序列。现金净流入为正数,净流出为负数。

序列的长度为期间+1,t[n]为第n期期末现金流、t[n-1]为第n期期初现金流。

例:初始投资50000,8各月后付息2000,20个月后付息3000,24个月后还本付息共51000,月收益率为:

>>> a = [0] * 25

>>> a[0] = -50000

>>> a[8] = 2000

>>> a[20] = 3000

>>> a[24] = 51000

>>> c2i(a)

0.0048987448215484699

年收益率为:1.0048987448215484699 ** 12 - 1 = 0.060394936320462556

'''

tn = len(t)

if tn == 0:

return None

fun = lambda li, t: sum(f2p(v, li, k) for k, v in enumerate(t) if v != 0)

# 按终值计算是下面的函数,结果一样

#fun = lambda li, t: sum(p2f(v, li, tn - k) for k, v in enumerate(t) if v != 0)

return __lilv(fun, t)

def __lilv(fun, *arg, **kw):

u'''采用逐步逼近法,从现金流公式中求利率

fun 现金流公式

arg 现金流公式需传入的参数

kw 传入要求精度等附加信息

'''

up, down = None, None

jindu1 = kw.get('jindu', 0.005) # 如果没有传入精度要求信息,则默认为±0.005

jindu2 = jindu1 * -1

for j in range(1000):

if up != None and down != None:

i = (up + down) / 2.0

else:

i = ((j % 2) * 2 - 1) * 2 ** j * 0.2# 设置可能的上下限,值为:-0.2、0.4、-0.8、1.6、……

ca = fun(i, *arg)

if ca > jindu1: # 现金流现值 >= 初始投资,折现率太低。重新确定折现率下限

down = i

elif ca < jindu2: # 现金流现值 <= 初始投资,折现率太高。重新确定折现率上限

up = i

else:

return i

raise ValueError

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值