Skip to content

General Repository name Template repository Loading Template repositories let users generate new repositories with the same directory structure and files. Learn more about template repositories. Require contributors to sign off on web-based commits Loading Enabling this setting will require contributors to sign off on commits made through GitHub’

License

Notifications You must be signed in to change notification settings

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

General Repository name Template repository Loading Template repositories let users generate new repositories with the same directory structure and files. Learn more about template repositories. Require contributors to sign off on web-based commits Loading Enabling this setting will require contributors to sign off on commits made through GitHub’

Topics

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages