我正在使用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
谢谢
莱恩
3条答案
按热度按时间but5z9lq1#
它不会像Pandas自己的百分位那么有效,但它应该可以工作:
请注意,对于小百分位数,Excel失败;它不是一个bug。这是因为低于最小值的等级不适合插值。因此,您可能需要检查
quantile_exc
函数中的rank是否> 0(参见Assert部分)。cu6pst1q2#
编辑:我刚看到你的编辑。我认为你在犯一个错误。值-77.4实际上是数据的99.5%。试试
test_pd.quantile(.005)
我相信你一定是在Excel中指定百分位数时犯了一个错误。编辑2:我刚刚在Excel中自己测试了一下。对于第50个百分位数,我在Excel和Numpy/Pandas中都得到了正确的值。然而,对于第五个百分位数,我在Pandas/Numpy中得到-72,在Excel中得到-74.6。但Excel在这里是错误的:很明显-74.6是0.5个百分点,而不是第5个...
最终编辑:经过一些测试,Excel似乎在
PERCENTILE.EXC()
函数的k值非常小的情况下表现不稳定。实际上,使用任何k < 0.05的函数都会返回错误,因此0.05必须是函数无法正常工作的阈值。我不知道为什么Excel在被要求排除第5个百分位数时选择返回第0.5个百分位数(逻辑行为将返回第4.9个百分位数,或第4.99个...)。然而,Numpy、Pandas和Excel对于其他k值都返回相同的值。例如PERCENTILE.EXC(0.5) = 6
和test_pd.quantile(0.5) = 6
。我想这一教训是我们需要警惕Excel的行为;).我对你问题的理解是:你想知道对应于你的数据的第k个百分位数的值,这个第k个百分位数被排除在外。但是,
pd.quantile()
返回与您的第k个百分位数对应的值,包括第k个百分位数。我不认为pd.quantile()返回包含的第k个百分位数是一个问题。事实上,假设你希望所有股票的风险价值严格高于第5个百分点,你会这样做:
因为您使用了“小于”(<)运算符,所以与第5个百分位数完全对应的值将被排除,类似于Excel的PERCENTILE.EXC()函数。
告诉我这是不是你要找的东西。
3duebb1j3#
在最初的问题被问到几年后,我不得不构建一个pandas脚本来复制/简化/检查复杂的数组公式。以下是我的想法
假设你想要百分之九十的
EXC是第0.9(n+1)个值
PERCENTILE.INC是第0.9(n-1)+1个值
PERCENTILE.EXC将适用于9个或更多条目。默认情况下,Pandas将使用PERCENTILE.INC等效文件,即df.分位数(0.9)。
如果你想复制这两个函数,使用numpy
np.百分位数(x,90,method ='linear')--->百分位数增加
np.百分位数(x,90,method ='weibull')--->百分位数
更改号码以满足您的需要。
问候