Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- def find_prob_interval(excess):
- "Ищем квантили и значения в них, между которыми попадает данный excess."
- # Проверка попадания в диапазон значений:
- if excess > max(quantiles_1000.values):
- # Подобрано с тем, чтобы вероятность approx_prob = 0:
- return excess, 2*excess, 1, 0
- elif excess < min(quantiles_1000.values):
- # Подобрано с тем, чтобы вероятность approx_prob = 1:
- return excess, 2*excess, 0, 0
- for i in range(1, len(quantiles_1000)):
- if quantiles_1000.values[i-1] <= excess < quantiles_1000.values[i]:
- a = quantiles_1000.values[i-1]
- b = quantiles_1000.values[i]
- p_a = quantiles_1000.index[i-1]
- p_b = quantiles_1000.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 = 240 - 5 * variant_num + 1 # 90
- years = tickers_data['<DATE>'].dt.year.unique()
- # Формируем ДатаФрейм, который потом будем заполнять:
- prob_df = pd.DataFrame(index=tickers, columns=years)
- for ticker in tickers:
- for year in years:
- # Выбираем данные по тикеру за последние days выбранного year:
- ticker_data = tickers_data[tickers_data['<TICKER>'] == ticker]
- try:
- ticker_data = ticker_data[ticker_data['<DATE>'].dt.year == year].iloc[-1:-days:-1]
- except IndexError:
- # Если дней в году меньше, чем нам нужно - берем все, что есть:
- ticker_data = ticker_data[ticker_data['<DATE>'].dt.year == year]
- if ticker_data.empty:
- # Если данных по тикеру нет, то сразу полагаем вероятность = 1 и идем на следующую итерацию:
- prob_df.loc[ticker, year] = 1
- continue
- # Считаем дневную логарифмическую доходность и эксцесс для нее:
- ticker_log_data = 100 * np.log(1 + ticker_data['<CLOSE>'].pct_change()).dropna()
- excess = central_moment(ticker_log_data, 4) / central_moment(ticker_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