25.10.11, DeepSeek, Volatility, Metrcics,
Отличный вопрос! Давайте разберем математические основания для использования логарифмических доходностей.
1. Математические определения
Простые доходности (Simple Returns):
double simpleReturn = (price_t - price_{t-1}) / price_{t-1};Логарифмические доходности (Log Returns):
double logReturn = Math.Log(price_t / price_{t-1});2. Математические преимущества логарифмических доходностей
✅ Аддитивность во времени
// Логарифмические - аддитивны
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%
✅ Симметричность распределения
// Логарифмические доходности примерно нормально распределены
// Простые доходности имеют асимметричное распределениеМатематически:
Логдоходность:
ln(P_t/P_{t-1})∈ (-∞, +∞)Простая доходность:
(P_t - P_{t-1})/P_{t-1}∈ [-1, +∞)
✅ Мультипликативность становится аддитивностью
// Цена: 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. Сравнение на практике
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. Когда разница значительна?
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. Теоретическое обоснование
Броуновское движение (геометрическое):
dS/S = μdt + σdWРешение:
S_t = S_0 × exp((μ - σ²/2)t + σW_t)Логарифмируем:
ln(S_t) = ln(S_0) + (μ - σ²/2)t + σW_tВолатильность как параметр модели:
// В модели Блэка-Шоулза волатильность определяется через логдоходности
double volatility = Math.Sqrt(varianceOfLogReturns);6. Эмпирическая проверка
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. Практические последствия для волатильности
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%) разница действительно незначительна, но для больших движений или статистического анализа логарифмические доходности принципиально важны! 📈
Комментариев нет:
Отправить комментарий