Блог им. AlexeyPetrushin

Распределение вероятностей изменения цен, где Тяжелый Хвост?

Есть гипотеза что изменения цен на акции описываются гибридным распределением — нормальным для головы, и парето для хвоста.

Распределение парето f(x) = Cx^-a можно увидеть на лог/лог графике как прямую линию. 

Я построил эмпирическое распределение CDF, реальных цен на акцию, но не могу найти на нем «хвост», прямую линию, где она? (просто для сравнения я также построил нормальное распределение откалиброванное на тех же данных).

Распределение вероятностей изменения цен, где Тяжелый Хвост?



На графике показана только часть CDF, положительные измемения, в маштабле лог/лог. Также, изменения цен трансформированы, как: 1) лог траснформа и 2) отцентрированы относительно медианы. Нормальное распределение откалибровано на тех же трансформированных данных, с насильно принятым 0 взятым из медианы в качестве арифметического среднего (т.е. для нормального насильно поставлена медиана вместо арифметич среднего, так график лучше совпадает).

Данные — изменения цен на акцию, посчитаны как изменения за год, для каждого дня, diff_i=price_i/price_{i-360}, для цен одной акции за несколько десятилетий.

Вобщем, где на графике этот хвост? :)

АПДЕЙТ: Я неверно построил лог/лог график, нужно «перевернуть» график (комплементарную CDF построить, новый график снизу), тогда логарифмический масштаб гораздо лучше «растягивает» линию и она лучше видна (точнее то что никакой линии там нет). Видно что Нормальное Распределение недооценивает хвосты, и тяжелый хвост есть, но судя по всему не Парето, а что то послабее. Еще попробую варианты, и потом опубликую новые графики...

Распределение вероятностей изменения цен, где Тяжелый Хвост?



P.S. 

В прошлых постах мне посоветовали посмотреть Обобщенное Гиперболическое Распределение (благодарность А. Г.). Я сомневался его использовать, поскольку там все таки не совсем Парето, но возможно оно реально хорошо подходит, попробую посмотрим...


Код и данные:
import json
import numpy as np
from scipy.stats import norm
import matplotlib.pyplot as plt

# Loading 'diffs.json'
with open('diffs.json', 'r') as file:
  diffs = json.load(file)

# Log-transform the data
log_diffs = np.log(diffs)

# Calculate the center as median, it fits better than the mean
center = np.median(log_diffs)

# Center the log diffs
log_diffs_centered = log_diffs - center

# Function to fit a real CDF
def fit_cdf_(data):
  sorted_data = np.sort(data)
  n = len(data)
  cdf = [(x, (i + 1) / n) for i, x in enumerate(sorted_data)]
  return cdf

# Fitting real CDF
real_cdf = fit_cdf_(log_diffs_centered)

# Fitting normal CDF, forcing mean to be 0
variance = np.mean(log_diffs_centered**2)  # Variance
sigma = np.sqrt(variance)                  # Standard deviation

# Extract CDF x-values
cdf_xs = np.array([x for x, _ in real_cdf])

# Compute the normal CDF for these x-values
normal_cdf = [(x, norm.cdf(x, loc=0, scale=sigma)) for x in cdf_xs]

# Plot real CDF and normal CDF
real_cdf_ys = [p for _, p in real_cdf]
normal_cdf_ys = [p for _, p in normal_cdf]

plt.figure(figsize=(8, 6))
plt.plot(cdf_xs, real_cdf_ys, label='Real CDF', linestyle='-')
plt.plot(cdf_xs, normal_cdf_ys, label='Normal CDF', linestyle='--')
plt.xscale('log')  # Logarithmic x-axis scale
plt.yscale('log')  # Logarithmic x-axis scale
plt.ylim(0.5, 1)   # y-axis domain
plt.xlim(0.001, 2)  # x-axis domain
plt.xlabel('x (log scale)')
plt.ylabel('Cumulative Probability')
plt.title('Real vs Normal CDF')
plt.legend()
x_ticks = [0.001, 0.005, 0.01, 0.05, 0.1, 0.5, 1, 2]
plt.xticks(x_ticks, [str(label) for label in x_ticks])
y_ticks = [0.5, 0.6, 0.7, 0.8, 0.9, 1]
plt.yticks(y_ticks, [str(label) for label in y_ticks])
plt.grid(True)
plt.show()

И данные скачать

 
15 комментариев
1) толстые хвосты появляются когда лаг не 360, а 1, и проблема не в том, что они толстые, а что они внезапно могут становится толстыми. 2) функция распределения не очень визуально ярко воспринимается, лучше плотность распределения. 3) у разных акций есть свой «характер», у некоторых хосты почти всегда толстые, а у некоторых — наоборот обычно тонкие

UPD. кстати, в фильме предел риска — как раз описана ситуация, когда хвосты вдруг стали толстеть
avatar
amberfoxman, согласен, плотность лучше, но на реальных данных, ее не получится построить. Плотность работает для теоретических моделей, где есть формула и мы можем сгенерировать много точек, на эмпирических данных, они почти все в голове, в хвосте данных мало, и вместо плавной линии, в хвосте получатся прыжки и зигзаги.

Как вариант можно гистограмму (разбитие по корзинам) сделать, она сгладит.

По акции — это «средняя» акция, не самая спокойная, не самая волатильная, история несколько десятилетий, по идее, хвосты должны проявиться…
avatar
Есть гипотеза что изменения цен на акции описываются гибридным распределением — нормальным для головы, и парето для хвоста.
вы не то распределение ищете… Биржа торгует риски, сентимент комьюнити, вот их распределение интересует и оператора рынка и клиентов, то есть нас. А риски все преуменьшают, потому хвосты и толстеют внезапно… И ни одно распределение никогда не скажет сколько можно ещё добавить риска...

Активный Инвестор, на акциях на горизонте месяца 4 сигмы почти всегда нормально, другое дело что с такой оценкой риска доходность так себе получается
PS смотрю ваши ролики на ютубе, добротные
avatar
Активный Инвестор, 
Вот эти как раз взяли это ведро черешни...
yandex.ru/video/preview/8007519925696137596
avatar
Говори ли вам не читайте разных проходимцев вроде Талеба, Мальдоброта и т.д.
avatar
В конце 90-х годов прошлого века вышла куча статей квантов о хорошем приближении дневных процентных приращений индексов Доу-Джонса, S&P500, NASDAQ, Nikkei, FTSE и DAX обобщёнными гиперболическими распределениями.

Самое интересное, что класс обобщенных гиперболических распределений — это класс  распределений нормальных случайных величин со случайными средним и дисперсией и разными классами этих распределений. И в этом классе «лежит» почти все из распределений в справочниках по теорверу: и Хи-квадрат, и Лаплас и многое другое, кроме Парето.
avatar
Это конечно не А.Г. но тоже неплохо:
rama.cont.perso.math.cnrs.fr/pdf/empirical.pdf

И еще нужно понимать как работает ЦПТ, желательно с нюансами, коих там много.
avatar
Для практического применения больше подходит (удобнее) показатель херста, что-то типа такого, тут 3 лага и видно, что чем лаг больше — тем херст ближе к 0.5 и более стабилен

avatar
А вот и хвост Парето, появился при изменении интервала с 1 года до 1 дня




avatar
Alex Craft, а почему Парето? У меня кроме 42 дней с января 1993 для SPY все сошлось с частным случаем обобщённого гиперболического распределения

smart-lab.ru/blog/699507.php


avatar
А. Г., я думаю что это парето, потому что из за ограниченности сэмпла мы видим лишь часть экстремальных событий, лишь часть хвоста. Если бы данные были за тысячу лет, то график бы выглядел (это моя догадка конечно, может ошибочная) как на рисунке ниже, где я продолжил линию искуственно (по аналогии с теорией предельных значений). 

Но это догадка конечно, сказать наверняка нельзя :)


avatar
Alex Craft, да с распределениями случайных величин r*X+(1-r)*У, где r случайная величина равная нулю или единице и р(r=1)~1, а Х и У — две разные случайные величины  вообще лучше всего критерий Манна-Уитни для понимания, какое распределение Х и какое р(r=1). Ведь Парето на всем множестве приращений цен или логарифмов цен и быть не может. А Колмогоров-Смирнов — самый хороший критерий только для случая выборки из одного и того же непрерывного распределения с плотностью и любыми ее «хвостами». Если функция распределения со скачками, то да, критерий Колмогорова-Смирнова «не очень», но судя по тому, что и у Anderson–Darling интеграл от Fn, то тоже для скачкообразных распределений «не очень».
avatar
А. Г., по SPY не могу сказать, нужно самому построить, посмотреть графики. Я оставил пару идей в комментах.

avatar
Alex Craft, вот, похоже, шапка уже, а хвост толще
avatar

теги блога Alex Craft

....все тэги



UPDONW
Новый дизайн