Блог им. AlexeyPetrushin
Recent: E[log likelihood]: -1.0211 Hist: E[log likelihood]: -0.9591 Mixture (0.5 recent + 0.5 hist): E[log likelihood]: -0.9660
«в среднем» получается одинаково что последняя волатильность что историческая. Неожиданно, я ожидал что «недавняя» будет заметно лучше «исторической» :)
Данные, столбики в таблице — историч волатильн, реальная прибыль, безрисковый рейт, последн волатильн
hist lr_actual lrf_return recent 0.594 -0.017 0.02 0.556 0.594 0.477 0.011 0.693 0.594 0.933 0.012 0.771 0.594 1.337 0.005 0.844 0.594 1.414 0.004 0.865 ...полные данные
import pandas as pd import numpy as np from scipy.stats import norm def mean_log_pseudo_prob_and_loglh(df, mean_col, sigma_col, actual_col): lh = norm.pdf(df[actual_col], loc=df[mean_col], scale=df[sigma_col]) log_lh = np.log(lh) pseudo_prob = lh / lh.sum() log_pseudo_prob = np.log(pseudo_prob) return log_pseudo_prob.mean(), log_lh.mean() def mean_log_pseudo_prob_and_loglh_mixture(df, mean_col, sigma_col1, sigma_col2, actual_col): # PDF of each component lh1 = norm.pdf(df[actual_col], loc=df[mean_col], scale=df[sigma_col1]) lh2 = norm.pdf(df[actual_col], loc=df[mean_col], scale=df[sigma_col2]) # Mixture likelihood: 0.5 * lh1 + 0.5 * lh2 lh_mix = 0.5 * lh1 + 0.5 * lh2 log_lh_mix = np.log(lh_mix) pseudo_prob = lh_mix / lh_mix.sum() log_pseudo_prob = np.log(pseudo_prob) return log_pseudo_prob.mean(), log_lh_mix.mean() # Read the data df = pd.read_csv('tmp/data.tsv', sep='\t') # Individual models a_lpp, a_llh = mean_log_pseudo_prob_and_loglh(df, 'lrf_return', 'recent', 'lr_actual') b_lpp, b_llh = mean_log_pseudo_prob_and_loglh(df, 'lrf_return', 'hist', 'lr_actual') # Mixture model m_lpp, m_llh = mean_log_pseudo_prob_and_loglh_mixture(df, 'lrf_return', 'recent', 'hist', 'lr_actual') # Output print('Recent:') print(f' E[log pseudo-prob]: {a_lpp:.4f}') print(f' E[log likelihood]: {a_llh:.4f}') print('Hist:') print(f' E[log pseudo-prob]: {b_lpp:.4f}') print(f' E[log likelihood]: {b_llh:.4f}') print('Mixture (0.5 recent + 0.5 hist):') print(f' E[log pseudo-prob]: {m_lpp:.4f}') print(f' E[log likelihood]: {m_llh:.4f}')
В общем, везде где есть период, это линейность и игнорирование остальных периодов. Поэтому «волатильность» у всех своя. Кто то вообще смотрит на полосы боллинджера, кто то на HL предыдущих дней, некоторые вообще через RSI вычисляют. Знал одного опционщика у него «волатильность» 90% времени была у нуля и 1-2 раза в год показывала всплеск. Причем всплески не совпадали с другими.
Имхо. «Волатильности» не помогут предсказать будущего. Это всего лишь производная от цены. Но она обладает заметными свойствами, о которых можно подумать.