⚠️ ВНИМАНИЕ: Это краткое введение. Для полного понимания прочитайте полную методологию.
Методология для классификации рыночных состояний (тренд, флэт, аномалия), а не для предсказания точной цены.
Ключевой принцип:
Рынок нельзя предсказать точно, но можно классифицировать его состояние с высокой надёжностью.
Преобразуйте цены в ранги (устойчивость к выбросам):
# Псевдокод
prices = [100, 102, 98, 105, ...]
ranks = rank_normalize(prices, window=20) # Ранги в окне 20 баровЗачем: Устраняет look-ahead bias и устойчиво к крахам.
Преобразуйте одномерный ряд в многомерную траекторию:
# Метод вложения Такенса
tau = 3 # Задержка (дни/бары)
m = 3 # Размерность (3-5, не больше!)
# Точка в фазовом пространстве
P_t = (x_t, x_{t-tau}, x_{t-2*tau})Зачем: Видим структуру, скрытую во временном ряду.
Оцените силу движения:
energy = sum(x_i^2) # Сумма квадратов доходностей
threshold = percentile(energy_history, 80) # 80-й перцентиль за 252 дня
if energy < threshold:
НЕ ТОРГОВАТЬ # Рынок "мёртвый"Зачем: Фильтрует периоды низкой волатильности (80% пользы при 20% усилий).
Сравните текущий вектор с шаблонами:
# Нормализуем вектор к единичной длине
normalized_vector = normalize(current_vector)
# Скалярное произведение с шаблоном
signature = dot_product(normalized_vector, template_trend_long)
if signature > 0.7:
РЕЖИМ: Тренд вверх → Активировать трендовую стратегию
elif signature < -0.7:
РЕЖИМ: Тренд вниз → Активировать short-стратегию
else:
РЕЖИМ: Неопределённость → НЕ ТОРГОВАТЬЗачем: Выбирает подходящую суб-стратегию для текущего режима.
Отслеживайте структурные изменения:
drift = (MA_60(threshold) - Mean_252(threshold)) / Std_252(threshold)
if abs(drift) > 2.0: # 2 стандартных отклонения
STOP ТОРГОВЛЮ # Структурный сломЗачем: Раннее обнаружение кризисов и смены рыночного режима.
import numpy as np
import pandas as pd
# 1. Загрузка данных
prices = pd.read_csv('data.csv')['close']
# 2. Нормализация (ранги)
def rank_normalize(series, window=20):
return series.rolling(window).rank(pct=True) * 2 - 1
normalized = rank_normalize(prices)
# 3. Фазовое пространство (tau=3, m=3)
tau = 3
m = 3
phase_space = []
for i in range(tau * (m-1), len(normalized)):
point = [normalized.iloc[i - j*tau] for j in range(m)]
phase_space.append(point)
# 4. Энергетический фильтр
returns = prices.pct_change()
energy = (returns ** 2).rolling(252).quantile(0.8)
# 5. Классификация (упрощённо)
current_vector = np.array(phase_space[-1])
current_vector = current_vector / np.linalg.norm(current_vector) # Нормализация
trend_template = np.array([1, 1, 1]) / np.sqrt(3) # Шаблон тренда
signature = np.dot(current_vector, trend_template)
# 6. Решение
if energy.iloc[-1] < threshold:
signal = "НЕ ТОРГОВАТЬ (низкая энергия)"
elif signature > 0.7:
signal = "ТРЕНД ВВЕРХ"
elif signature < -0.7:
signal = "ТРЕНД ВНИЗ"
else:
signal = "НЕОПРЕДЕЛЁННОСТЬ"- Минимум 252 дня данных для калибровки порогов
- Walk-Forward валидация на множестве подпериодов
- Тест на суррогатных данных (GARCH/IAAFT) для проверки устойчивости
- Бэктест 252+ дней перед использованием на реальных деньгах
- 30 дней paper trading для проверки исполнения
| ❌ Неправильно | ✅ Правильно |
|---|---|
| MinMax-нормализация | Ранговая нормализация |
| Фиксированные пороги | Перцентили на истории |
| Energy на нормализованных данных | Energy на исходных доходностях |
| Частый пересчёт τ (каждый бар) | Пересчёт τ 1 раз в квартал |
Подробнее: Часть 10. Отсеянные Идеи
-
Прочитайте полную методологию
- Часть 2: Геометрический Анализ (детали фазового пространства)
- Часть 4: Валидация (защита от переобучения)
- Часть 7: Мониторинг (детекция структурных сломов)
-
Изучите чек-лист перед реализацией
-
Ознакомьтесь с типичными ошибками
Реалистичные метрики:
- Sharpe Ratio: 0.5-1.5 (не 5.0!)
- Максимальная просадка: 15-25%
- Win Rate: 45-55%
НЕ ожидайте:
- ❌ 100% прибыль в месяц
- ❌ Работает на всех активах без калибровки
- ❌ Работает без бэктеста и валидации
- GitHub Issues: Задать вопрос
- Полная методология: Методология Геометрического Анализа Рынка.md
- FAQ: Раздел FAQ в README