All Projects → WLM1ke → poptimizer

WLM1ke / poptimizer

Licence: Unlicense License
Оптимизация долгосрочного портфеля акций

Programming Languages

python
139335 projects - #7 most used programming language
go
31211 projects - #10 most used programming language
Makefile
30231 projects

Projects that are alternatives of or similar to poptimizer

okama
Investment portfolio and stocks analyzing tools for Python with free historical data
Stars: ✭ 87 (+11.54%)
Mutual labels:  portfolio-optimization, risk-management
FinancialToolbox.jl
Useful functions for Black–Scholes Model in the Julia Language
Stars: ✭ 31 (-60.26%)
Mutual labels:  risk-management
finam-export
Python client library to download historical data from finam.ru
Stars: ✭ 84 (+7.69%)
Mutual labels:  moex
NautilusCSharp
The open-core for enterprise-grade algorithmic trading infrastructure
Stars: ✭ 16 (-79.49%)
Mutual labels:  risk-management
IDVerification
"Very simple but works well" Computer Vision based ID verification solution provided by LibraX.
Stars: ✭ 44 (-43.59%)
Mutual labels:  risk-management
ProSelfLC-2021
noisy labels; missing labels; semi-supervised learning; entropy; uncertainty; robustness and generalisation.
Stars: ✭ 45 (-42.31%)
Mutual labels:  robust-optimization
EAGO.jl
A development environment for robust and global optimization
Stars: ✭ 106 (+35.9%)
Mutual labels:  robust-optimization
MatrixOptim.jl
Data-Driven Decision Making under Uncertainty in Matrix
Stars: ✭ 20 (-74.36%)
Mutual labels:  robust-optimization
mpc-DL-controller
Deep Neural Network architecture as a predictive optimal controller for {HVAC+Solar cell + battery} disturbance afflicted system vs classic Model Predictive Control
Stars: ✭ 37 (-52.56%)
Mutual labels:  robust-optimization
finance-courses
Notes and examples about Portfolio Construction and Analysis with Python (Jupyter notebooks)
Stars: ✭ 104 (+33.33%)
Mutual labels:  risk-management
collector
⚖Open Source Toolkit for Conducting Quantitative Risk Assessment Interviews
Stars: ✭ 26 (-66.67%)
Mutual labels:  risk-management
RobustGNSS
Robust GNSS Processing With Factor Graphs
Stars: ✭ 98 (+25.64%)
Mutual labels:  robust-optimization
0rsk
Online Risk Manager
Stars: ✭ 18 (-76.92%)
Mutual labels:  risk-management
RISKIM
Assets' Risk Management Using Mean-Variance Opt Based On Mult-Factors Trending Prediction
Stars: ✭ 25 (-67.95%)
Mutual labels:  risk-management
multi-h
The C++ implementation of Multi-H algorithm, which is a multi-plane fitting technique. If you use this work for Academic purposes, please cite Barath, D. and Matas, J. and Hajder, L., Multi-H: Efficient Recovery of Tangent Planes in Stereo Images. 27th British Machine Vision Conference, 2016
Stars: ✭ 29 (-62.82%)
Mutual labels:  robust-optimization
cloud-cap-risk-management
The SAP Risk Management example applications show how to deploy a CAP (SAP Cloud Application Programming model) application to Cloud Foundry and Kyma.
Stars: ✭ 36 (-53.85%)
Mutual labels:  risk-management
EngineX
Engine X - 实时AI智能决策引擎、规则引擎、风控引擎、数据流引擎。 通过可视化界面进行规则配置,无需繁琐开发,节约人力,提升效率,实时监控,减少错误率,随时调整; 支持规则集、评分卡、决策树,名单库管理、机器学习模型、三方数据接入、定制化开发等;
Stars: ✭ 369 (+373.08%)
Mutual labels:  risk-management
adp-portfolio-selection
Approximate Dynamic Programming for Portfolio Selection Problem
Stars: ✭ 29 (-62.82%)
Mutual labels:  portfolio-optimization
evaluator
⚖Open Source Toolkit for Quantitative Risk Assessment
Stars: ✭ 120 (+53.85%)
Mutual labels:  risk-management
Algorithmic-Trading
I have been deeply interested in algorithmic trading and systematic trading algorithms. This Repository contains the code of what I have learnt on the way. It starts form some basic simple statistics and will lead up to complex machine learning algorithms.
Stars: ✭ 47 (-39.74%)
Mutual labels:  portfolio-optimization

Оптимизация долгосрочного портфеля акций

image image

О проекте

По образованию я человек далекий от программирования. Занимаюсь инвестициями с 2008 года. Целью проекта является изучение программирования и автоматизация процесса управления портфелем акций.

Используемый подход не предполагает баснословных доходностей, а нацелен на получение результата чуть лучше рынка при рисках чуть меньше рынка при относительно небольшом обороте. Портфель ценных бумаг должен быть достаточно сбалансированным, чтобы его нестрашно было оставить без наблюдения на продолжительное время.

