Advertisement
Guest User

Untitled

a guest
Mar 31st, 2020
104
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.76 KB | None | 0 0
  1. def find_prob_interval(excess):
  2. "Ищем квантили и значения в них, между которыми попадает данный excess."
  3.  
  4. # Проверка попадания в диапазон значений:
  5. if excess > max(quantiles_1000.values):
  6. # Подобрано с тем, чтобы вероятность approx_prob = 0:
  7. return excess, 2*excess, 1, 0
  8. elif excess < min(quantiles_1000.values):
  9. # Подобрано с тем, чтобы вероятность approx_prob = 1:
  10. return excess, 2*excess, 0, 0
  11.  
  12. for i in range(1, len(quantiles_1000)):
  13. if quantiles_1000.values[i-1] <= excess < quantiles_1000.values[i]:
  14. a = quantiles_1000.values[i-1]
  15. b = quantiles_1000.values[i]
  16. p_a = quantiles_1000.index[i-1]
  17. p_b = quantiles_1000.index[i]
  18.  
  19. return a, b, p_a, p_b
  20.  
  21. def approx_prob(excess):
  22. "Линейно аппроксимируем вероятность между двумя квантилями."
  23. a, b, p_a, p_b = find_prob_interval(excess)
  24. alpha = (excess - b) / (a - b)
  25. prob = alpha*p_a + (1 - alpha)*p_b
  26. return round(1 - float(prob), 3)
  27.  
  28. days = 240 - 5 * variant_num + 1 # 90
  29. years = tickers_data['<DATE>'].dt.year.unique()
  30.  
  31. # Формируем ДатаФрейм, который потом будем заполнять:
  32. prob_df = pd.DataFrame(index=tickers, columns=years)
  33.  
  34. for ticker in tickers:
  35. for year in years:
  36. # Выбираем данные по тикеру за последние days выбранного year:
  37. ticker_data = tickers_data[tickers_data['<TICKER>'] == ticker]
  38. try:
  39. ticker_data = ticker_data[ticker_data['<DATE>'].dt.year == year].iloc[-1:-days:-1]
  40. except IndexError:
  41. # Если дней в году меньше, чем нам нужно - берем все, что есть:
  42. ticker_data = ticker_data[ticker_data['<DATE>'].dt.year == year]
  43. if ticker_data.empty:
  44. # Если данных по тикеру нет, то сразу полагаем вероятность = 1 и идем на следующую итерацию:
  45. prob_df.loc[ticker, year] = 1
  46. continue
  47. # Считаем дневную логарифмическую доходность и эксцесс для нее:
  48. ticker_log_data = 100 * np.log(1 + ticker_data['<CLOSE>'].pct_change()).dropna()
  49. excess = central_moment(ticker_log_data, 4) / central_moment(ticker_log_data, 2)**2 - 3
  50.  
  51. # Находим и добавляем вероятность:
  52. prob = approx_prob(excess)
  53. prob_df.loc[ticker, year] = prob
  54.  
  55. prob_df
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement