Сравнение методов прогнозирования доходности для портфельной оптимизации Марковица: Historical Mean, AutoARIMA, PatchTST Transformer
Comparison of Return Forecasting Methods for Markowitz Portfolio Optimization: Historical Mean, AutoARIMA, PatchTST Transformer
Автор: Кротов Ю.В. (Iurii Krotov) Дата: Январь 2026 (January 2026)
🇬🇧 English version: README_EN.md
# 1. Установка зависимостей
pip install -r requirements.txt
# 2. Запуск всех моделей
python run_all.pyРезультаты сохраняются в results/.
Применение модели PatchTST Self-Supervised для прогнозирования ожидаемых доходностей в задаче портфельной оптимизации по Марковицу.
Эмпирически проверить гипотезу о том, что замена исторических средних на прогнозы модели PatchTST в качестве оценки ожидаемых доходностей улучшает качество портфеля Марковица.
Классическая задача Марковица - максимизация коэффициента Шарпа:
max (w'μ - r_f) / sqrt(w'Σw)
s.t. Σw_i = 1, w_i >= 0
где:
- w — вектор весов активов
- μ — вектор ожидаемых доходностей (в проекте сравниваются способы оценки)
- Σ — ковариационная матрица доходностей
- r_f — безрисковая ставка (берется из
config/config.yaml)
Все три метода используют одинаковые окна бэктеста:
- Окно обучения:
backtest.train_window(по умолчанию 1260 дней, 5 лет) - Горизонт прогноза:
backtest.test_window(по умолчанию 21 день, 1 месяц)
| Подход | Оценка μ | Описание |
|---|---|---|
| Baseline 1 | mean(r) × 252 | Классический Марковиц (историческое среднее) |
| Baseline 2 | AutoARIMA.mean × 252 | StatsForecast AutoARIMA |
| PatchTST | forecast(21).mean × 252 | Self-Supervised Transformer |
Источник: https://github.com/yuqinie98/PatchTST
- Реализация:
src/models/patchtst_reference/ - Режимы
fast/fullнастраиваются вconfig/config.yaml - Авто-выбор устройства: MPS (macOS) → CUDA → CPU
- Активы: 20 акций из 10 секторов S&P 500 (задаются в
config/config.yaml) - Период: 2010-01-01 — 2025-01-01
- Источник: Yahoo Finance (Adjusted Close)
- Файлы:
data/raw/prices.csv,data/raw/log_returns.csv
Все параметры проекта задаются в config/config.yaml:
data— тикеры и период данныхbacktest— окна обучения и тестаmodels— настройки PatchTST и AutoARIMA (StatsForecast)optimization— безрисковая ставка, метод ковариации, ограничения весовcovariance:sampleилиledoit_wolfgross_exposureиспользуется только приlong_only=false
patchtst-portfolio-optimization/
├── run_all.py # Запуск всех моделей
├── config/config.yaml # Конфигурация эксперимента
├── data/raw/ # Данные (prices, log_returns)
├── src/
│ ├── data/ # Загрузка и предобработка
│ ├── models/
│ │ ├── patchtst.py # PatchTST Self-Supervised
│ │ └── patchtst_reference/ # Reference реализация
│ ├── optimization/
│ │ ├── markowitz.py # Оптимизатор Марковица
│ │ └── covariance.py # Оценка ковариации
│ ├── backtesting/
│ │ ├── backtest.py # Baseline 1 (историческое среднее)
│ │ ├── backtest_statsforecast.py # Baseline 2 (AutoARIMA)
│ │ └── backtest_patchtst.py # PatchTST
│ └── utils/
│ └── forecast_metrics.py # Метрики прогнозов
├── notebooks/
│ └── portfolio_comparison.py # Standalone Python script
├── results/ # Результаты экспериментов
├── LICENSE # MIT лицензия
└── RESULTS.md # Результаты исследования
python3 -m pip install -r requirements.txtpython3 run_all.pyСкрипт спросит:
- нужно ли скачать данные
- какие модели запускать
PatchTST может работать несколько часов. Чтобы процесс продолжал работать после закрытия терминала:
# Запуск в фоне (nohup игнорирует сигнал закрытия терминала)
nohup python3 run_all.py > output.log 2>&1 &
# Просмотр прогресса в реальном времени
tail -f output.log
# Проверить, что процесс работает
ps aux | grep run_all# Baseline 1: Историческое среднее
python3 src/backtesting/backtest.py
# Baseline 2: StatsForecast AutoARIMA
python3 src/backtesting/backtest_statsforecast.py
# PatchTST Self-Supervised
python3 src/backtesting/backtest_patchtst.pyPatchTST — лучший по управлению рисками (минимальная просадка, высокий Calmar):
| Метрика | Baseline 1 | StatsForecast | PatchTST | Лучший |
|---|---|---|---|---|
| Annual Return | 16.08% | 13.26% | 14.07% | Baseline 1 |
| Sharpe Ratio | 0.93 | 0.71 | 0.80 | Baseline 1 |
| Calmar Ratio | 0.66 | 0.64 | 0.90 | PatchTST |
| Max Drawdown | -24.22% | -20.72% | -15.61% | PatchTST |
Анализ весов портфелей показал, что PatchTST:
- Снижает долю волатильных акций (AAPL, MSFT, UNH) в периоды перед кризисами
- Увеличивает долю защитных активов (CVX, PFE, PG, KO)
- Меняет веса в 1.69x чаще, быстрее реагируя на рыночные условия
Пример: в худший период (2022-04-08) PatchTST показал -8.40% против -10.98% у Baseline 1.
Подробный анализ: RESULTS.md
MIT License. См. файл LICENSE.
- PatchTST — архитектура трансформера для временных рядов (Apache 2.0)
- StatsForecast — AutoARIMA реализация
