我知道这不是完美的代码,但它输出正确的值。有人能给我一些关于如何使手术更像毕多尼奥尼亚的建议吗?
def capital_requirement(r, lgd, pd, madj, tenor):
'''Returns the capital requirement.'''
madjcoeff = 1.5
tsub = 2.5
a1 = (stat.norm.ppf(pd) + r**0.5 * stat.norm.ppf(0.999)) / ((1 - r)**0.5)
b1 = lgd * stat.norm.cdf(a1) - lgd * pd
return b1 * (1 + ((tenor - tsub) * madj)) / (1- madjcoeff * madj)发布于 2017-08-25 16:47:19
函数名很好。文档字符串对此没有任何影响。考虑描述一个或多个论点,特别是当有关于其有效性的棘手细节时。一定要添加一个描述数学方法的URL。
对不起,我没有注意到Capital_requirement上的维基百科页面是如何与公式的细节相关的。
总的来说,代码是明确的。如果您确实出于某种原因想要删除b1临时变量,您可以编写以下两行代码:
return ((lgd * stat.norm.cdf(a1) - lgd * pd)
* (1 + ((tenor - tsub) * madj)) / (1- madjcoeff * madj))(我认为,如果愿意的话,lgd是可以考虑在内的。)无论如何,a1临时程序肯定有助于提高可读性,您会想要保留它。要记住的是,子表达式可能会引发异常。如果您担心可能会发生这种情况,那么可以使用几个临时变量,每个变量都在自己的行上,这样堆栈跟踪就可以精确地指出事情发生的方向。
tsub是一个非常好的简洁的名字供选择,但请添加评论:
tsub = 2.5 # tenor subtrahend不确定这两者的“常数”有多大,但您可能允许调用方更改它们:
def capital_requirement(r, lgd, pd, madj, tenor, madjcoeff=1.5, tsub=2.5):很明显,stat.norm.ppf(0.999)没有实现公式中给出的.99。
您可以验证r:
assert 0 < r < 1如果超出范围的值溜进来,请注意math.sqrt()会引发ValueError,这可能是您想要的,而** 0.5将返回一个假想的根。
https://codereview.stackexchange.com/questions/173955
复制相似问题