Блог им. 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}')




