Python 相当于 Excel 的 PERCENTILE.EXC

rya*_*377 8 python statistics quantile pandas

我正在使用 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))
Run Code Online (Sandbox Code Playgroud)

我正在寻找的答案是-77.4

谢谢,

瑞安

ayh*_*han 5

它不会像 Pandas 自己的百分位数那样有效,但它应该可以工作:

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
Run Code Online (Sandbox Code Playgroud)

请注意,Excel 对于小百分位数会失败;这不是一个错误。这是因为低于最小值的排名不适合插值。因此,您可能想检查函数中的rank是否> 0 quantile_exc(请参阅断言部分)。

  • 匹配 Excel 的公式已经让我抓狂了一周了!这确实有帮助。谢谢。 (2认同)