Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import pandas as pd
- import numpy as np
- def filter_days(df: pd.DataFrame) -> tuple[pd.DataFrame, pd.DataFrame]:
- """ Удаляем выходные дни
- :param df: Датафрейм со столбцом Date
- :returns: Отфильтрованный DataFrame
- """
- mask = np.is_busday(df['Date'].to_numpy().tolist(), weekmask='1111100')
- df = df[mask]
- return df[df['Date'] < '2023-01-01'], df[df['Date'] >= '2023-01-01']
- def prepare_data(df: pd.DataFrame, step: int=5) -> np.ndarray:
- """ Получаем все необходимые данные из DataFram'а
- :param df: DataFrame c данными
- """
- close_prices = df['Close'].to_numpy()
- log_returns = np.log(close_prices[1:] / close_prices[:-1])
- windowed_log_returns_list = np.array_split(log_returns, np.arange(step, len(log_returns), step))
- chunked_log_returns = []
- for chunk in windowed_log_returns_list:
- chunked_log_returns.append(np.sum(chunk))
- return np.array(chunked_log_returns)
- def sample_var(data: np.array, percentile: float) -> np.float64:
- """ Получение VaR по выборке по формуле Var(X) = -X_(percentile * n).
- Где n длинна выборки
- :param data: выборка
- :param percentile: персентиль VaR'а
- :returns: VaR соответсвтующего персентиля
- """
- return -np.sort(data)[int(percentile * len(data))]
- def gaussian_var(data: np.array, percentile: float) -> np.float64:
- """ Получение VaR в предположении гаусовости.
- Формула VaR = -(a + s * q). Где
- - a - оцененное среднее
- - s - оцененная дисперсия
- - q - минус квантиль нужного персентиля Гаусовского распределения
- :param data: выборка
- :param percentile: персентиль VaR'а
- :returns: VaR соответсвтующего персентиля
- """
- mean = np.mean(data)
- std_dev = np.std(data)
- return -mean + 1.65 * std_dev # 1.65 - квантиль нормального распределения для 5%
- def backtest(var: float, test_sample: np.ndarray, step: int=5) -> None:
- data = prepare_data(test_sample, step)
- exception_count = np.sum(data < -var)
- exception_freq = exception_count / len(data)
- print(f"Количество исключений {exception_count} из {len(data)}")
- print(f"Исключения в процентах {exception_freq * 100}%")
- print(f"{'Читаем данные':-^40}")
- df = pd.read_csv('MSFT.csv')
- print(df.head(5))
- print(f"{'Done':-^40}")
- # Удаляем выходные дни
- print(f"{'Удаляем выходные дни':-^40}")
- train_df, test_df = filter_days(df)
- print(train_df.head(5))
- print(test_df.head(5))
- print(f"{'Done':-^40}")
- # Берем данные
- print(f"\n\n{'Вычиляем 5 дневные log приросты':-^40}")
- data = prepare_data(train_df)
- print(data[:5])
- print(f"{'Done':-^40}")
- # Вычисляем VaR по выборке
- print(f"{'Оцениваем VaR 5 по выборке':-^40}")
- sample_VaR = sample_var(data, 0.05)
- print(sample_VaR)
- print(f"{'Done':-^40}")
- # Вычисляем VaR в предположении Гауссовости 5 дневных лог приростов
- print(f"{'Оцениваем VaR доходности 5 дневных приросто, в предположении их Гаусовости':-^40}")
- gaussian_5_VaR = gaussian_var(data, 0.05)
- print(gaussian_5_VaR)
- print(f"{'Done':-^40}")
- #
- # Ежедневный VaR
- #
- print(f"\n\n{'Вычиляем ежедневные log приросты':-^40}")
- data_1 = prepare_data(train_df, 1)
- print(data_1[:5])
- print(f"{'Done':-^40}")
- # Вычисляем ежедневный VaR в предположении Гауссовости ежедневных лог приростов
- print(f"{'Оцениваем VaR доходности ежедневных приростов, в предположении их Гаусовости':-^40}")
- gaussian_everyday_VaR = gaussian_var(data_1, 0.05)
- print(gaussian_everyday_VaR)
- print(f"{'Done':-^40}")
- print(f"\n\n{'Полученные результаты':-^40}")
- print(f"VaR по выборке {sample_VaR}")
- print(f"VaR по выборке(Гаусовость 5 дневных присростов) {gaussian_5_VaR}")
- print(f"VaR по выборке(Гаусовость приростов каждого дня) {gaussian_everyday_VaR}")
- # Делаем Бэктест оценок
- print(f"\n\n{'Делаем бэктест':-^40}")
- print(f"\n{'По выборке':^30}")
- backtest(sample_VaR, test_df)
- print(f"\n{'Гаусовость, 5 дней':^30}")
- backtest(gaussian_5_VaR, test_df)
- print(f"\n{'Гаусовость, ежедневный':^30}")
- backtest(gaussian_everyday_VaR, test_df, step=1)
- print(f"{'Done':-^40}")
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement