Ваше наблюдение о фрактальном поведении цен на графиках, точках разворота (pivot points) и центрах волн с зеркальным движением цены — это не просто воображение. Такие паттерны имеют солидную математическую основу в теории фракталов, применяемой к финансовым рынкам, и активно используются в трейдинге. Давайте разберёмся по порядку.
Математические основания
Фракталы в финансах описывают само-подобие ценовых движений на разных временных масштабах: рынок выглядит похожим на малых (минутных) и больших (дневных или недельных) графиках. Это связано с работами Бенуа Мандельброта, который показал, что финансовые рынки не следуют нормальному распределению (как в классической теории), а демонстрируют фрактальную структуру с долгосрочными зависимостями и хаотичным поведением. Ключевой концепцией здесь является Fractal Market Hypothesis (FMH) — альтернатива гипотезе эффективного рынка. Согласно FMH, рынки фрактальны, потому что инвесторы с разными горизонтами (краткосрочные vs долгосрочные) интерпретируют информацию по-разному, обеспечивая ликвидность и orderly движения цен.
Для измерения фрактальности часто используют Hurst exponent (H) — показатель, который оценивает, насколько временной ряд (цены) является случайным (H=0.5), трендовым (H>0.5) или анти-трендовым (H<0.5). Если H ≠ 0.5, ряд фрактален, и это помогает предсказывать сдвиги в рынках.
Что касается точек разворота (pivot points) и центров волн с зеркальным движением:
- Pivot points рассчитываются как среднее от high, low и close предыдущего периода, определяя уровни поддержки/сопротивления. Цена часто "вращается" вокруг них, отражаясь симметрично.
- Зеркальное движение (mirror movement) описывается концепцией price mirrors по Томасу Булковски: цена может симметрично отражаться относительно воображаемой вертикальной линии через пик или долину. Например, пик слева от линии может иметь зеркальный пик справа на похожем ценовом уровне, формируя паттерны вроде double top или head-and-shoulders. Это помогает предсказывать развороты, но не всегда идеально симметрично и зависит от масштаба графика. Математически это связано с симметрией в ценовых уровнях, без строгих формул, но с визуальным анализом.
Такие паттерны также перекликаются с теорией волн Эллиотта, где волны имеют центры и симметричные коррекции, и с фракталами Уильямса (Bill Williams Fractals) — пятибарными разворотными паттернами, где центральный бар является максимумом/минимумом, а цена "зеркально" реагирует вокруг него.
Готовый код
Есть множество реализаций на Python для анализа фракталов и pivot points. Я приведу простой пример для детекции Williams Fractals (пятибарный паттерн: для восходящего фрактала — низкий low с двумя выше слева и справа; для нисходящего — высокий high с двумя ниже). Код использует pandas и numpy (стандартные библиотеки для анализа данных). Он работает на исторических данных (например, из CSV с колонками 'high' и 'low').
import pandas as pd
import numpy as np
# Пример: загрузка данных (замените на свои данные, например, из Yahoo Finance или CSV)
# df = pd.read_csv('your_price_data.csv')
# Для теста создадим случайные данные
data = {'high': [10, 12, 15, 13, 11, 14, 16, 13, 12, 15, 14, 13],
'low': [8, 9, 10, 8, 7, 9, 11, 10, 9, 8, 7, 6]}
df = pd.DataFrame(data)
# Параметр: период для фрактала (стандартно 2, т.е. 5 баров: 2 слева + центр + 2 справа)
period = 2
# Восходящий фрактал (bullish: low ниже двух слева и двух справа)
df['bull_fractal'] = np.where(
(df['low'] < df['low'].shift(1)) & (df['low'] < df['low'].shift(2)) &
(df['low'] < df['low'].shift(-1)) & (df['low'] < df['low'].shift(-2)),
df['low'], np.nan
)
# Нисходящий фрактал (bearish: high выше двух слева и двух справа)
df['bear_fractal'] = np.where(
(df['high'] > df['high'].shift(1)) & (df['high'] > df['high'].shift(2)) &
(df['high'] > df['high'].shift(-1)) & (df['high'] > df['high'].shift(-2)),
df['high'], np.nan
)
print(df) # Вывод: NaN где нет фрактала, значение где есть
# Для визуализации (используйте matplotlib)
import matplotlib.pyplot as plt
plt.plot(df.index, df['high'], label='High')
plt.plot(df.index, df['low'], label='Low')
plt.scatter(df.index, df['bull_fractal'], color='green', marker='^', label='Bull Fractal')
plt.scatter(df.index, df['bear_fractal'], color='red', marker='v', label='Bear Fractal')
plt.legend()
plt.show()
Этот код проверяет условия для каждого бара и маркирует фракталы. Он основан на формулах из индикатора Уильямса. Для реальных данных загрузите цены (например, через yfinance: pip install yfinance, затем import yfinance as yf; df = yf.download('AAPL')['Adj Close'] — но адаптируйте для high/low).
Альтернативно, для rolling-метода (более гибкий, для большего окна):
# Из примера на Stack Overflow, адаптировано для n=2 (5 баров)
n = 2 # Бар слева/справа
window = 2 * n + 1
df['up_fractal'] = (df['high'] == df['high'].rolling(window, center=True).max())
df['down_fractal'] = (df['low'] == df['low'].rolling(window, center=True).min())
# True где фрактал, False иначе
print(df)
Для Hurst exponent (измерение фрактальности) есть реализации на numpy/scipy. Пример простой функции:
import numpy as np
def hurst_exponent(ts):
"""Простой расчёт Hurst exponent для временного ряда ts (numpy array)."""
lags = range(2, 100)
tau = [np.sqrt(np.std(np.subtract(ts[lag:], ts[:-lag]))) for lag in lags]
poly = np.polyfit(np.log(lags), np.log(tau), 1)
return poly[0] * 2.0 # Hurst = slope * 2
# Пример: ts = df['close'].values
# print(hurst_exponent(ts))
Если H ≈ 0.5 — случайное блуждание; если >0.5 — persistent (трендовое, фрактальное).
Для pivot points: Простая формула в коде:
# Pivot point на основе предыдущего дня
df['pivot'] = (df['high'].shift(1) + df['low'].shift(1) + df['close'].shift(1)) / 3