2016-07-26 2 views
3

나는 Value at Risk를 포함한 재무 리스크 분석을 계산하기 위해 팬더를 사용하고 있습니다. 요약하면, VaR (Value At Risk)을 계산하기 위해 시뮬레이션 된 포트폴리오 변화 값을 시계열로 취한 다음 특정 테일 백분율 손실을 계산합니다. 예를 들어, 95 % VaR은 해당 시계열에서 5 번째 백분위 수입니다.Excel의 PERCENTILE.EXC와 동일한 Python

나는 팬더 데이터 프레임에 내 시계열을 가지고 있으며 현재 pd.quantile() 함수를 사용하여 백분위 수를 계산하고 있습니다. 내 질문에, VaR에 대한 전형적인 시장 컨벤션은 배제 백분위 수를 사용합니다 (예 : 95 % VaR은 다음과 같이 해석됩니다 : 95 %의 확률로 포트폴리오가 계산 된 수보다 많아지지 않음) - MS Excel PERECENTILE.EXC() 작품. Pandas quantile()은 Excel의 PERCENTILE.INC()가 작동하는 방식과 유사하게 작동합니다. 지정된 백분위 수를 포함합니다. 필자는 행운과 함께 Excel에서 PERCENTILE.EXC()와 동일한 방법론을 사용하는 Python 솔루션을위한이 포럼뿐만 아니라 여러 개의 Python 수학 패키지를 샅샅이 조사했습니다. 여기 누군가가 제안을하기를 바랬어요?

다음은 샘플 코드입니다.

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

감사합니다,

라이언

+1

'pd.quantile '로 현재 얻고있는 출력과 얻고 자하는 결과의 예제를 가지고 작업하고있는 입력 데이터의 작은 예제를 제공 할 수 있습니까? 'numpy.percentile '이 당신이 찾고있는 것을 할 것 같은데, 나는 데이터가 어떻게 생겼는지를 모른 채 대답을 게시하는 것을 주저합니다. – johnchase

+0

물론 - 실제로 시도해 보니 numpy 백분위 수와 팬더 분위수 모두 동일한 방법론을 사용합니다. 원래 예제에 새 예제가 추가되었습니다. Excel에서이 배열은 PERCENTILE.INC를 통해 -72를, PERCENTILE.EXC를 사용하여 -77.4를 반환합니다. -77.4 – ryanr377

답변

1

그것은 팬더 '자신의 백분위로 효율적되지 않습니다 만 작동합니다 : Excel에서 작은 백분위에 대한 실패

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 

참고; 그것은 버그가 아닙니다. 최소값보다 낮은 순위는 보간에 적합하지 않기 때문입니다. 따라서 quantile_exc 함수에서 rank> 0인지 확인해야 할 수도 있습니다 (어설 션 부분 참조).

+0

정확히 예상대로 작동합니다! 나는 1,000 가지 이상의 전장 시계열 (각각 504 개의 관측치)을 사용하여 Excel에 대해 테스트했으며 0.05와 0.01에서 일치합니다. 고맙습니다. 이것이 Excel에 내장 된 정확한 방법인지 확인하십시오. – ryanr377

+0

당신은 오신 것을 환영합니다. :) – ayhan

+0

일부 값 확인, 오류 등 이외에 정의에 의해 동일해야합니다 (예 : 0 ayhan

2

편집이 : 난 그냥 당신의 편집을 보았다. 나는 네가 실수하고 있다고 생각한다. -77.4 값은 실제로 데이터의 99.5 % 백분위 수입니다. 시도해보십시오 test_pd.quantile(.005). 나는 백분율을 지정할 때 Excel에서 실수를 저질렀어야한다고 생각합니다.

편집 2 : Excel에서 직접 테스트했습니다. 50 번째 백분위 수의 경우 Excel과 Numpy/Pandas에서 올바른 값을 얻고 있습니다. 그러나 5 백분위 수의 경우, 나는 Pandas/Numpy에서 -72, Excel에서 -74.6을 얻고 있습니다. 그러나 엑셀은 여기에서 틀린 것입니다 : -74.6이 0.5 번째 백분위 수, 5 번째 백분위 수임을 알 수 있습니다.

최종 편집 : 몇 가지 테스트를 마치면 Excel이 k의 아주 작은 값 주위에서 이상하게 작동하는 것처럼 보입니다. 기능이 있습니다. 사실, 어떤 k < 0.05와 함께 함수를 사용하면 오류가 반환되므로 0.05는 함수가 제대로 작동하지 않는 임계 값이어야합니다. Excel에서 5 백분위 수를 제외하라는 질문에 0.5 번째 백분위 수를 반환하는 이유를 모르겠습니다 (논리적 동작은 4.9 번째 백분위 수 또는 4.99 번째를 반환하는 것입니다). 그러나 Numpy, Pandas 및 Excel은 k의 다른 값에 대해 동일한 값을 반환합니다. 예를 들어, PERCENTILE.EXC(0.5) = 6test_pd.quantile(0.5) = 6도 있습니다. Excel의 동작에주의해야한다는 교훈을 얻었습니다.).

귀하의 문제를 이해하는 방법은 데이터의 k 번째 백분위 수 (이 k 번째 백분위 수를 제외)에 해당하는 값을 알고 싶습니다. 그러나 pd.quantile()은 k 번째 백분위 수 (이 k 번째 백분위 수에 해당)에 해당하는 값을 반환합니다.

k- 백분위 수를 반환하는 pd.quantile()이 문제라고 생각하지 않습니다. 당신이 엄격 5 번째 백분위 수 위의 위험에 값을 갖는 모든 주식을 원하는 가정 실제로, 당신이 할 것 :

mask = data["VaR"] < pd.quantile(data["VaR"], 0.05) 
data_filt = data[mask] 

당신이 "보다 작은"(<) 연산자를 사용하기 때문에 값이 정확히에 해당하는 5 번째 백분위 수는 Excel의 PERCENTILE.EXC() 함수와 마찬가지로 제외됩니다.

내가 찾고있는 것이 있는지 알려주시겠습니까?

+0

-77.4를 얻는 파이썬 솔루션이 실제로 Excel에서 PERCENTILE.EXC (배열, 0.05)의 결과이며 PERCENTILE.INC (배열, 0.005)와 동일한 결과가 발생합니다. 지금 당신의 예를 보아라. – ryanr377

+0

예, 방금 테스트했습니다. 엑셀 문서를 살펴 보았습니다. "독점적"또는 "포괄적"이라는 의미가 명확하지 않습니다. 다시 말해서, 그들이 사용하고있는 임계 값은 무엇입니까? EXC (0.05)가 INC (0.049) 또는 그 수에 해당합니까? 죄송합니다. 여기 Excel의 동작에 약간의 손실이 있습니다. 최종 편집 : EXC() 함수가 매우 작은 값에서 버그가 있어야 함을 의미하는 0.05 미만의 숫자를 입력하면 Excel에서 오류를 반환합니다. 내 직감은 "다음"백분위 수를 0.005로 간주하여 pd.quantile (0.005)과 동일한 값을 반환하는 이유입니다. – Andreq

+0

동의 - 어떻게 작동하는지 모르겠습니다. PERCENTILE.INC와 함께 솔버 함수를 사용했고,이 특정 예제에서는 0.00499939999999992를 사용했지만 배열 길이가 변경되면이 숫자가 변경된 것처럼 보입니다. 나는 그것이 제공된 백분위 수의 일관된 비율 이었으면 좋겠다. – ryanr377

관련 문제