2016-07-26 13 views
3

私はPandasを使用して、バリューアットリスクを含むいくつかの財務リスク分析を計算しています。要するに、バリュー・アット・リスク(VaR)を計算するには、一連のシミュレーションされたポートフォリオの変化をシミュレーションし、特定のテール・パーセンタイル・ロスを計算します。たとえば、95%VaRは、その時系列の5パーセンタイル値です。ExcelのPERCENTILE.EXCに相当するPython

パンダのデータフレームに私の時系列があり、現在はpd.quantile()関数を使用してパーセンタイルを計算しています。私の質問は、VaRの典型的な市場慣行は排他的なパーセンタイルを使用していることです(95%のVaRは、ポートフォリオが計算された数値よりも多くを失う可能性は95%です) - MS Excel PERECENTILE.EXC ()が働きます。 Pandas quantile()は、ExcelのPERCENTILE.INC()がどのように動作するかに似ています。指定されたパーセンタイルを含みます。私はいくつかのpythonの数学パッケージだけでなく、運のないExcelでPERCENTILE.EXC()と同じ方法論を使用する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パーセンタイルとpandas quantileは同じ方法論を使用しています - 元の投稿に新しい例が追加されています。 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

EDITです:私はちょうどあなたの編集を見ました。私はあなたが間違いをしていると思います。値-77.4は、実際にはデータの99.5%パーセンタイルです。試してくださいtest_pd.quantile(.005)。私はパーセンタイルを指定するときにExcelで間違いを犯さなければならないと信じています。

EDIT 2:Excelで自分でテストしました。 50パーセンタイルでは、ExcelとNumpy/Pandasの両方で正しい値を得ています。しかし、5パーセンタイルについては、Pandas/Numpyで-72、Excelで-74.6を取得しています。しかしExcelはちょうど間違っています:-74.6が5thパーセンタイルではなく、0.5thパーセンタイルであることは非常に明白です。

FINAL EDIT:いくつかのテストの後、Excelがkの非常に小さな値PERCENTILE.EXC()機能付きです。実際、任意のk < 0.05で関数を使用するとエラーが返されるので、0.05は関数が正しく機能しないしきい値以下にする必要があります。私は5パーセンタイルを除外するように求められたときにExcelが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番目のパーセンタイルを含む)に対応する値を返します。

k番目の百分位数を返すpd.quantile()は問題ではないと思います。あなたは厳密に5番目のパーセンタイル以上アット・リスクの値を有する全株式をしたいと仮定すると確かに、あなたはどうなる:

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

あなたは「より小さい」(<)演算子を使用しているため、値が正確に対応します5パーセンタイルはExcelのPERCENTILE.EXC()関数と同様に除外されます。

これがあなたが探していたものかどうか教えてください。

+0

-77.4になるPythonソリューションが本当にPERCENTILE.INC(配列、0.005)と同じ結果になるExcelのPERCENTILE.EXC(配列、0.05)の結果である必要があります。今あなたの例を見てください。 – ryanr377

+0

はい、私はそれをテストしました。私はExcelのドキュメントを参照していました。「排他的」または「包括的」の意味が明確ではありません。言い換えれば、彼らが使っているスレッシュホールドは何ですか? EXC(0.05)はINC(0.049)に等しいか、またはその数に等しいか?申し訳ありませんが、私はここでExcelの動作に少し迷っています。 最終編集:0.05未満の数値を入力するとExcelがエラーを返します。これは、EXC()関数が非常に小さい値でバグする必要があることを意味します。私の感想は、「次の」パーセンタイルを0.005と見なして0.05にすることで、pd.quantile(0.005)と同じ値を返す理由です。 – Andreq

+0

合意 - どのように動作するのかわかりません。 PERCENTILE.INCでソルバー関数を使用しましたが、この特定の例では0.00499939999999992を使用しましたが、配列の長さが変わってもこの数は変わっているようです。私はそれが供給されたパーセンタイルの一貫したパーセンテージであることを望んでいました。 – ryanr377

関連する問題