Advertisement
TheAceHome

Untitled

Apr 1st, 2020
114
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.58 KB | None | 0 0
  1. def find_prob_interval(excess):
  2. "Ищем квантили и значения в них, между которыми попадает данный excess."
  3.  
  4. # Проверка попадания в диапазон значений:
  5. if excess > max(q1000.values):
  6. # Подобрано с тем, чтобы вероятность approx_prob = 0:
  7. return excess, 2*excess, 1, 0
  8. elif excess < min(q1000.values):
  9. # Подобрано с тем, чтобы вероятность approx_prob = 1:
  10. return excess, 2*excess, 0, 0
  11.  
  12. for i in range(1, len(q1000)):
  13. if q1000.values[i-1] <= excess < q1000.values[i]:
  14. a = q1000.values[i-1]
  15. b = q1000.values[i]
  16. p_a = q1000.index[i-1]
  17. p_b = q1000.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 = n + 1
  29. years = alldf['<YEAR>'].unique()
  30. tickers=alldf['<TICKER>'].unique()
  31.  
  32. # Формируем ДатаФрейм, который потом будем заполнять:
  33. prob_df = pd.DataFrame(index=tickers, columns=years)
  34.  
  35. for ticker in Tickers:
  36. for year in years:
  37. # Выбираем данные по тикеру за последние days выбранного year:
  38. data = alldf[alldf['<TICKER>'] == ticker]
  39. try:
  40. data = data[data['<YEAR>'] == year].iloc[-1:-days:-1]
  41. except IndexError:
  42. # Если дней в году меньше, чем нам нужно - берем все, что есть:
  43. data = data[data.YEAR == year]
  44. if alldf.empty:
  45. # Если данных по тикеру нет, то сразу полагаем вероятность = 1 и идем на следующую итерацию:
  46. prob_df.loc[ticker, year] = 1
  47. continue
  48. # Считаем дневную логарифмическую доходность и эксцесс для нее:
  49. data_log_data = 100 * np.log(1 + data['<CLOSE>'].pct_change()).dropna()
  50. excess = scipy.stats.moment(data_log_data, 4) / scipy.stats.moment(data_log_data, 2)**2 - 3
  51.  
  52. # Находим и добавляем вероятность:
  53. prob = approx_prob(excess)
  54. prob_df.loc[ticker, year] = prob
  55.  
  56. prob_df
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement