WLM1ke / poptimizer

Оптимизация долгосрочного портфеля акций
The Unlicense
151 stars 28 forks source link

Дамп Percentiles must be in the range [0, 100] #91

Closed Snest1 closed 2 years ago

Snest1 commented 2 years ago

Добрый день, Михаил.

На тестовом портфеле стал возникать дамп. Подскажите пож, как с ним бороться.

RUR: 100000 USD: 0 positions: QIWI: 5 FXMM: 10 FXRU: 35 GAZP: 104 SBER: 145

-- lgr.lgr: 2022-01-08 08:58:22.698136 | INFO | Config | config.py | line#46 | pid#2548 | {} 2022-01-08 08:58:23.708614 | INFO | EventBus | thread.py | line#52 | pid#2548 | DateCheckRequired(timestamp=datetime.datetime(2022, 1, 8, 8, 58, 23, 706201)) 2022-01-08 08:58:27.317486 | INFO | root | main.py | line#33 | pid#2548 | ПОРТФЕЛЬ [base] - 2022-01-04

Количество бумаг - 5 Открытых позиций - 5 Эффективных позиций - 3

       LOT_SIZE    SHARES      PRICE     VALUE    WEIGHT       TURNOVER

SBER 10 145.0 304.24 44114.8 0.188128 60465.750212 GAZP 10 104.0 352.55 36665.2 0.156359 83952.855062 FXRU 1 35.0 953.00 33355.0 0.142242 69.284629 FXMM 1 10.0 1728.40 17284.0 0.073708 124.557150 QIWI 1 5.0 615.00 3075.0 0.013113 232.440619 CASH 1 100000.0 1.00 100000.0 0.426450 144844.887673 PORTFOLIO 1 1.0 234494.00 234494.0 1.000000 144844.887673 2022-01-08 08:58:27.492025 | INFO | root | main.py | line#34 | pid#2548 | КЛЮЧЕВЫЕ МЕТРИКИ ПОРТФЕЛЯ

History days - (63 <-> 104 <-> 191) Correlation - (0.47% <-> 1.49% <-> 2.49%) Shrinkage - (8.67% <-> 10.61% <-> 14.96%) Risk aversion - (1.00 <-> 1.00 <-> 1.00) Error tolerance - (0.00 <-> 0.00 <-> 0.01)

           MEAN       STD      BETA     R_ADJ      GRAD

FXMM 0.922696 2.211875 0.297528 1.074571 0.689361 FXRU 0.934053 2.207661 0.341905 1.057338 0.718068 GAZP 0.965154 2.218428 2.478487 0.204596 0.016911 QIWI 0.955321 2.226396 1.248873 0.453727 0.209521 SBER 0.938340 2.218428 2.758477 0.172311 -0.027261 CASH 0.000000 0.000000 0.000000 0.217704 -0.129250 PORTFOLIO 0.543051 0.659848 1.000000 0.235044 0.000000

Консервативная доходность: -43.72% Консервативный риск: 299.60% Консервативная метрика: -127.74% Оценка просадки: 80.18%

--

C:\Python\poptimizer-master_2022_01\poptimizer\portfolio\metrics.py:88: RuntimeWarning: invalid value encountered in matmul portfolio_var = weight.reshape(1, -1) @ cov @ weight.reshape(-1, 1) # noqa: WPS221 C:\Python\poptimizer-master_2022_01\poptimizer\portfolio\metrics.py:100: RuntimeWarning: invalid value encountered in matmul beta = cov @ weight.reshape(-1, 1) --- Logging error --- Traceback (most recent call last): File "C:\Python\Anaconda3\lib\logging\handlers.py", line 73, in emit if self.shouldRollover(record): File "C:\Python\Anaconda3\lib\logging\handlers.py", line 191, in shouldRollover msg = "%s\n" % self.format(record) File "C:\Python\Anaconda3\lib\logging__init.py", line 927, in format return fmt.format(record) File "C:\Python\Anaconda3\lib\logging__init.py", line 663, in format record.message = record.getMessage() File "C:\Python\Anaconda3\lib\logging\init__.py", line 365, in getMessage msg = str(self.msg) File "C:\Python\poptimizer-master_2022_01\poptimizer\portfolio\optimizer_resample.py", line 45, in str df = self._for_trade() File "C:\Python\poptimizer-master_2022_01\poptimizer\portfolio\optimizer_resample.py", line 68, in _for_trade conf_int = self._prepare_bounds() File "C:\Python\poptimizer-master_2022_01\poptimizer\portfolio\optimizer_resample.py", line 114, in _prepare_bounds conf_int = conf_int.apply( File "C:\Users\sn\AppData\Roaming\Python\Python39\site-packages\pandas\core\frame.py", line 8740, in apply return op.apply() File "C:\Users\sn\AppData\Roaming\Python\Python39\site-packages\pandas\core\apply.py", line 688, in apply return self.apply_standard() File "C:\Users\sn\AppData\Roaming\Python\Python39\site-packages\pandas\core\apply.py", line 812, in apply_standard results, res_index = self.apply_series_generator() File "C:\Users\sn\AppData\Roaming\Python\Python39\site-packages\pandas\core\apply.py", line 828, in apply_series_generator results[i] = self.f(v) File "C:\Python\poptimizer-master_2022_01\poptimizer\portfolio\optimizer_resample.py", line 115, in lambda grad: _grad_conf_int(grad, p_value), File "C:\Python\poptimizer-master_2022_01\poptimizer\portfolio\optimizer_resample.py", line 184, in _grad_conf_int interval = stats.bootstrap( File "C:\Users\sn\AppData\Roaming\Python\Python39\site-packages\scipy\stats_bootstrap.py", line 454, in bootstrap ci_l = percentile_fun(theta_hat_b, interval[0]*100) File "C:\Users\sn\AppData\Roaming\Python\Python39\site-packages\scipy\stats_bootstrap.py", line 78, in _percentile_along_axis percentiles[indices] = np.percentile(theta_hat_b_i, alpha_i) File "<__array_function internals>", line 180, in percentile File "C:\Users\sn\AppData\Roaming\Python\Python39\site-packages\numpy\lib\function_base.py", line 4133, in percentile raise ValueError("Percentiles must be in the range [0, 100]") ValueError: Percentiles must be in the range [0, 100] Call stack: File "C:\Python\Anaconda3\lib\runpy.py", line 197, in _run_module_as_main return _run_code(code, main_globals, None, File "C:\Python\Anaconda3\lib\runpy.py", line 87, in _run_code exec(code, run_globals) File "C:\Python\poptimizer-master_2022_01\poptimizer__main.py", line 46, in app(prog_name="poptimizer") File "C:\Users\sn\AppData\Roaming\Python\Python39\site-packages\typer\main.py", line 214, in call return get_command(self)(*args, **kwargs) File "C:\Users\sn\AppData\Roaming\Python\Python39\site-packages\click\core.py", line 1128, in call return self.main(*args, kwargs) File "C:\Users\sn\AppData\Roaming\Python\Python39\site-packages\click\core.py", line 1053, in main rv = self.invoke(ctx) File "C:\Users\sn\AppData\Roaming\Python\Python39\site-packages\click\core.py", line 1659, in invoke return _process_result(sub_ctx.command.invoke(sub_ctx)) File "C:\Users\sn\AppData\Roaming\Python\Python39\site-packages\click\core.py", line 1395, in invoke return ctx.invoke(self.callback, ctx.params) File "C:\Users\sn\AppData\Roaming\Python\Python39\site-packages\click\core.py", line 754, in invoke return callback(args, kwargs) File "C:\Users\sn\AppData\Roaming\Python\Python39\site-packages\typer\main.py", line 500, in wrapper return callback(use_params) # type: ignore File "C:\Python\poptimizer-master_2022_01\poptimizer__main.py", line 35, in optimize LOGGER.info(opt) Message: <poptimizer.portfolio.optimizer_resample.Optimizer object at 0x000000062D81AA60> Arguments: () --- Logging error --- Traceback (most recent call last): File "C:\Python\Anaconda3\lib\logging__init.py", line 1083, in emit msg = self.format(record) File "C:\Python\Anaconda3\lib\logging\init.py", line 927, in format return fmt.format(record) File "C:\Python\Anaconda3\lib\logging\init.py", line 663, in format record.message = record.getMessage() File "C:\Python\Anaconda3\lib\logging\init__.py", line 365, in getMessage msg = str(self.msg) File "C:\Python\poptimizer-master_2022_01\poptimizer\portfolio\optimizer_resample.py", line 45, in str__ df = self._for_trade() File "C:\Python\poptimizer-master_2022_01\poptimizer\portfolio\optimizer_resample.py", line 68, in _for_trade conf_int = self._prepare_bounds() File "C:\Python\poptimizer-master_2022_01\poptimizer\portfolio\optimizer_resample.py", line 114, in _prepare_bounds conf_int = conf_int.apply( File "C:\Users\sn\AppData\Roaming\Python\Python39\site-packages\pandas\core\frame.py", line 8740, in apply return op.apply() File "C:\Users\sn\AppData\Roaming\Python\Python39\site-packages\pandas\core\apply.py", line 688, in apply return self.apply_standard() File "C:\Users\sn\AppData\Roaming\Python\Python39\site-packages\pandas\core\apply.py", line 812, in apply_standard results, res_index = self.apply_series_generator() File "C:\Users\sn\AppData\Roaming\Python\Python39\site-packages\pandas\core\apply.py", line 828, in apply_series_generator results[i] = self.f(v) File "C:\Python\poptimizer-master_2022_01\poptimizer\portfolio\optimizer_resample.py", line 115, in lambda grad: _grad_conf_int(grad, p_value), File "C:\Python\poptimizer-master_2022_01\poptimizer\portfolio\optimizer_resample.py", line 184, in _grad_conf_int interval = stats.bootstrap( File "C:\Users\sn\AppData\Roaming\Python\Python39\site-packages\scipy\stats_bootstrap.py", line 454, in bootstrap ci_l = percentile_fun(theta_hat_b, interval[0]100) File "C:\Users\sn\AppData\Roaming\Python\Python39\site-packages\scipy\stats_bootstrap.py", line 78, in _percentile_along_axis percentiles[indices] = np.percentile(theta_hat_b_i, alpha_i) File "<__array_function__ internals>", line 180, in percentile File "C:\Users\sn\AppData\Roaming\Python\Python39\site-packages\numpy\lib\function_base.py", line 4133, in percentile raise ValueError("Percentiles must be in the range [0, 100]") ValueError: Percentiles must be in the range [0, 100] Call stack: File "C:\Python\Anaconda3\lib\runpy.py", line 197, in _run_module_as_main return _run_code(code, main_globals, None, File "C:\Python\Anaconda3\lib\runpy.py", line 87, in _run_code exec(code, run_globals) File "C:\Python\poptimizer-master_2022_01\poptimizer__main.py", line 46, in app(prog_name="poptimizer") File "C:\Users\sn\AppData\Roaming\Python\Python39\site-packages\typer\main.py", line 214, in call return get_command(self)(*args, **kwargs) File "C:\Users\sn\AppData\Roaming\Python\Python39\site-packages\click\core.py", line 1128, in call return self.main(*args, kwargs) File "C:\Users\sn\AppData\Roaming\Python\Python39\site-packages\click\core.py", line 1053, in main rv = self.invoke(ctx) File "C:\Users\sn\AppData\Roaming\Python\Python39\site-packages\click\core.py", line 1659, in invoke return _process_result(sub_ctx.command.invoke(sub_ctx)) File "C:\Users\sn\AppData\Roaming\Python\Python39\site-packages\click\core.py", line 1395, in invoke return ctx.invoke(self.callback, ctx.params) File "C:\Users\sn\AppData\Roaming\Python\Python39\site-packages\click\core.py", line 754, in invoke return callback(*args, kwargs) File "C:\Users\sn\AppData\Roaming\Python\Python39\site-packages\typer\main.py", line 500, in wrapper return callback(use_params) # type: ignore File "C:\Python\poptimizer-master_2022_01\poptimizer__main__.py", line 35, in optimize LOGGER.info(opt) Message: <poptimizer.portfolio.optimizer_resample.Optimizer object at 0x000000062D81AA60> Arguments: ()

WLM1ke commented 2 years ago

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

Желательно тренировать на полном списке бумаг из https://github.com/WLM1ke/poptimizer/blob/master/portfolio/base.yaml.

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

Snest1 commented 2 years ago

Спасибо, Михаил!

Перед запуском на настоящем портфеле (50+ бумаг), я хотел посмотреть работу алгоритма на небольшом портфеле (ведь алгоритм пока для меня - "черный ящик"), чтобы: 1) эволюция прошла быстрее 2) изменив кол-во одной бумаги посмотреть и оценить предлагаемые изменения небольшого кол-ва других бумаг в портфеле. 3) прогнать это на истории.

В целом, это удалось сделать на таком небольшом портфеле за период 2020-02-11 - 2020-04-29 (т.е. вошел период мартовского падения на COVID), запуская в качестве параметра poptimizer optimize: positions: FXRU: 50 GAZP: 104 SBER: 100

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

На более ранние даты (например январь 2020) оптимизация не запускается, почему-то.

Подскажите пож, "кол-во обучающих примеров" это кол-во строк в коллекции models? Или как их узнать?

Верно ли понимаю, что evolve можно остановить (прервать через Ctrl-C), чтобы например перезапустить компьютер, и затем запустить заново. При этом потеряется только небольшая часть работы, а после перезапуска обучение будет продолжено.

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

При добавлении новой или удалении имеющейся бумаги из портфеля эволюцию нужно запускать заново? Базу при этом нужно очистить? А если не очищать, то ее содержимое (предыдущее обучение) как-то поможет?

Я пробовал добавлять FXMM - доэволюция (до возможности запустить оптимизацию портфеля) прошла очень быстро (возможно потому что FXMM - простой график). А если новый актив сильно раскореллирован с остальным портфелем, может быть будет лучше пересобрать обучение с нуля удалив базу?

MongoDB у Вас запущена в режиме WiredTiger (по умолчанию сейчас так устанавливается)? Но тогда db_recover из makefile не работает, т.к. ему мешает WiredTiger-формат базы. Видимо нужно будет использовать тулзу от WiredTiger. Часто ли Вам приходится восстанавливать базу? Может быть стоит ее бакапить?

Простите, что много вопросов. Интересный софт Вы написали. Спасибо, что делитесь!!!

WLM1ke commented 2 years ago

Подскажите пож, "кол-во обучающих примеров" это кол-во строк в коллекции models? Или как их узнать?

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

Претендент: LLH — 2.5843: 2.7710, 2.7138, 2.6980, 2.7488, 2.6457, 2.6196, 2.5967, 2.6089, 2.5843, 2.5809, 2.5785, 2.6134, 2.5500, 2.5383, 2.5361, 2.3821, 2.3710, 2.2696, 2.4073 RET — -0.0146: 0.3573, 0.4886, 0.2477, 0.2096, -0.1925, -0.1198, -0.1839, -0.2686, -0.0544, -0.0362, 0.0589, -0.0040, 0.0055, -0.0079, -0.0146, -0.0491, -0.0133, -0.0634, -0.0184 Timer — 0:19:14 / Scores - 19 Data: {'batch_size': 223.95920744901318, 'history_days': 120.37153994518748, 'ticker_on': -167.38210945856875, 'day_of_year_on': -33.497317012108304, 'day_of_period_on': 264893.4719299377, 'prices_on': 62.790838783514914, 'dividends_on': -9.229844780438503, 'turnover_on': 18.414952248374377, 'average_turnover_on': -54.85028895922533, 'rvi_on': 12196.55005572156, 'mcftrr_on': 10223.055184323412, 'imoex_on': 124.21755996393007, 'ticker_type_on': 222.31749957788068, 'usd_on': 49.902026691443844, 'open_on': -3424.59425731957, 'high_on': 10.246049624536315, 'low_on': 1007629.8010463141, 'meogtrr_on': -158.81552423365414} Model: {'start_bn': 2.9769229091137923, 'kernels': 6.440899485339471, 'sub_blocks': 2.692456497715935, 'gate_channels': 60.22428453571104, 'residual_channels': 22.146668701115466, 'skip_channels': 10.788096578308352, 'end_channels': 609.3945439193612, 'mixture_size': 67.02984513282318} Optimizer: {'betas': 0.9971197138207432, 'eps': 3.7393199337703977e-07, 'weight_decay': 0.127272149583409} Scheduler: {'max_lr': 0.002374405832893163, 'epochs': 1.6901001431554479, 'pct_start': 0.22295459678089688, 'anneal_strategy': 95.39973209990092, 'base_momentum': 0.9333919624055524, 'max_momentum': 0.9523958741230867, 'div_factor': 1717.4586026826823, 'final_div_factor': 4900707.666862359} Utility: {'risk_aversion': 0.9179614045972763, 'error_tolerance': 1.0114484856909736}

Epochs - 1.69 / Train size - 215701 Количество слоев / параметров - 119 / 383249

WLM1ke commented 2 years ago

Верно ли понимаю, что evolve можно остановить (прервать через Ctrl-C), чтобы например перезапустить компьютер, и затем запустить заново. При этом потеряется только небольшая часть работы, а после перезапуска обучение будет продолжено.

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

Второй вариант, реализовал один пользователь - можно в конфиге указать часы между которыми будет осуществляться тренировка (START_EVOLVE_HOUR и STOP_EVOLVE_HOUR). Он запускает ночью. https://github.com/WLM1ke/poptimizer/blob/master/config/config.template

WLM1ke commented 2 years ago

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

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

То как часто вы оптимизируете портфель задается в конфиге (TRADING_INTERVAL) - по умолчанию каждый день. Обычно поле первичной оптимизации портфель стабилизируется, и торговые сигналы появляются далеко не каждый день.

WLM1ke commented 2 years ago

При добавлении новой или удалении имеющейся бумаги из портфеля эволюцию нужно запускать заново? Базу при этом нужно очистить? А если не очищать, то ее содержимое (предыдущее обучение) как-то поможет?

Модели привязаны к конкретным тикерам (используют эмбединги каждого тикера), поэтому нужно их переобучить после изменения перечня тикеров. Ничего удалять не нужно - модели которые работали хорошо раньше обычно хорошо работают на других тикерах, просто им нужно переобучиться.

WLM1ke commented 2 years ago

Я пробовал добавлять FXMM - доэволюция (до возможности запустить оптимизацию портфеля) прошла очень быстро (возможно потому что FXMM - простой график). А если новый актив сильно раскореллирован с остальным портфелем, может быть будет лучше пересобрать обучение с нуля удалив базу?

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

Как писал выше, удалять базу нет необходимости, и даже в некотором смысле вредно - хорошие модели получаются после длительно периода эволюции, а так вы будете всегда начинать с крайне примитивных заведомо неработающих моделей и никогда не получите сколько-нибудь приемлемые по качеству. Вот например ваши модели выдают STD 2.211875, то есть 221% - такой волатильности небыли на рынке даже в 2008 году. Это совершенно неадекватные цифры, говорящие о том, что эволюция пока не нашла нормальных моделей.

WLM1ke commented 2 years ago

MongoDB у Вас запущена в режиме WiredTiger (по умолчанию сейчас так устанавливается)? Но тогда db_recover из makefile не работает, т.к. ему мешает WiredTiger-формат базы. Видимо нужно будет использовать тулзу от WiredTiger. Часто ли Вам приходится восстанавливать базу? Может быть стоит ее бакапить?

У меня все работает. Вы судя по всему запускаете на Windows + не очень понятно какую версию MongoDB - я сижу на Mac на последней версии MongoDB 5.0.4. Насколько я знаю WiredTiger дефолтный движок уже достаточно давно и все инструменты заточены под него. Возможно у вас очень старая версия MongoDB или какие-то особенности Windows.

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

Snest1 commented 2 years ago

Добрый день, Михаил. Спасибо за ответы!!!

Ранее я пробовал запустить poptimizer на windows, там приходилось пройти некоторые ухищрения. Чтобы быть уверенным, что "неродная" OS и мои изменения не нарушили алгоритм, установил пакет без изменений на ubuntu. Подскажите пожалуйста, если за 4 суток эволюции получаем такую популяцию моделей:

2022-01-31 17:34:25.279770 | INFO | root | evolve.py | line#57 | pid#91385 | 2022-01-28: Шаг эволюции — 254 2022-01-31 17:34:25.293010 | INFO | root | population.py | line#336 | pid#91385 | LLH - (2.1573, 2.3990, 2.4819) 2022-01-31 17:34:25.309204 | INFO | root | population.py | line#336 | pid#91385 | RET - (-0.7436, -0.2473, 0.5025) 2022-01-31 17:34:25.314340 | INFO | root | population.py | line#355 | pid#91385 | Организмов - 197 / Максимум оценок - 14 / Поколений - 3 2022-01-31 17:34:25.314931 | INFO | root | evolve.py | line#62 | pid#91385 | Scale - 1.12% / Jump - 25.00%

2022-01-31 17:34:25.315146 | INFO | root | evolve.py | line#116 | pid#91385 | Родитель: 2022-01-31 17:34:25.316108 | INFO | root | evolve.py | line#157 | pid#91385 | LLH — 2.3705: 2.3469, 2.3258, 2.2108, 2.1676, 2.2028, 2.3992, 2.4516, 2.4211, 2.3705, 2.5041, 2.4541, 2.3820, 2.3338 RET — 0.0442: -0.1116, -0.2479, -0.2236, -0.6844, -0.3447, 0.0442, 0.2835, 0.2967, -0.0239, 0.0623, 0.3858, 0.5236, 0.5448 Timer — 0:02:08 / Scores - 13 Data: {'batch_size': 4112.803074261458, 'history_days': 71.22418638657555, 'ticker_on': 1854.1607899448434, 'day_of_year_on': -107.6288623733743, 'day_of_period_on': -498.27127178892414, 'prices_on': -92.51426717673179, 'dividends_on': -4.418499858495391, 'turnover_on': 16164.69834870362, 'average_turnover_on': -148.35547943171787, 'rvi_on': 52.934894664623606, 'mcftrr_on': 391.1531474204526, 'imoex_on': -16.627645523044063, 'ticker_type_on': -1025.8211490022616, 'usd_on': -63603.97565990107, 'open_on': 10.330443952417973, 'high_on': -455456.2526722949, 'low_on': -28031.660972975133, 'meogtrr_on': -38.09751527564894} Model: {'start_bn': -0.8898074247315338, 'kernels': 133.26210482176532, 'sub_blocks': 1.6322217312228953, 'gate_channels': 10.61653648347372, 'residual_channels': 1.4205366944971058, 'skip_channels': 5.785817121814853, 'end_channels': 87.11712857643406, 'mixture_size': 1467.4025520082453} Optimizer: {'betas': 0.9984966431845798, 'eps': 3.1383076151588003e-06, 'weight_decay': 3.087669411190426} Scheduler: {'max_lr': 0.0007739419412023213, 'epochs': 0.7934286794855593, 'pct_start': 0.14564406341032074, 'anneal_strategy': -199.87963850114383, 'base_momentum': 0.839958534862976, 'max_momentum': 0.9624635754356247, 'div_factor': 11433.5008464971, 'final_div_factor': 28100.842857725518} Utility: {'risk_aversion': 0.9999870478377888, 'error_tolerance': 3.331284814582118e-05}

2022-01-31 17:34:25.328379 | INFO | root | evolve.py | line#203 | pid#91385 | LLH worst difference: median - 0.0109, upper - 0.1464, max - 0.1483 2022-01-31 17:34:25.339071 | INFO | root | evolve.py | line#203 | pid#91385 | RET worst difference: median - -0.0556, upper - 0.4253, max - 0.4430 2022-01-31 17:34:25.343587 | INFO | root | evolve.py | line#219 | pid#91385 | Margin - 88.45%, Time excess - 0.00%

2022-01-31 17:34:25.365933 | INFO | root | evolve.py | line#124 | pid#91385 | Претендент - новый организм: 2022-01-31 17:34:25.367234 | INFO | root | evolve.py | line#157 | pid#91385 | LLH — - RET — - Timer — 0:00:00 / Scores - 0 Data: {'batch_size': 4118.40567265869, 'history_days': 71.22023864477579, 'ticker_on': 1853.9483980128325, 'day_of_year_on': -107.6080559066648, 'day_of_period_on': -498.24715324326223, 'prices_on': -92.45711009658385, 'dividends_on': -4.553497942484536, 'turnover_on': 16217.716920093622, 'average_turnover_on': -145.02678350049905, 'rvi_on': 55.82710580818965, 'mcftrr_on': 390.98229689006683, 'imoex_on': -16.62853220878318, 'ticker_type_on': -1026.2314561693286, 'usd_on': -63600.448274793256, 'open_on': 10.450419403036678, 'high_on': -455491.18256536627, 'low_on': -28030.661991427634, 'meogtrr_on': -38.09686420423233} Model: {'start_bn': -0.8898112634632845, 'kernels': 132.72971666422973, 'sub_blocks': 1.6323956899995387, 'gate_channels': 10.62511997497177, 'residual_channels': 1.4461856079580229, 'skip_channels': 5.785670774014667, 'end_channels': 87.12228114953744, 'mixture_size': 1466.3187805403463} Optimizer: {'betas': 0.9984967359674854, 'eps': 3.1382600770642767e-06, 'weight_decay': 3.0678698268744378} Scheduler: {'max_lr': 0.0008180624256920176, 'epochs': 0.7933403796231194, 'pct_start': 0.14585018734328045, 'anneal_strategy': -199.60895447042702, 'base_momentum': 0.8398158391817853, 'max_momentum': 0.9625062333926325, 'div_factor': 11411.07201837605, 'final_div_factor': 28069.564643646456} Utility: {'risk_aversion': 0.9999870473599265, 'error_tolerance': 3.349017537263465e-05}

2022-01-31 17:34:25.371958 | INFO | EventBus | thread.py | line#52 | pid#91385 | DateCheckRequired(timestamp=datetime.datetime(2022, 1, 31, 17, 34, 25, 370147)) 2022-01-31 17:34:52.361354 | INFO | root | model.py | line#244 | pid#91385 | Epochs - 0.79 / Train size - 230323 2022-01-31 17:34:52.362119 | INFO | root | model.py | line#247 | pid#91385 | Количество слоев / параметров - 83 / 406561 2022-01-31 17:36:25.864460 | INFO | root | model.py | line#372 | pid#91385 | RET = 63.25% / MEAN = 64.97% / PLAN = 67.20% / STD = 252.04% / DD = 945.26% / POS = 174 / MAX = 0.69% 2022-01-31 17:36:45.155244 | INFO | root | model.py | line#372 | pid#91385 | RET = 56.74% / MEAN = 53.81% / PLAN = 70.33% / STD = 186.04% / DD = 492.09% / POS = 163 / MAX = 0.76% 2022-01-31 17:37:04.326849 | INFO | root | model.py | line#372 | pid#91385 | RET = 29.75% / MEAN = 26.70% / PLAN = 72.62% / STD = 245.11% / DD = 827.30% / POS = 179 / MAX = 0.68% 2022-01-31 17:37:23.537473 | INFO | root | model.py | line#372 | pid#91385 | RET = 8.07% / MEAN = 2.00% / PLAN = 73.74% / STD = 214.47% / DD = 623.77% / POS = 171 / MAX = 0.71% 2022-01-31 17:37:42.855411 | INFO | root | model.py | line#372 | pid#91385 | RET = -11.57% / MEAN = -25.71% / PLAN = 76.24% / STD = 124.81% / DD = 204.30% / POS = 156 / MAX = 0.84% 2022-01-31 17:38:01.845140 | INFO | root | model.py | line#372 | pid#91385 | RET = 7.92% / MEAN = -1.40% / PLAN = 72.14% / STD = 169.07% / DD = 396.23% / POS = 169 / MAX = 0.73% 2022-01-31 17:38:20.829680 | INFO | root | model.py | line#372 | pid#91385 | RET = -2.56% / MEAN = -12.23% / PLAN = 74.00% / STD = 139.55% / DD = 263.16% / POS = 163 / MAX = 0.81% 2022-01-31 17:38:39.589573 | INFO | root | model.py | line#372 | pid#91385 | RET = -25.16% / MEAN = -32.80% / PLAN = 73.13% / STD = 189.89% / DD = 493.10% / POS = 181 / MAX = 0.69% 2022-01-31 17:38:59.391750 | INFO | root | model.py | line#372 | pid#91385 | RET = -57.42% / MEAN = -66.92% / PLAN = 73.96% / STD = 189.33% / DD = 484.63% / POS = 180 / MAX = 0.69% 2022-01-31 17:39:18.463530 | INFO | root | model.py | line#372 | pid#91385 | RET = -53.50% / MEAN = -60.89% / PLAN = 78.38% / STD = 206.89% / DD = 546.16% / POS = 191 / MAX = 0.61% 2022-01-31 17:39:37.857284 | INFO | root | model.py | line#372 | pid#91385 | RET = -50.83% / MEAN = -60.38% / PLAN = 74.44% / STD = 183.67% / DD = 453.19% / POS = 181 / MAX = 0.68% 2022-01-31 17:39:57.155326 | INFO | root | model.py | line#372 | pid#91385 | RET = -47.53% / MEAN = -57.47% / PLAN = 76.78% / STD = 112.19% / DD = 163.94% / POS = 148 / MAX = 0.94% 2022-01-31 17:40:18.768366 | INFO | root | model.py | line#372 | pid#91385 | RET = -45.45% / MEAN = -54.67% / PLAN = 76.47% / STD = 141.42% / DD = 261.56% / POS = 162 / MAX = 0.78% 2022-01-31 17:40:18.787386 | INFO | root | evolve.py | line#203 | pid#91385 | LLH worst difference: median - -0.0916, upper - 0.0156, max - 0.0219 2022-01-31 17:40:18.803855 | INFO | root | evolve.py | line#203 | pid#91385 | RET worst difference: median - -0.0866, upper - 0.2168, max - 0.2341 2022-01-31 17:40:18.812931 | INFO | root | evolve.py | line#219 | pid#91385 | Margin - 14.55%, Time excess - 0.00%

2022-01-31 17:40:18.813318 | INFO | root | evolve.py | line#144 | pid#91385 | Старый родитель - delta=-73.90% < -25.00%

и оптимизатор с Forecasts: 192it выдает такой результат (см. ниже), можно предположить, что что-то пошло не так? Отклонения у всех гигантские и почти одинаковые. Вижу, что Вы внесли исправления в код эволюции, может быть необходимо обновиться и начать эволюцию заново, или я тороплюсь и надо дать эволюции еще время?

Количество бумаг - 212 Открытых позиций - 45 Эффективных позиций - 32 ... КЛЮЧЕВЫЕ МЕТРИКИ ПОРТФЕЛЯ

History days - (65 <-> 100 <-> 203) Correlation - (10.98% <-> 14.28% <-> 17.92%) Shrinkage - (30.68% <-> 34.35% <-> 36.75%) Risk aversion - (1.00 <-> 1.00 <-> 1.00) Error tolerance - (0.00 <-> 0.00 <-> 0.00)

           MEAN       STD      BETA     R_ADJ      GRAD

AAL-RM 0.369822 0.730522 0.227765 0.429654 0.136512 AAPL-RM 0.372388 0.742289 0.185938 0.431346 0.137509 ABBV-RM 0.376599 0.743751 -0.089922 0.466668 0.192827 ABRD 0.372552 0.714352 0.338713 0.391975 0.118923 ABT-RM 0.373614 0.737370 -0.069237 0.467186 0.187589 ADBE-RM 0.371088 0.726325 0.044481 0.452589 0.157680 AFKS 0.370088 0.723822 1.233811 0.233415 0.001064 AFLT 0.372279 0.727999 1.105885 0.254317 0.016351 AGRO 0.371309 0.711389 0.915109 0.282678 0.036675 AKRN 0.374166 0.726359 0.604393 0.359005 0.086299 ALRS 0.369111 0.716937 1.092691 0.243945 0.014984 AMD-RM 0.369641 0.740962 0.409635 0.385073 0.119053 AMEZ 0.375375 0.731039 0.401249 0.384706 0.111127 AMZN-RM 0.373481 0.728776 0.142125 0.429447 0.149859 APTK 0.371697 0.711841 0.362097 0.390774 0.121202 AQUA 0.370196 0.736694 0.597374 0.348313 0.086868 ATVI-RM 0.369916 0.751019 -0.273376 0.493920 0.207048 AVGO-RM 0.372143 0.734081 0.320198 0.399153 0.124567 BA-RM 0.374137 0.728563 0.351263 0.402029 0.114765 BABA-RM 0.375957 0.742693 0.402576 0.388695 0.112777 BANE 0.368345 0.712763 0.971382 0.273692 0.032036 BANEP 0.370567 0.717123 1.105127 0.250533 0.014342 BELU 0.368968 0.729451 0.822563 0.297737 0.050612 BIDU-RM 0.372771 0.735842 0.529719 0.366458 0.099921 BIIB-RM 0.377947 0.747857 -0.058625 0.466524 0.178003 BMY-RM 0.373399 0.736801 -0.075020 0.474708 0.184997 BRZL 0.377675 0.724073 0.686889 0.312920 0.065712 BSPB 0.369684 0.715319 1.030272 0.268192 0.024953 CAT-RM 0.370357 0.725168 0.139312 0.430727 0.143299 CBOM 0.371475 0.717868 1.263380 0.229440 -0.003211 CHMF 0.371053 0.726060 1.068942 0.244735 0.018440 CHMK 0.377997 0.728110 0.819929 0.296861 0.050315 CMCSA-RM 0.379908 0.726556 0.228248 0.419856 0.135648 CNTL 0.377997 0.726480 0.501259 0.372949 0.096707 CNTLP 0.377997 0.737852 0.622229 0.353570 0.082502 CRM-RM 0.369840 0.727943 0.134765 0.427215 0.147618 CSCO-RM 0.372235 0.737192 0.193773 0.423489 0.140099 CVX-RM 0.368859 0.727994 0.341799 0.396522 0.122601 DIOD 0.372798 0.728067 0.441932 0.368193 0.100730 DIS-RM 0.375010 0.726197 0.131665 0.419008 0.142059 DSKY 0.370252 0.714621 0.854880 0.287193 0.046651 EA-RM 0.376657 0.740668 0.117797 0.443305 0.152392 EBAY-RM 0.373252 0.737972 0.111398 0.448432 0.148727 ENPG 0.372600 0.727987 0.979330 0.273847 0.031208 ENRU 0.370580 0.728080 0.962656 0.277378 0.031464 ETLN 0.369591 0.720284 0.894251 0.283739 0.040645 F-RM 0.373446 0.751516 0.331514 0.408352 0.131820 FB-RM 0.376122 0.728142 0.197714 0.420568 0.138293 FDX-RM 0.374072 0.747434 0.083021 0.444979 0.156978 FEES 0.372714 0.707214 1.213852 0.240090 0.005721 FESH 0.377646 0.735254 0.488224 0.366957 0.102192 FIVE 0.370182 0.721572 1.018577 0.265573 0.024934 FLOT 0.370222 0.716383 0.689843 0.321550 0.065991 FXCN 0.368650 0.713142 0.518504 0.364052 0.092380 FXGD 0.368693 0.708598 -0.094879 0.468408 0.170886 FXIT 0.371809 0.721103 0.299006 0.400674 0.124912 FXKZ 0.370517 0.723148 0.461139 0.368222 0.102000 FXMM 0.370040 0.722143 -0.059138 0.463769 0.168179 FXRB 0.365745 0.715378 0.745330 0.316227 0.056727 FXRU 0.368694 0.712249 -0.242335 0.485737 0.200544 GAZP 0.373123 0.717238 1.373124 0.220603 -0.012647 GCHE 0.368822 0.713104 0.792585 0.299687 0.052706 GE-RM 0.376725 0.725211 0.231508 0.413937 0.128649 GEMA 0.371823 0.737589 0.543145 0.356725 0.090614 GLTR 0.372817 0.727881 0.997436 0.276335 0.031159 GM-RM 0.370787 0.734972 0.414238 0.389036 0.112622 GMKN 0.372221 0.716532 1.278358 0.224008 -0.003059 GOOG-RM 0.374843 0.725331 0.411058 0.384752 0.107826 GPS-RM 0.376153 0.725166 0.161966 0.425682 0.137349 GTRK 0.376076 0.730369 0.719870 0.313850 0.065555 HHRU 0.374432 0.728256 0.668971 0.319504 0.075952 HIMCP 0.377915 0.729222 0.655405 0.320103 0.071560 HPQ-RM 0.373976 0.745962 0.330734 0.406768 0.124247 HYDR 0.368793 0.712180 1.113307 0.252245 0.014117 IBM-RM 0.372814 0.730812 0.154566 0.424991 0.145179 INGR 0.369760 0.733840 0.987619 0.287883 0.030687 INTC-RM 0.371500 0.734152 0.179997 0.423255 0.137658 IRAO 0.372189 0.713980 1.256518 0.234737 -0.002333 IRKT 0.377997 0.729934 0.794620 0.307438 0.054093 ISKJ 0.371009 0.729874 0.452363 0.382697 0.112793 JNJ-RM 0.370900 0.735222 0.045318 0.442015 0.162418 KAZT 0.369337 0.713575 0.706114 0.308633 0.060137 KHC-RM 0.373375 0.724386 0.057635 0.440168 0.160571 KLSB 0.377997 0.728073 0.458710 0.376363 0.103874 KMAZ 0.368826 0.715149 0.610331 0.322156 0.079040 KO-RM 0.371711 0.740831 -0.115282 0.466240 0.186139 KRKNP 0.372827 0.724618 1.075591 0.275539 0.023354 KZOS 0.371434 0.720637 0.689276 0.320219 0.067714 LIFE 0.372298 0.728085 0.604010 0.330154 0.080840 LKOH 0.371803 0.716732 1.332169 0.222037 -0.008135 LNTA 0.369515 0.720719 0.972863 0.271047 0.032873 LNZL 0.376970 0.725984 0.100457 0.422161 0.142682 LNZLP 0.377997 0.729181 0.160512 0.389281 0.125614 LSNG 0.373002 0.731762 0.473635 0.364061 0.100782 LSNGP 0.378736 0.726343 0.838746 0.307785 0.053379 LSRG 0.370487 0.707704 0.505122 0.364842 0.088835 MA-RM 0.377322 0.733605 0.422707 0.387711 0.111202 MAGN 0.371434 0.726069 1.037715 0.256747 0.023544 MCD-RM 0.377997 0.739127 0.208532 0.429861 0.142887 MDMG 0.372172 0.728156 0.928758 0.284395 0.038120 MGNT 0.372135 0.724605 1.043951 0.250684 0.023009 MGTSP 0.373929 0.726095 0.608600 0.350779 0.082553 MOEX 0.370992 0.721720 1.121559 0.242930 0.012925 MRKC 0.372457 0.718090 1.132479 0.261107 0.013052 MRKP 0.370219 0.723593 0.983905 0.278730 0.033942 MRKS 0.378203 0.745313 0.465236 0.379172 0.112792 MRKU 0.377971 0.716969 0.551794 0.351012 0.085778 MRKV 0.369133 0.728000 0.865177 0.296285 0.049249 MRKY 0.378452 0.725618 0.522569 0.366808 0.093523 MRKZ 0.377997 0.728238 0.698460 0.322220 0.071263 MRNA-RM 0.373240 0.737127 0.000310 0.455181 0.163988 MRSB 0.380728 0.742731 0.553693 0.345767 0.090244 MSFT-RM 0.371655 0.725363 0.212351 0.416300 0.137290 MSNG 0.372163 0.717366 0.789992 0.299337 0.056510 MSRS 0.372704 0.713697 0.995386 0.276640 0.029142 MSTT 0.373870 0.722760 0.696234 0.320805 0.062893 MTLR 0.368879 0.735742 0.985648 0.257431 0.033493 MTLRP 0.376950 0.743847 0.988007 0.267137 0.033110 MTSS 0.368850 0.707038 1.190573 0.236653 0.005084 MU-RM 0.371128 0.745591 0.164920 0.425439 0.145842 MVID 0.369710 0.713917 0.850728 0.290840 0.047422 NEE-RM 0.369451 0.735408 0.126746 0.431298 0.149887 NEM-RM 0.377997 0.746900 0.096997 0.448550 0.160237 NFAZ 0.377997 0.737041 0.603024 0.352639 0.088643 NFLX-RM 0.372341 0.730896 0.232025 0.415216 0.135619 NKE-RM 0.371248 0.739372 0.061529 0.436284 0.156687 NKHP 0.371182 0.724978 0.754560 0.317549 0.060000 NKNC 0.371225 0.723925 0.817521 0.299223 0.051311 NKNCP 0.373199 0.717590 0.979489 0.290726 0.031130 NLMK 0.370743 0.720040 1.107743 0.247863 0.015825 NMTP 0.375345 0.725030 1.001556 0.286702 0.030158 NSVZ 0.378269 0.745467 0.818438 0.307642 0.052997 NVDA-RM 0.370731 0.747636 0.445921 0.380941 0.110067 NVTK 0.368952 0.708356 1.168925 0.236873 0.008751 OGKB 0.370145 0.726606 1.166864 0.253684 0.010202 ORCL-RM 0.376714 0.736836 0.100114 0.436089 0.150175 ORUP 0.368603 0.728196 0.665562 0.323431 0.073897 OZON 0.369081 0.727974 0.729082 0.306178 0.066930 PFE-RM 0.373554 0.747329 -0.065781 0.468385 0.189368 PG-RM 0.371306 0.725280 -0.024037 0.464565 0.169149 PHOR 0.370707 0.705554 0.799104 0.295277 0.052378 PIKK 0.370369 0.713520 0.355971 0.392799 0.114057 PLZL 0.375539 0.716958 0.660199 0.311793 0.069726 PMSBP 0.377997 0.735030 0.860792 0.300085 0.054233 POGR 0.377997 0.727917 0.785212 0.299405 0.056689 POLY 0.370853 0.729548 0.673858 0.313932 0.068639 PYPL-RM 0.377678 0.743959 0.338912 0.401647 0.124930 QCOM-RM 0.373319 0.751617 0.103327 0.450616 0.156117 QIWI 0.377997 0.732710 0.846772 0.304006 0.054099 RASP 0.377944 0.739712 0.858843 0.264658 0.041086 RBCM 0.377997 0.722928 0.834817 0.304898 0.050217 REGN-RM 0.378890 0.733347 0.146330 0.435984 0.147297 RGSS 0.369887 0.724385 0.694870 0.327398 0.064363 RNFT 0.372624 0.714453 1.053438 0.265335 0.021287 ROLO 0.369218 0.727989 0.716346 0.313632 0.072066 ROSN 0.368786 0.717558 1.356430 0.217799 -0.009439 RSTI 0.368832 0.741824 1.315670 0.237183 -0.004466 RSTIP 0.368724 0.718332 0.891853 0.308057 0.044253 RTKM 0.371301 0.707425 1.055388 0.259087 0.020611 RTKMP 0.369470 0.718898 1.062699 0.265336 0.019647 RUAL 0.368832 0.726614 0.989109 0.261792 0.028587 RUGR 0.378592 0.744317 0.694503 0.329204 0.074109 RUSE 0.368465 0.723219 0.679105 0.290752 0.054116 RZSB 0.377792 0.729154 0.311405 0.375477 0.116079 SBER 0.369634 0.714174 1.394528 0.208076 -0.016745 SBERP 0.375519 0.716522 1.336077 0.225220 -0.007810 SBGB 0.370647 0.715822 0.542557 0.350026 0.085594 SBRB 0.368694 0.705745 0.619039 0.328606 0.078876 SBUX-RM 0.375930 0.725270 0.086718 0.446604 0.158512 SELG 0.368978 0.728070 0.552321 0.359597 0.086246 SFIN 0.377764 0.715929 0.606190 0.352646 0.086306 SIBN 0.369301 0.715953 1.085522 0.257491 0.017687 SMLT 0.372354 0.728877 0.531119 0.351750 0.096017 SNGS 0.368736 0.715338 0.739526 0.302753 0.061802 SNGSP 0.372837 0.710990 0.932043 0.267916 0.036218 STSBP 0.378845 0.731747 0.654760 0.338941 0.079192 SUGB 0.377997 0.723982 0.488725 0.365798 0.092326 SVAV 0.371385 0.728019 0.750991 0.314556 0.064141 T-RM 0.373298 0.725214 0.033857 0.456909 0.161262 TATN 0.370454 0.714815 1.330056 0.221726 -0.007915 TATNP 0.375694 0.722977 1.329380 0.223465 -0.007244 TCSG 0.369342 0.735305 0.993458 0.261165 0.029678 TGKA 0.368800 0.721142 1.146294 0.251206 0.010923 TGKB 0.370085 0.728015 0.858685 0.312252 0.052342 TGKD 0.376146 0.728043 0.441129 0.374633 0.109179 TGKN 0.373693 0.727303 0.567775 0.354639 0.092611 TGT-RM 0.376566 0.735338 0.226116 0.422616 0.142784 TRMK 0.368958 0.728154 0.707945 0.296626 0.058468 TRNFP 0.369932 0.710583 0.536501 0.358693 0.083841 TRUR 0.369733 0.713298 1.144310 0.246584 0.010078 TSLA-RM 0.371356 0.751801 0.351359 0.396964 0.123147 TTLK 0.377997 0.716720 0.952055 0.288617 0.035253 TTWO-RM 0.377036 0.745133 0.042523 0.446606 0.168483 TWTR-RM 0.373343 0.732599 0.339850 0.397009 0.123102 UBER-RM 0.371972 0.728725 0.357970 0.396795 0.125426 UNAC 0.373425 0.732247 0.493326 0.342017 0.087364 UNH-RM 0.377997 0.736153 0.080652 0.435725 0.153095 UNKL 0.380121 0.729737 0.413792 0.339119 0.087934 UPRO 0.370666 0.706801 0.942426 0.292246 0.038856 USBN 0.374187 0.726138 0.519312 0.369197 0.105652 V-RM 0.372105 0.735261 0.292578 0.405228 0.124830 VKCO 0.371298 0.727358 1.053244 0.256117 0.022064 VSMO 0.371458 0.732626 0.308361 0.402777 0.126718 VTBB 0.368694 0.716288 0.973454 0.273799 0.029864 VTBM 0.367692 0.713431 0.140488 0.418657 0.141726 VTBR 0.368882 0.715508 1.318257 0.223187 -0.005083 VTRS-RM 0.373421 0.738505 0.287912 0.405759 0.128705 WMT-RM 0.374248 0.734511 -0.164636 0.474395 0.188969 XOM-RM 0.378104 0.746276 0.395052 0.399366 0.119214 YAKG 0.374421 0.735781 0.509097 0.350591 0.091502 YNDX 0.370969 0.721684 0.902317 0.268628 0.038589 ZILL 0.377116 0.742535 0.839477 0.309450 0.050685 CASH 0.000000 0.000000 0.000000 0.064034 -0.162770 PORTFOLIO 0.345927 0.357867 1.000000 0.206866 0.000000

Консервативная доходность: 20.34% Консервативный риск: 4294382993.23% Консервативная метрика: -92207547499128384.00% Оценка просадки: 37.02%

WLM1ke commented 2 years ago

Эволюция идет медленно - надо ждать.

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

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

Я сейчас думаю над некоторым ускорением процесса, но не верен, что успею до конца недели.