Advertisement
Al3XS0n

task_2

May 9th, 2024
685
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 5.00 KB | None | 0 0
  1. import pandas as pd
  2. import numpy as np
  3.  
  4.  
  5. def filter_days(df: pd.DataFrame) -> tuple[pd.DataFrame, pd.DataFrame]:
  6.     """ Удаляем выходные дни
  7.  
  8.    :param df: Датафрейм со столбцом Date
  9.    
  10.    :returns: Отфильтрованный DataFrame
  11.    """
  12.     mask = np.is_busday(df['Date'].to_numpy().tolist(), weekmask='1111100')
  13.     df = df[mask]
  14.     return df[df['Date'] < '2023-01-01'], df[df['Date'] >= '2023-01-01']
  15.  
  16.  
  17. def prepare_data(df: pd.DataFrame, step: int=5) -> np.ndarray:
  18.     """ Получаем все необходимые данные из DataFram'а
  19.  
  20.    :param df: DataFrame c данными
  21.    """
  22.     close_prices = df['Close'].to_numpy()
  23.  
  24.     log_returns = np.log(close_prices[1:] / close_prices[:-1])
  25.  
  26.     windowed_log_returns_list = np.array_split(log_returns, np.arange(step, len(log_returns), step))
  27.  
  28.     chunked_log_returns = []
  29.     for chunk in windowed_log_returns_list:
  30.         chunked_log_returns.append(np.sum(chunk))
  31.  
  32.     return np.array(chunked_log_returns)
  33.  
  34.  
  35. def sample_var(data: np.array, percentile: float) -> np.float64:
  36.     """ Получение VaR по выборке по формуле Var(X) = -X_(percentile * n).
  37.    Где n длинна выборки
  38.  
  39.    :param data: выборка
  40.    :param percentile: персентиль VaR'а
  41.  
  42.    :returns: VaR соответсвтующего персентиля
  43.    """
  44.     return -np.sort(data)[int(percentile * len(data))]
  45.  
  46.  
  47. def gaussian_var(data: np.array, percentile: float) -> np.float64:
  48.     """ Получение VaR в предположении гаусовости.
  49.    Формула VaR = -(a + s * q). Где
  50.    - a - оцененное среднее
  51.    - s - оцененная дисперсия
  52.    - q - минус квантиль нужного персентиля Гаусовского распределения
  53.  
  54.    :param data: выборка
  55.    :param percentile: персентиль VaR'а
  56.  
  57.    :returns: VaR соответсвтующего персентиля
  58.    """
  59.  
  60.     mean = np.mean(data)
  61.     std_dev = np.std(data)
  62.     return -mean + 1.65 * std_dev  # 1.65 - квантиль нормального распределения для 5%
  63.  
  64.  
  65. def backtest(var: float, test_sample: np.ndarray, step: int=5) -> None:
  66.     data = prepare_data(test_sample, step)
  67.     exception_count = np.sum(data < -var)
  68.     exception_freq = exception_count / len(data)
  69.     print(f"Количество исключений {exception_count} из {len(data)}")
  70.     print(f"Исключения в процентах {exception_freq * 100}%")
  71.  
  72. print(f"{'Читаем данные':-^40}")
  73. df = pd.read_csv('MSFT.csv')
  74. print(df.head(5))
  75. print(f"{'Done':-^40}")
  76.  
  77. # Удаляем выходные дни
  78. print(f"{'Удаляем выходные дни':-^40}")
  79. train_df, test_df = filter_days(df)
  80. print(train_df.head(5))
  81. print(test_df.head(5))
  82. print(f"{'Done':-^40}")
  83.  
  84. # Берем данные
  85. print(f"\n\n{'Вычиляем 5 дневные log приросты':-^40}")
  86. data = prepare_data(train_df)
  87. print(data[:5])
  88. print(f"{'Done':-^40}")
  89.  
  90. # Вычисляем VaR по выборке
  91. print(f"{'Оцениваем VaR 5 по выборке':-^40}")
  92. sample_VaR = sample_var(data, 0.05)
  93. print(sample_VaR)
  94. print(f"{'Done':-^40}")
  95.  
  96. # Вычисляем VaR в предположении Гауссовости 5 дневных лог приростов
  97. print(f"{'Оцениваем VaR доходности 5 дневных приросто, в предположении их Гаусовости':-^40}")
  98. gaussian_5_VaR = gaussian_var(data, 0.05)
  99. print(gaussian_5_VaR)
  100. print(f"{'Done':-^40}")
  101.  
  102.  
  103. #
  104. # Ежедневный VaR
  105. #
  106.  
  107. print(f"\n\n{'Вычиляем ежедневные log приросты':-^40}")
  108. data_1 = prepare_data(train_df, 1)
  109. print(data_1[:5])
  110. print(f"{'Done':-^40}")
  111.  
  112. # Вычисляем ежедневный VaR в предположении Гауссовости ежедневных лог приростов
  113. print(f"{'Оцениваем VaR доходности ежедневных приростов, в предположении их Гаусовости':-^40}")
  114. gaussian_everyday_VaR = gaussian_var(data_1, 0.05)
  115. print(gaussian_everyday_VaR)
  116. print(f"{'Done':-^40}")
  117.  
  118.  
  119. print(f"\n\n{'Полученные результаты':-^40}")
  120. print(f"VaR по выборке {sample_VaR}")
  121. print(f"VaR по выборке(Гаусовость 5 дневных присростов) {gaussian_5_VaR}")
  122. print(f"VaR по выборке(Гаусовость приростов каждого дня) {gaussian_everyday_VaR}")
  123.  
  124. # Делаем Бэктест оценок
  125. print(f"\n\n{'Делаем бэктест':-^40}")
  126. print(f"\n{'По выборке':^30}")
  127. backtest(sample_VaR, test_df)
  128. print(f"\n{'Гаусовость, 5 дней':^30}")
  129. backtest(gaussian_5_VaR, test_df)
  130. print(f"\n{'Гаусовость, ежедневный':^30}")
  131. backtest(gaussian_everyday_VaR, test_df, step=1)
  132. print(f"{'Done':-^40}")
  133.  
  134.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement