首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >银行业:计算风险加权资产的资本要求

银行业:计算风险加权资产的资本要求
EN

Code Review用户
提问于 2017-08-25 13:55:10
回答 1查看 844关注 0票数 5

我知道这不是完美的代码,但它输出正确的值。有人能给我一些关于如何使手术更像毕多尼奥尼亚的建议吗?

代码语言:javascript
复制
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)

请参阅:https://en.wikipedia.org/wiki/Capital_要求

EN

回答 1

Code Review用户

发布于 2017-08-25 16:47:19

函数名很好。文档字符串对此没有任何影响。考虑描述一个或多个论点,特别是当有关于其有效性的棘手细节时。一定要添加一个描述数学方法的URL。

对不起,我没有注意到Capital_requirement上的维基百科页面是如何与公式的细节相关的。

总的来说,代码是明确的。如果您确实出于某种原因想要删除b1临时变量,您可以编写以下两行代码:

代码语言:javascript
复制
return ((lgd * stat.norm.cdf(a1) - lgd * pd)
        * (1 + ((tenor - tsub) * madj)) / (1- madjcoeff * madj))

(我认为,如果愿意的话,lgd是可以考虑在内的。)无论如何,a1临时程序肯定有助于提高可读性,您会想要保留它。要记住的是,子表达式可能会引发异常。如果您担心可能会发生这种情况,那么可以使用几个临时变量,每个变量都在自己的行上,这样堆栈跟踪就可以精确地指出事情发生的方向。

tsub是一个非常好的简洁的名字供选择,但请添加评论:

代码语言:javascript
复制
tsub = 2.5  # tenor subtrahend

不确定这两者的“常数”有多大,但您可能允许调用方更改它们:

代码语言:javascript
复制
def capital_requirement(r, lgd, pd, madj, tenor, madjcoeff=1.5, tsub=2.5):

很明显,stat.norm.ppf(0.999)没有实现公式中给出的.99。

您可以验证r

代码语言:javascript
复制
assert 0 < r < 1

如果超出范围的值溜进来,请注意math.sqrt()会引发ValueError,这可能是您想要的,而** 0.5将返回一个假想的根。

票数 4
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/173955

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档