понедельник, 10 ноября 2025 г.

25.10.14, DeepSeek, Generator, Random, Markets,

25.10.14, DeepSeek, Generator, Random, Markets,

Я неоднократно пытался строить Генератор случайных чисел Нормального распределения для симуляции биржевых данных. И я всегда натыкался на одну проблемму. Котировки, как правило кучкуются примерно в одной области и потихоньку дрейфуют в том или ином напрвалении. Если Невооруженным глазом посмотреть, то котировки образуюн некоторые каналы (расширяющиеся, сужающиеся). Но всегда это похоже на канал, то есть некоторая локальная область. А когда я генерю Нормальное распределение своими не очень точными методами, то у меня часто получаются точки из противоположных квантилей. То есть не локальная область, а просто шарахание из стороны в сторону. То есть не получается генерить котировки из такой как-бы локальной области. Можешь ли ты сделать Генератор случайных чисел Нормального распределения, чтобы это было бы похоже котировки биржи. 

Вы описываете нестационарный процесс с локальной автокорреляцией, а обычное нормальное распределение дает стационарный белый шум. Давайте создадим генератор, который имитирует реальные котировки.

Ключевые особенности:

  1. Локальность - цены находятся в определенных диапазонах

  2. Память - текущее значение зависит от предыдущих

  3. Кластеризация волатильности - периоды спокойствия и активности

  4. Режимы рынка - трендовые и флэтовые периоды

  5. Поддержка/сопротивление - отскоки от границ каналов

Теперь генерация будет похожа на реальные котировки! 📈

ГЕНЕРАЦИЯ РЕАЛИСТИЧНЫХ БИРЖЕВЫХ ДАННЫХ ===================================== Базовая модель: Волатильность: 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 Продвинутая модель: ------------------------------------------------------------ не число | ------------------------------------------------------------ Продвинутая модель пока не взлетела

Основные исправления:

  1. Защита от деления на ноль - проверка положительных цен

  2. Обработка исключений - try-catch вокруг опасных операций

  3. Валидация данных - проверка на NaN и Infinity

  4. Корректное вычисление волатильности - через логарифмические возвраты

  5. Запасные значения - на случай ошибок в вычислениях

Теперь продвинутая модель должна работать корректно! Запустите снова и посмотрите на результаты.
У тебя в метриках 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 | -----------

Нестационарный процесс с локальной автокорреляцией, а обычное нормальное распределение дает стационарный белый шум. Давайте создадим генератор, который имитирует реальные котировки.
ГЕНЕРАЦИЯ РЕАЛИСТИЧНЫХ БИРЖЕВЫХ ДАННЫХ ===================================== Базовая модель: Волатильность: 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 |

Отличные вопросы! Давайте разберем каждую метрику подробно.

1. 📊 Волатильность (Volatility)

Что показывает:

Годичная стандартное отклонение логарифмических доходностей - меру риска и неопределенности.

Что рассказывает:

  • Низкая волатильность (1-3%): Спокойный рынок, предсказуемые движения

  • Высокая волатильность (10%+): Турбулентный рынок, высокий риск

  • Изменения волатильности: Свидетельствует о смене рыночных режимов

Диапазоны значений:

  • 0-3%: Очень низкая (государственные облигации)

  • 3-10%: Умеренная (голубые фишки)

  • 10-30%: Высокая (акции роста, сырьевые товары)

  • 30%+: Экстремальная (криптовалюты, кризис)

Экстремальные значения:

  • → 0: Полное отсутствие движения (подозрительно для реальных данных)

  • → 50%+: Хаотичные скачки (нереалистично для большинства активов)

2. 🔄 Автокорреляция (Autocorrelation)

Что показывает:

Корреляция между текущим и предыдущим значением (лаг 1). Меру "памяти" процесса.

Что рассказывает:

  • Положительная (> 0.1): Трендовое поведение, инерция

  • Отрицательная (< -0.1): Возвратное поведение, коррекции

  • Близкая к 0: Случайные блуждания, эффективный рынок

Диапазоны значений:

  • -1.0 до +1.0

  • Реальные рынки: обычно -0.2 до +0.2 для дневных данных

Экстремальные значения:

  • → +1.0: Полная предсказуемость (нереалистично)

  • → -1.0: Идеальное возвращение к среднему (редко)

  • 0.8994 (канальная модель): Слишком предсказуемо!

3. 📈 Экспонента Хёрста (Hurst Exponent)

Что показывает:

Меру персистентности/антиперсистентности временного ряда.

Что рассказывает:

  • H > 0.5: Персистентность (тренды имеют память)

  • H = 0.5: Случайное блуждание (эффективный рынок)

  • H < 0.5: Антиперсистентность (возврат к среднему)

Диапазоны значений:

  • 0.0 - 1.0

  • Реальные рынки: 0.5-0.8 (обычно 0.6-0.7)

Экстремальные значения:

  • → 1.0: Детерминированный тренд (не случайность)

  • → 0.0: Сильное возвращение к среднему

  • 0.9598 (канальная модель): Почти детерминированный процесс!

4. 📏 Диапазон (Range)

Что показывает:

Минимальное и максимальное значение за весь период.

Что рассказывает:

  • Узкий диапазон: Консолидация, низкая волатильность

  • Широкий диапазон: Сильные тренды, высокая волатильность

  • Асимметрия: Преобладание бычьего/медвежьего тренда

Диапазоны значений:

Зависит от актива и периода. Для акций ±50% за год - нормально.

Экстремальные значения:

  • 0.00 (минимум): Обнуление цены (банкротство)

  • → бесконечность: Экспоненциальный рост (пузырь)

5. ❓ Почему не вошли Mean и StDev?

Mean (среднее):

csharp
// Не информативен для ценовых рядов!
double mean = prices.Average(); // Бессмысленно для нестационарного ряда

Проблемы:

  • Цены нестационарны - среднее смещается со временем

  • Не показывает доходность

  • Может вводить в заблуждение

StDev (стандартное отклонение):

csharp
// Не подходит для цен!
double stdev = Math.Sqrt(prices.Variance()); // Не имеет экономического смысла

Почему волатильность лучше:

csharp
// Волатильность = stdev логарифмических доходностей
double returnsVolatility = CalculateReturnsVolatility(prices); // Имеет смысл!

🔍 Анализ ваших результатов:

Базовая модель:

text
Волатильность: 7,547 %       - Реалистично для акций
Автокорреляция: 0,0144       - Случайное блуждание ✓
Экспонента Хёрста: 0,6058    - Слабая персистентность ✓
Диапазон: 16,99 - 260,61     - Сильный рост (возможно чрезмерный)

Модель с каналами:

text
Волатильность: 1,943 %       - Слишком низкая
Автокорреляция: 0,8994       - СЛИШКОМ предсказуемо! ❌
Экспонента Хёрста: 0,9598    - Почти детерминировано ❌
Диапазон: 0,00 - 99,56       - Обнуление цены! ❌

Продвинутая модель:

text
Волатильность: 0,593 %       - Слишком низкая
Автокорреляция: 0,1594       - Слабая память ✓
Экспонента Хёрста: 0,6637    - Умеренная персистентность ✓
Диапазон: 83,12 - 100,82     - Стабильность ✓

Модель с режимами:

text
Волатильность: 1,775 %       - Низкая, но приемлема
Автокорреляция: -0,1775      - Возвратное поведение ✓
Экспонента Хёрста: 0,5290    - Близко к случайному блужданию ✓
Диапазон: 68,08 - 103,73     - Реалистичные колебания ✓

🎯 Идеальные значения для реалистичных данных:

МетрикаИдеальный диапазонКомментарий
Волатильность1-5% (дневная)Зависит от актива
Автокорреляция-0.1 до +0.1Слабая память
Хёрст0.55-0.70Умеренная персистентность
Диапазон±30% за периодРеалистичные движения

📊 Дополнительные полезные метрики:

csharp
public static void CalculateAdvancedMetrics(double[] prices)
{
    // 1. Коэффициент Шарпа (доходность/риск)
    double sharpeRatio = CalculateSharpeRatio(prices);
    
    // 2. Асимметрия распределения доходностей
    double skewness = CalculateSkewness(prices);
    
    // 3. Эксцесс (толстые хвосты)
    double kurtosis = CalculateKurtosis(prices);
    
    // 4. Максимальная просадка
    double maxDrawdown = CalculateMaxDrawdown(prices);
    
    // 5. Кластеризация волатильности
    double volClustering = CalculateVolatilityClustering(prices);
}

Вывод: Ваша продвинутая модель показывает наиболее реалистичные характеристики, кроме слишком низкой волатильности! 🎯
----------------------------------------
При расчете волатильности - Какой математический повод использовать логарифмические доходности, а не простые доходности. По своему значению эти величины должны быть близки ?

Отличный вопрос! Давайте разберем математические основания для использования логарифмических доходностей.

1. Математические определения

Простые доходности (Simple Returns):

csharp
double simpleReturn = (price_t - price_{t-1}) / price_{t-1};

Логарифмические доходности (Log Returns):

csharp
double logReturn = Math.Log(price_t / price_{t-1});

2. Математические преимущества логарифмических доходностей

✅ Аддитивность во времени

csharp
// Логарифмические - аддитивны
double logReturn_weekly = logReturn_day1 + logReturn_day2 + logReturn_day3;

// Простые - НЕ аддитивны
double simpleReturn_weekly ≠ simpleReturn_day1 + simpleReturn_day2 + simpleReturn_day3;

Пример:

  • День 1: +10%, День 2: -10%

  • Простые: (1.10 × 0.90) - 1 = -1% (не 0%!)

  • Логарифмические: ln(1.10) + ln(0.90) ≈ 0.0953 - 0.1054 = -0.0101 ≈ -1%

✅ Симметричность распределения

csharp
// Логарифмические доходности примерно нормально распределены
// Простые доходности имеют асимметричное распределение

Математически:

  • Логдоходность: ln(P_t/P_{t-1}) ∈ (-∞, +∞)

  • Простая доходность: (P_t - P_{t-1})/P_{t-1} ∈ [-1, +∞)

✅ Мультипликативность становится аддитивностью

csharp
// Цена: P_t = P_0 × (1+r1) × (1+r2) × ... × (1+rn)
// Логарифмируем: ln(P_t) = ln(P_0) + ln(1+r1) + ln(1+r2) + ... + ln(1+rn)

3. Сравнение на практике

csharp
public class ReturnsComparison
{
    public static void CompareReturns(double[] prices)
    {
        var simpleReturns = new List<double>();
        var logReturns = new List<double>();
        
        for (int i = 1; i < prices.Length; i++)
        {
            double simple = (prices[i] - prices[i-1]) / prices[i-1];
            double logRet = Math.Log(prices[i] / prices[i-1]);
            
            simpleReturns.Add(simple);
            logReturns.Add(logRet);
        }
        
        Console.WriteLine("Сравнение доходностей (%):");
        Console.WriteLine($"Простые: среднее = {simpleReturns.Average()*100:F4}%, stdev = {CalculateStdDev(simpleReturns)*100:F4}%");
        Console.WriteLine($"Логарифмические: среднее = {logReturns.Average()*100:F4}%, stdev = {CalculateStdDev(logReturns)*100:F4}%");
    }
}

4. Когда разница значительна?

csharp
public static void DemonstrateDifference()
{
    // Маленькие изменения - разница незначительна
    double smallPriceChange = 100 * 1.01; // +1%
    double simpleSmall = (101 - 100) / 100;        // 0.01
    double logSmall = Math.Log(101 / 100);         // 0.00995 ≈ 0.01
    
    // Большие изменения - разница заметна
    double bigPriceChange = 100 * 2.00; // +100%
    double simpleBig = (200 - 100) / 100;          // 1.00
    double logBig = Math.Log(200 / 100);           // 0.6931 ≠ 1.00!
    
    Console.WriteLine($"Маленькое изменение: простые = {simpleSmall:F4}, логарифмические = {logSmall:F4}");
    Console.WriteLine($"Большое изменение: простые = {simpleBig:F4}, логарифмические = {logBig:F4}");
}

5. Теоретическое обоснование

Броуновское движение (геометрическое):

text
dS/S = μdt + σdW

Решение:

text
S_t = S_0 × exp((μ - σ²/2)t + σW_t)

Логарифмируем:

text
ln(S_t) = ln(S_0) + (μ - σ²/2)t + σW_t

Волатильность как параметр модели:

csharp
// В модели Блэка-Шоулза волатильность определяется через логдоходности
double volatility = Math.Sqrt(varianceOfLogReturns);

6. Эмпирическая проверка

csharp
public class EmpiricalProof
{
    public static void TestNormality(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)");
    }
    
    private static double CalculateSkewness(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
public class VolatilityComparison
{
    public static (double simpleVol, double logVol) CalculateBothVolatilities(double[] prices)
    {
        // Волатильность из простых доходностей
        var simpleReturns = new List<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 = new List<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. ✅ Статистически предпочтительны - ближе к нормальному распределению

  3. ✅ Временная согласованность - легко агрегировать за разные периоды

  4. ✅ Теоретическое обоснование - основа современных финансовых моделей

Для маленьких изменений (1-2%) разница действительно незначительна, но для больших движений или статистического анализа логарифмические доходности принципиально важны! 📈