+-

我正在使用Pandas来计算一些财务风险分析,包括风险价值.简而言之,要计算风险价值(VaR),您需要计算模拟投资组合价值变化的时间序列,然后计算特定的尾部百分位数损失.例如,95%的VaR是该时间序列中的第5百分位数.
我在Pandas数据帧中有我的时间序列,目前我正在使用pd.quantile()函数来计算百分位数.我的问题是,VaR的典型市场惯例是使用排他性百分位数(即:95%VaR被解释为:您的投资组合有95%的可能不会超过计算数量) – 类似于MS Excel PERECENTILE.EXC ()有效. Pandas quantile()的工作方式类似于Excel的PERCENTILE.INC()的工作方式 – 它包含指定的百分位数.我已经搜索了几个python数学包以及这个论坛的python解决方案,使用与Excel中的PERCENTILE.EXC()相同的方法,没有运气.我希望有人在这里提出建议吗?
这是示例代码.
import pandas as pd
import numpy as np
test_pd = pd.Series([15,14,18,-2,6,-78,31,21,98,-54,-2,-36,5,2,46,-72,3,-2,7,9,34])
test_np = np.array([15,14,18,-2,6,-78,31,21,98,-54,-2,-36,5,2,46,-72,3,-2,7,9,34])
print 'pandas: ' + str(test_pd.quantile(.05))
print 'numpy: '+ str(np.percentile(test_np,5))
我要找的答案是-77.4
谢谢,
瑞安
最佳答案
它不会像熊猫自己的百分位数那样有效,但它应该有效:
def quantile_exc(ser, q):
ser_sorted = ser.sort_values()
rank = q * (len(ser) + 1) - 1
assert rank > 0, 'quantile is too small'
rank_l = int(rank)
return ser_sorted.iat[rank_l] + (ser_sorted.iat[rank_l + 1] -
ser_sorted.iat[rank_l]) * (rank - rank_l)
ser = pd.Series([15,14,18,-2,6,-78,31,21,98,-54,-2,-36,5,2,46,-72,3,-2,7,9,34])
quantile_exc(ser, 0.05)
Out: -77.400000000000006
quantile_exc(ser, 0.1)
Out: -68.399999999999991
quantile_exc(ser, 0.3)
Out: -2.0
请注意,Excel会因小百分位数而失败;这不是一个bug.这是因为低于最小值的等级不适合插值.所以你可能想检查排名>在quantile_exc函数中为0(参见断言部分).
点击查看更多相关文章
转载注明原文:Python相当于Excel的PERCENTILE.EXC - 乐贴网