Измерение рыночного риска в Python
VAR — это общий термин, который обычно встречается в финансах, когда речь идет об измерении рыночных рисков.
VAR, или Value At Risk, в основном представляет собой меру потенциальных убытков, с которыми можно столкнуться при определенном уровне уверенности, например. 99%.
Но прежде чем мы перейдем к VAR, нам сначала нужно обсудить, по какому значению мы оцениваем риск. Мы хотим измерить изменение рыночных цен за определенный период времени (например, изо дня в день). Тогда VAR скажет нам, сколько мы можем потерять (или выиграть) из-за изменения цен. Довольно часто при расчете изменения цен используется логнормальная доходность вместо нормальной.
Полезные ссылки, которые предоставляют больше информации о разнице между ними -
- https://quantivity.wordpress.com/2011/02/21/why-log-returns/
- http://www.insight-things.com/log-normal-distribution-mistaken
По существу, несколько моментов, чтобы отметить -
- Мы предполагаем, что цены логнормальны, тогда логарифмическая доходность распределяется нормально.
- Когда доходность мала, трудно определить разницу между логнормальным и нормальным распределением.
- Логнормальный позволяет нам при компаундировании просто добавлять возвраты (а не умножать). Сумма логарифмических доходов тогда просто становится разницей в логарифмической конечной и начальной цене.
Вычисление относительной или логнормальной доходности довольно просто с помощью функции сдвига в пандах.
Относительная доходность
FX_Returns = (FX_DF/FX_DF.shift(1))-1
Логнормальный возврат
FX_DF_LogReturns = np.log(FX_DF/FX_DF.shift(1))
Теперь о ценности под угрозой.
В Value at Risk (VAR) нет ничего сложного. Проще говоря, это просто одна метрика, которая показывает потенциальные потери портфеля и т. д. (при разных уровнях достоверности). Существует два основных метода вычисления VAR:
- параметрический
- Исторический
Очень часто параметрическая VAR основана на нормальном распределении. Нанесение нормального распределения и VAR на график даст нам хорошее представление о том, как это работает.
# We use z to define how many standard deviations away from the mean
# Here we use z = -2.33 to get to a 99% confidence interval. Why 99% will be obvious once we plot out the distribution
z = -2.33
plt.figure(figsize=(12,8))
# plotting the normal distribution, using the scipy stats norm function
plt.ylim(0, 0.5)
x = np.arange(-5,5,0.1)
y1 = stats.norm.pdf(x)
plt.plot(x, y1)
x2 = np.arange(-5, z, 0.01) # we use this range from the -ve end to -2.33 to compute the area
sum = 0
# s = np.arange(-10,z,0.01)
for i in x2:
sum+=stats.norm.pdf(i)*0.01 # computing area under graph from -5 to -2.33 in steps of 0.01
plt.annotate('Area is ' + str(round(sum,3)), xy = (z-1.3, 0.05), fontsize=12)
plt.annotate('z=' + str(z), xy=(z, 0.01), fontsize=12)
plt.fill_between(x2, stats.norm.pdf(x2))
plt.show()
Вычислить параметрическую VAR довольно просто.
confidence = 0.99
Z = stats.norm.ppf(1-confidence)
mean = np.mean(EQ_Returns)
stddev = np.std(EQ_Returns)
Param_VAR = latest_price*Z*stddev
Так же как и вычисление исторической VAR.
Hist_VAR = latest_price*np.percentile(EQ_Returns, 1))
Я упростил часть кода в этом посте для простоты понимания, но полный код можно найти в записной книжке здесь.