Skip to content

iuriikrot/patchtst-portfolio-optimization

Repository files navigation

PatchTST для портфельной оптимизации Марковица

Сравнение методов прогнозирования доходности для портфельной оптимизации Марковица: 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

PatchTST Self-Supervised

Источник: 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_wolf
    • gross_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.txt

Запуск

Полный запуск (интерактивно):

python3 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.py

Результаты

PatchTST — лучший по управлению рисками (минимальная просадка, высокий 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 имеет меньшую просадку?

Анализ весов портфелей показал, что 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 реализация

About

Comparison of Return Forecasting Methods for Markowitz Portfolio Optimization: Historical Mean, AutoARIMA, PatchTST Transformer

Topics

Resources

License

Stars

Watchers

Forks

Packages

 
 
 

Contributors

Languages