Я неоднократно пытался строить Генератор случайных чисел Нормального распределения для симуляции биржевых данных. И я всегда натыкался на одну проблемму.
Котировки, как правило кучкуются примерно в одной области и потихоньку дрейфуют в том или ином напрвалении. Если Невооруженным глазом посмотреть, то котировки образуюн некоторые каналы (расширяющиеся, сужающиеся). Но всегда это похоже на канал, то есть некоторая локальная область.
А когда я генерю Нормальное распределение своими не очень точными методами, то у меня часто получаются точки из противоположных квантилей. То есть не локальная область, а просто шарахание из стороны в сторону. То есть не получается генерить котировки из такой как-бы локальной области.
Можешь ли ты сделать Генератор случайных чисел Нормального распределения, чтобы это было бы похоже котировки биржи.
Вы описываете нестационарный процесс с локальной автокорреляцией, а обычное нормальное распределение дает стационарный белый шум. Давайте создадим генератор, который имитирует реальные котировки.
Ключевые особенности:
Локальность - цены находятся в определенных диапазонах
Память - текущее значение зависит от предыдущих
Кластеризация волатильности - периоды спокойствия и активности
Режимы рынка - трендовые и флэтовые периоды
Поддержка/сопротивление - отскоки от границ каналов
Теперь генерация будет похожа на реальные котировки! 📈
ГЕНЕРАЦИЯ РЕАЛИСТИЧНЫХ БИРЖЕВЫХ ДАННЫХ
=====================================
Базовая модель:
Волатильность: 7,540 %
Автокорреляция: 0,0144
Экспонента Хёрста: 0,6058
Диапазон: 16,99 - 260,61
Модель с каналами:
Волатильность: 1,941 %
Автокорреляция: 0,8994
Экспонента Хёрста: 0,9598
Диапазон: 0,00 - 99,56
Продвинутая модель:
Волатильность: не число
Автокорреляция: не число
Экспонента Хёрста: не число
Диапазон: не число - не число
Модель с режимами:
Волатильность: 1,773 %
Автокорреляция: -0,1775
Экспонента Хёрста: 0,5290
Диапазон: 68,08 - 103,73
Продвинутая модель:
------------------------------------------------------------
не число |
------------------------------------------------------------
Продвинутая модель пока не взлетела
Основные исправления:
Защита от деления на ноль - проверка положительных цен
Обработка исключений - try-catch вокруг опасных операций
Валидация данных - проверка на NaN и Infinity
Корректное вычисление волатильности - через логарифмические возвраты
Запасные значения - на случай ошибок в вычислениях
Теперь продвинутая модель должна работать корректно! Запустите снова и посмотрите на результаты. У тебя в метриках Generators выступают
- волатильность
- автокорреляция
- экспонента Херста
- диапазон
- последние цены
-----------------------
1. Расскажи подробно Что показывает каждая метрика?
2. Что она может нам рассказать. За какую характеристику отвечает?
3. Какие у этих показателей диапазоны значений.
4. Что означает, если значение находится в своих екстремальных зонах (min, мax)
5. Почему в этот список не вошли mean, stdev
ГЕНЕРАЦИЯ РЕАЛИСТИЧНЫХ БИРЖЕВЫХ ДАННЫХ
=====================================
Базовая модель:
Волатильность: 7,547 %
Автокорреляция: 0,0144
Экспонента Хёрста: 0,6058
Диапазон: 16,99 - 260,61
Последние цены: 46,72, 51,84, 53,44
Модель с каналами:
Волатильность: 1,943 %
Автокорреляция: 0,8994
Экспонента Хёрста: 0,9598
Диапазон: 0,00 - 99,56
Последние цены: 0,00, 0,00, 0,00
Продвинутая модель:
Волатильность: 0,593 %
Автокорреляция: 0,1594
Экспонента Хёрста: 0,6637
Диапазон: 83,12 - 100,82
Последние цены: 89,09, 89,19, 89,29
Модель с режимами:
Волатильность: 1,775 %
Автокорреляция: -0,1775
Экспонента Хёрста: 0,5290
Диапазон: 68,08 - 103,73
Последние цены: 77,05, 76,54, 81,87
Продвинутая модель:
------------------------------------------------------------
99,9 |
99,1 | ●
98,2 | ●●
97,3 | ●
96,4 | ●● ● ● ●
95,5 | ● ● ●● ●●●● ●
94,6 | ● ●
93,7 | ●● ●●●
92,9 | ●●● ●
92,0 | ● ● ●
91,1 | ●
90,2 | ● ● ●●
89,3 | ●
88,4 | ●● ●●● ●●
87,5 | ● ● ●
86,7 | ●
85,8 |
84,9 |
84,0 |
83,1 |
-----------
Нестационарный процесс с локальной автокорреляцией, а обычное нормальное распределение дает стационарный белый шум. Давайте создадим генератор, который имитирует реальные котировки.
Вывод: Ваша продвинутая модель показывает наиболее реалистичные характеристики, кроме слишком низкой волатильности! 🎯 ---------------------------------------- При расчете волатильности -
Какой математический повод использовать логарифмические доходности, а не простые доходности. По своему значению эти величины должны быть близки
?
Отличный вопрос! Давайте разберем математические основания для использования логарифмических доходностей.
// В модели Блэка-Шоулза волатильность определяется через логдоходностиdouble volatility = Math.Sqrt(varianceOfLogReturns);
6. Эмпирическая проверка
csharp
publicclassEmpiricalProof{publicstaticvoidTestNormality(double[] prices){var simpleReturns =CalculateSimpleReturns(prices);var logReturns =CalculateLogReturns(prices);// Тест на нормальностьdouble simpleSkewness =CalculateSkewness(simpleReturns);double logSkewness =CalculateSkewness(logReturns);double simpleKurtosis =CalculateKurtosis(simpleReturns);double logKurtosis =CalculateKurtosis(logReturns);
Console.WriteLine("Асимметрия (Skewness):");
Console.WriteLine($" Простые: {simpleSkewness:F4} (должно быть 0)");
Console.WriteLine($" Логарифмические: {logSkewness:F4} (ближе к 0)");
Console.WriteLine("Эксцесс (Kurtosis):");
Console.WriteLine($" Простые: {simpleKurtosis:F4}");
Console.WriteLine($" Логарифмические: {logKurtosis:F4} (ближе к 3)");}privatestaticdoubleCalculateSkewness(double[] values){double mean = values.Average();double stdDev = Math.Sqrt(values.Average(v => Math.Pow(v - mean,2)));return values.Average(v => Math.Pow((v - mean)/ stdDev,3));}}
7. Практические последствия для волатильности
csharp
publicclassVolatilityComparison{publicstatic(double simpleVol,double logVol)CalculateBothVolatilities(double[] prices){// Волатильность из простых доходностейvar simpleReturns =newList<double>();for(int i =1; i < prices.Length; i++){
simpleReturns.Add((prices[i]- prices[i-1])/ prices[i-1]);}double simpleVol = Math.Sqrt(simpleReturns.Variance())* Math.Sqrt(252);// Волатильность из логарифмических доходностей var logReturns =newList<double>();for(int i =1; i < prices.Length; i++){
logReturns.Add(Math.Log(prices[i]/ prices[i-1]));}double logVol = Math.Sqrt(logReturns.Variance())* Math.Sqrt(252);return(simpleVol, logVol);}}
📊 Результаты для разных сценариев:
Сценарий
Простые доходности
Логарифмические доходности
Малые изменения (<5%)
≈ Логарифмическим
≈ Простым
Большие изменения (>20%)
Завышают волатильность
Более точны
Отрицательные цены
Проблемы с расчетом
Невозможны (логарифм)
Статистические свойства
Асимметричны
Более нормальны
Агрегация во времени
Сложная
Простая (суммирование)
🎯 Вывод:
Логарифмические доходности используют потому что:
✅ Математически корректны для моделей типа геометрического броуновского движения
✅ Статистически предпочтительны - ближе к нормальному распределению
✅ Временная согласованность - легко агрегировать за разные периоды
✅ Теоретическое обоснование - основа современных финансовых моделей
Для маленьких изменений (1-2%) разница действительно незначительна, но для больших движений или статистического анализа логарифмические доходности принципиально важны! 📈