Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- def find_prob_interval(excess):
- "Ищем квантили и значения в них, между которыми попадает данный excess."
- # Проверка попадания в диапазон значений:
- if excess > max(q1000.values):
- # Подобрано с тем, чтобы вероятность approx_prob = 0:
- return excess, 2*excess, 1, 0
- elif excess < min(q1000.values):
- # Подобрано с тем, чтобы вероятность approx_prob = 1:
- return excess, 2*excess, 0, 0
- for i in range(1, len(q1000)):
- if q1000.values[i-1] <= excess < q1000.values[i]:
- a = q1000.values[i-1]
- b = q1000.values[i]
- p_a = q1000.index[i-1]
- p_b = q1000.index[i]
- return a, b, p_a, p_b
- def approx_prob(excess):
- "Линейно аппроксимируем вероятность между двумя квантилями."
- a, b, p_a, p_b = find_prob_interval(excess)
- alpha = (excess - b) / (a - b)
- prob = alpha*p_a + (1 - alpha)*p_b
- return round(1 - float(prob), 3)
- days = n + 1
- years = alldf['<YEAR>'].unique()
- tickers=alldf['<TICKER>'].unique()
- # Формируем ДатаФрейм, который потом будем заполнять:
- prob_df = pd.DataFrame(index=tickers, columns=years)
- for ticker in Tickers:
- for year in years:
- # Выбираем данные по тикеру за последние days выбранного year:
- data = alldf[alldf['<TICKER>'] == ticker]
- try:
- data = data[data['<YEAR>'] == year].iloc[-1:-days:-1]
- except IndexError:
- # Если дней в году меньше, чем нам нужно - берем все, что есть:
- data = data[data.YEAR == year]
- if alldf.empty:
- # Если данных по тикеру нет, то сразу полагаем вероятность = 1 и идем на следующую итерацию:
- prob_df.loc[ticker, year] = 1
- continue
- # Считаем дневную логарифмическую доходность и эксцесс для нее:
- data_log_data = 100 * np.log(1 + data['<CLOSE>'].pct_change()).dropna()
- excess = scipy.stats.moment(data_log_data, 4) / scipy.stats.moment(data_log_data, 2)**2 - 3
- # Находим и добавляем вероятность:
- prob = approx_prob(excess)
- prob_df.loc[ticker, year] = prob
- prob_df
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement