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
谢谢,
瑞安
它不会像 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(请参阅断言部分)。
| 归档时间: |
|
| 查看次数: |
7694 次 |
| 最近记录: |