Большинство частных инвесторов стремиться к быстрому обогащению и, согласно известному афоризму Баффета, "мало кто хочет разбогатеть медленно", поэтому проект является открытым. Стараюсь по возможности исправлять ошибки, выявленные другими пользователями, и буду рад любой помощи от более опытных программистов. Особенно приветствуются вопросы и предложения по усовершенствованию содержательной части подхода к управлению портфелем.

Проект находится в стадии развития и постоянно модифицируется (не всегда удачно), поэтому может быть использован на свой страх и риск.

Основные особенности

Оптимизация портфеля

  • Базируется на Modern portfolio theory
  • При построении портфеля учитывается более 200 акций (включая иностранные) и ETF, обращающихся на MOEX
  • Используется ансамбль моделей для оценки неточности предсказаний ожидаемых доходностей и рисков отдельных активов
  • Используется робастная инкрементальная оптимизация на основе расчета достоверности улучшения метрик портфеля в результате торговли с учетом неточности имеющихся прогнозов вместо классической mean-variance оптимизации
  • Применяется поправка Бонферрони на множественное тестирование с учетом большое количества анализируемых активов

Прогнозирование параметров активов

  • Используются нейронные сети на основе архитектуры WaveNet с большим receptive field для анализа длинных последовательностей котировок
  • Осуществляется совместное прогнозирование ожидаемой доходности и ее дисперсии с помощью подходов, базирующихся на GluonTS: Probabilistic Time Series Models in Python
  • Для моделирования толстых хвостов в распределениях доходностей применяются смеси логнормальных распределений
  • Используются устойчивые оценки исторических корреляционных матриц для большого числа активов с помощью сжатия Ledoit-Wolf

Формирование ансамбля моделей

  • Осуществляется выбор моделей из многомерного пространства гиперпараметров сетей, их оптимизаторов и комбинаций признаков
  • Для исследования пространства применяются подходы алгоритма Имитации отжига
  • Для масштабирования локальной области поиска и кодирования гиперпараметров используются принципы дифференциальной эволюции
  • Для выбора моделей в локальной области применяется распределение Коши для осуществления редких не локальных прыжков в пространстве гиперпараметров
  • При отборе претендентов в ансамбль осуществляется последовательное тестирование с соответствующими корректировками уровней значимости

Источники данных

  • Реализована загрузка котировок всех акций (включая иностранные) и ETF, обращающихся на MOEX
  • Поддерживается в актуальном состоянии база данных дивидендов с 2015г по включенным в анализ акциям
  • Реализована возможность сверки базы данных дивидендов с информацией на сайтах:

Направления дальнейшего развития

  • Применение нелинейного сжатия Ledoit-Wolf для оценки корреляции активов
  • Реализация сервиса на Go для загрузки всей необходимой информации
  • Рефакторинг кода на основе DDD, MyPy и wemake
  • Использование архитектур на основе трансформеров вместо WaveNet
  • Поиск оптимальной архитектуры сетей с помощью эволюции с "нуля" по аналогии с Evolving Neural Networks through Augmenting Topologies
  • Использование Reinforcement learning для построения портфеля

FAQ

Какие инструменты нужны для запуска программы?

Последняя версия MongoDB, MongoDB Database Tools, Python и все зависимости из requirements.txt.

Как запускать программу?

Запуск реализован через CLI:

python3 -m poptimizer

После этого можно посмотреть перечень команд и help к ним, а дальше самому разбираться в коде. Основные команды для запуска описаны в файле __main__.py. Сначала необходимо запустить функцию evolve для обучения моделей. После этого можно запустить optimize для оптимизации портфеля.

У меня появилось сообщение ДАННЫЕ ПО ДИВИДЕНДАМ ТРЕБУЮТ ОБНОВЛЕНИЯ - что делать?

Вся необходимая для работы программы информация обновляется автоматически, кроме данных по дивидендам, которые необходимо обновлять в ручную в базе данных source. После ввода информации необходимо запустить команду dividends для дополнительной сверки с разными внешними источниками данных и перемещения информации в основную рабочую базу data.

Есть ли у программы какие-нибудь настройки?

Настройки описаны в файле config.template. При отсутствии файла конфигурации будут использоваться значения по умолчанию.

Как ввести свой портфель?

Пример заполнения файла с портфеля с базовым набором бумаг содержится в файле base.yaml. В этом каталоге можно хранить множество файлов (например по отдельным брокерским счетам), информация из них будет объединяться в единый портфель. Для работы оптимизатора необходимо наличие хотя бы одной не нулевой позиции по бумагам.

У меня в портфеле не так много бумаг - нулевые значения по множеству позиций как-нибудь влияют на эволюцию?

Для эволюции принципиален перечень бумаг, а не их количество.

У меня в портфеле не так много бумаг - можно оставить только свои?

При желании можно сократить, количество бумаг, но их должно быть не меньше половины из базового набора, чтобы получалось достаточно большое количество обучающих примеров для тренировки моделей.

В моем портфеле есть бумаги, отсутствующие в базовом наборе - можно ли их добавить?

