您的位置:首页 > 编程语言 > Python开发

python写的模块:财务管理中关于时间价值的函数

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

#!/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期期末现金流、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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: