2015-06-16 1 views
1

Учитывая исторические ежедневные доходы, как рассчитать распределение портфеля для одной позиции на складе, исходя из того, что не теряется более 10% стартового портфеля стоимость более 21 дня? (с доверием 95%.)Расчет стоимости при риске или «наиболее вероятный убыток» при заданном распределении прибыли

На основании некоторого исходного кода, например.

import numpy as np 
from scipy.stats import norm 

returns = [-0.01, -0.02, -0.01, 0.04, 0.02, 0.01, -0.03] 
mu = np.mean(returns) 
std = np.std(returns) 
valueAtRisk = norm.ppf(0.05, mu, sigma) 

Однако вышеизложенное говорит только о моем риске на 1 день. Мой вопрос идет в другом направлении; что я могу выделить, учитывая распределение прибыли, предполагая, что я не хочу потерять более 10% в течение 21 дня.

Я бы предпочел ответ, который можно вычислить напрямую, но ответ Монте-Карло был бы приемлемым.

Благодарим вас за помощь.

+0

Это может быть лучшим вопросом для CrossValidated, но не является ли операция матрицы, которая будет осложнять распределение доходности по п дней? – C8H10N4O2

+0

Я хотел бы использовать решение типа python/scipy (и я не уверен, что я пойму чисто статистический ответ). Проблема в том, что 'norm.ppf (0,05, mu, sigma)' дает представление о «плохом дне», но мы не ожидаем 21 чисто неудачных дней подряд в соответствии с нормальным распределением. –

+0

Не могли бы вы принять мой ответ, если мой подход поможет вам решить проблему? Большое спасибо. –

ответ

5
import numpy as np 

returns = np.random.randn(1000) 

Предполагая, что возвращается независимо друг от друга и одинаково распределены (i.i.d.), то неустойчивость Т дней равна произведению SQRT (Т) раз однодневного волатильности.

# one-way 5% quantile, critical value is 1.64 
VaR_21 = returns.std() * np.sqrt(21) * 1.645 
VaR_21 
Out[72]: 7.4161618430166989 

В качестве альтернативы, вы можете делать бутстрапы. Это случайным образом выбирает 21 день из исторического набора данных, рассчитывает возврат за это случайное количество 21 дней. Настройте гистограмму и получите 5% квантиль.

def generate_random_index(n=21): 
    # could set replace to False as well 
    return np.random.choice(np.arange(1000), size=n, replace=False) 

VaR_simulated_21 = [] 
n_bootstrap = 10000 
for _ in range(n_bootstrap): 
    VaR = returns[generate_random_index(21)].sum() 
    VaR_simulated_21.append(VaR) 

plt.hist(VaR_simulated_21) 
np.percentile(VaR_simulated_21, q=5) 
Out[108]: -8.0686958215041216 

enter image description here

+1

это не будет 'VaR = (1 + возвращает [generate_random_index (21)]). Cumprod() [- 1]'? –

Смежные вопросы