Измерение рыночного риска в Python

VAR — это общий термин, который обычно встречается в финансах, когда речь идет об измерении рыночных рисков.

VAR, или Value At Risk, в основном представляет собой меру потенциальных убытков, с которыми можно столкнуться при определенном уровне уверенности, например. 99%.

Но прежде чем мы перейдем к VAR, нам сначала нужно обсудить, по какому значению мы оцениваем риск. Мы хотим измерить изменение рыночных цен за определенный период времени (например, изо дня в день). Тогда VAR скажет нам, сколько мы можем потерять (или выиграть) из-за изменения цен. Довольно часто при расчете изменения цен используется логнормальная доходность вместо нормальной.

Полезные ссылки, которые предоставляют больше информации о разнице между ними -

По существу, несколько моментов, чтобы отметить -

  • Мы предполагаем, что цены логнормальны, тогда логарифмическая доходность распределяется нормально.
  • Когда доходность мала, трудно определить разницу между логнормальным и нормальным распределением.
  • Логнормальный позволяет нам при компаундировании просто добавлять возвраты (а не умножать). Сумма логарифмических доходов тогда просто становится разницей в логарифмической конечной и начальной цене.

Вычисление относительной или логнормальной доходности довольно просто с помощью функции сдвига в пандах.

Относительная доходность

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))

Я упростил часть кода в этом посте для простоты понимания, но полный код можно найти в записной книжке здесь.