Можно добавить любые акции, включая иностранные, и ETF, обращающиеся на MOEX. Для корректной работы так же может потребоваться дополнить базу по дивидендам, если они выплачивались с 2015 года.

Я добавил новую бумагу, запустил эволюцию и получил ошибки "Удаляю - Слишком большая длинна истории" для всех моделей. В результате вся популяция погибла. Как избежать такой проблемы?

Для обучения модели нужно, чтобы по каждому тикеру был хотя бы один обучающий пример и некоторое количество тестирующий примеров (зависит от количества поколений). Для этого нужна минимальная история длинны котировок порядка history_days + forecast_days. Если истории не хватает, то модель удаляется и выводится указанное сообщение. Когда вы добавляете новый тикер с очень короткой историей, теоретически может погибнуть вся популяция.

Перед добавлением тикеров рекомендуется вызывать метод add_tickers для старого портфеля. В результате будут выведены тикеры (торгуемые на бирже, но еще не включенные в портфель), у которых с некоторым запасом есть минимально необходимая история. Дополнительно отбрасываются совсем малоликвидные с точки зрения размера вашего портфеля бумаги. Если он большой, то отбрасывается больше тикеров. Выбранные бумаги упорядочиваются по возрастанию корреляции - тикеры в начале списка более удачны с точки зрения потенциала снижения рисков.

Бумаги из этого списка относительно безопасно включать в анализ - некоторые модели с очень большим параметром history_days могут погибнуть, но основной костяк будет работать.

Я поменял перечень тикеров и при запуске оптимизации стали выпадать ошибки. Как правильно поменять перечень тикеров?

Для эволюции не важно, когда вы изменили перечень тикеров. Она всегда берет текущий список и тренирует новые модели под него, а модели уже протестированные для текущего дня будут переучены после поступления новых данных по котировкам на следующий день.

Для оптимизатора подходят только модели с соответствующим набором тикеров, поэтому если вы чего-то поменяли сразу после этого не будет моделей, подходящих для оптимизации, что будет вызывать ошибки. Как только эволюция обучит хотя бы две новые модели, оптимизатор сможет работать без ошибок, но этого будет недостаточно для адекватной оптимизации.

Лучше всего менять тикеры после того, как вы поторговали и больше не собираетесь торговать в этот день - тогда у вас будет время на обучение новых моделей под новый набор тикеров, а после 0:45 появятся данные и начнется переобучение старых моделей под новые тикеры. Утром к началу торгов у вас будет какое-то разумное количество моделей актуализированных под новый набор бумаг.

Еще лучше менять перечень тикеров вечером в пятницу, особенно если у вас популяция в несколько сотен моделей, так как на ее переобучение вполне могут уйти все выходные.

Нужно ли запускать оптимизацию портфеля каждый день?

По умолчанию предполагается, что торговля будет осуществляться каждый торговый день. Если вы торгуете реже, поменяйте значение параметра TRADING_INTERVAL, например на 5 для торговли раз в неделю. В большинстве случаев после завершения первичного процесса диверсификации, торговые сигналы будут появляться далеко не каждый день и будут затрагивать небольшую долю портфеля, поэтому даже при дефолтных настройках, торговля не будет отнимать много усилий.

Как рекомендуется исполнять торговые рекомендации?

Оптимизатор использует линейную аппроксимацию для построения рекомендаций. Предполагается, что вы должны совершать небольшие сделки (~1% от стоимости портфеля), потом повторно запускать оптимизатор для уточнения рекомендаций и т.д. пока не останется рекомендаций на продажу. В результате останется одна рекомендация (PENDING) - это лучшая рекомендация на покупку, чтобы было ясно, куда направлять кэш, если он остался после последних операций или внесен на счет.

Рекомендации обычно сохраняются в течении продолжительного времени, поэтому нет большой необходимости пытаться исполнить их за один день, особенно если у вас большой по объему портфель или операции затрагивают малоликвидные бумаги - торгуйте в удобном для вас темпе.

Если у вас на счете по каким-то причинам много кэша (много внесли или случайно продали на большую сумму) сначала покупайте маленькими порциями, пока не снизите его количество.

Что отражают LOWER и UPPER в разделе оптимизация портфеля?

Нижняя и верхняя граница доверительного интервала влияния указанной бумаги на качество портфеля. Если верхняя граница одной бумаги ниже нижней границы второй бумаги, то целесообразно сокращать позицию по первой бумаге и наращивать позицию по второй. При выдаче рекомендаций дополнительно учитывается, что зазор между границами должен покрывать транзакционные издержки.

Особые благодарности

  • Evgeny Pogrebnyak за помощь в освоении Python
  • RomaKoks за полезные советы по автоматизации некоторых этапов работы программы и исправлению ошибок
  • AlexQww за содержательные обсуждения подходов к управлению портфелем, которые стали катализатором множества изменений в программе
Note that the project description data, including the texts, logos, images, and/or trademarks, for each open source project belongs to its rightful owner. If you wish to add or remove any projects, please contact us at [email protected].