Блог им. elogunov

Построение фронтов Парето на языке R

При оптимизации параметров стратегий, выборе акций, да и во многих других случаях, может возникать необходимость одновременно оптимизировать несколько (возможно противоречивых) показателей. Например:
1. Интересны стратегии с максимальной годовой доходностью, минимальной максимальной просадкой и максимальным коэффициентом Шарпа;
2. Интересны акции компаний, недооцененных рынком и имеющих низкую долговую нагрузку.

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

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

Ниже представлена реализация одного из простейших алгоритмов нахождения фронта Парето в многомерном случае:
Построение фронтов Парето на языке R
Построение фронтов Парето на языке R
Построение фронтов Парето на языке R

См. также:
http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.206.4467&rep=rep1&type=pdf
https://arxiv.org/ftp/arxiv/papers/1704/1704.01788.pdf
http://delab.csd.auth.gr/papers/IISA2015tpm.pdf

Также полезным может быть ранжирование по Парето:
1. Берем все точки в качестве кандидатов;
2. Находим фронт Парето для множества кандидатов, присваиваем этим точкам ранг 1 и удаляем их из множества кандидатов;
3. Находим фронт Парето для множества кандидатов, присваиваем этим точкам ранг 2 и удаляем их из множества кандидатов;
4. ...
5. И так до тех пор, пока множество кандидатов не станет пустым.
Построение фронтов Парето на языке R
Построение фронтов Парето на языке R

Забавы ради возьмем некий срез данных по акциям из состава S&P 500 и построим фронт Парето по следующим показателям:
1. Earnings yield — максимизируем (интересуют недооцененные компании);
2. Debt/assets — минимизируем (интересуют компании с низкой долговой нагрузкой);
3. Implied volatility 30 day — максимизируем (на всё это дело будем продавать путы, чтобы ещё и премии урвать!);
4. Year-to-date total return — минимизируем (интересует то, что сильнее всего обвалилось).
Построение фронтов Парето на языке R

Какая прелесть — в список оптимальных по Парето попали авиакомпании, морские круизные компании и нефтянка. Так и хочется всего этого прикупить! Но здравый смысл никто не отменял ;)

Приложение: исходный код
★14 | ₽ 1
Евгений!

Есть вопрос.
А чем Вам так R нравится?
Я вот изучил два сабжа (R и MATLAB). так последний гораздо логичнее устроен и работает быстрее на больших массивах (если память выделить заблаговременно).

Так почему R?

С уважением

P.S. Haskell ещё экономнее, но не все мои алгоритмы на него легко переносятся. Ну, или это я туплю…
avatar

Мальчик Buybuy

Мальчик Buybuy, Много причин: обилие доступных пакетов, есть интеграция с нужным софтом, много legacy кода, просто по привычке, и т.д.
avatar

Eugene Logunov

Eugene Logunov, ну не знаю, не знаю

У меня базовая программа на C# в 100+ строк (отдельный вычислительный модуль) после моего короткого ресерча превратилась в 30+ строк на R и в 11 (!) строк на MATLAB...

С уважением

P.S. Векторизация доступна в R, Python и MATLAB. Но, если в последнем это пара строк кода, идентичного исходным математическим формулам, то в двух предыдущих случаях требуются библиотеки и/или грабли…
avatar

Мальчик Buybuy

Мальчик Buybuy, вполне вероятно что на R можно сделать ещё короче, просто нужно знать библиотеки… В каком смысле нужна библиотека? В чем проблема загрузить библиотеку? Matlab плюс платный. 
avatar

killanalitic

Мальчик Buybuy, 
 библиотеки и/или грабли…

они требуются везде, просто в *lab-е доступны (кста, не всегда доступны)более сложные, функционально, методы по дефолту и в огромном количестве. т.к. (видимо) у mathwork сама концептуальная модель продукта (и эволюция) — как универсальной и интегрированной среды и, соответственно, (в отношеннии «колаборативности» )решение с  макс. концентрация польз. контента на своем web-ресурсе.

r/py эволюционировали, имхо, аналогично op source продуктам, поэтому отпечаток остался. Но это не значит, что нет полноценных IDE, отсутствие  которых вынуждает ходить за каждым «костылем» на просторы инета  всегда.

что касается компактности py-код более, чем конкурентоспособен тут. максимально компакный код. добавлением 2-3 импортов (от силы, что проблемой не является) все благополучно решаемо, и по функционалу  и по компактности

*lab ценен именно тем, что под рукой сразу очень много встроеного (имхо, более быстрый интеракт. хелп тут же), это правда не отменяет необходимости разбираться в нюансах (примеры не буду приводить тут, если оч. нужно можно обсудить отдельно) .
Тут наверно, и начинают работать инд. предпочтения и опыт — кому что: разбираться в тонкостях готового со стороны мануала, или ковыряться в коде (естественно, границы  этого везде подвижны).
avatar

flextrader

Мальчик Buybuy, надо исчо отметить, что свобода выбора, исчо и ограничена рамками фреймворка (в широком смысле) в котором приходится трудиться, т.е. (в т.ч. из того с чем лично приходится сталкивался) — не всегда в технологическом стеке оказывается место для удобного тебе инструмента по разным причинам.

у Py, кстати, кмк, сейчас с этим меньше всего проблем. но при этом (мне известны) огромные (во всех отношениях) команды-адепты C# (речь именно сейчас в разрезе квантовых задач)
avatar

flextrader

Мальчик Buybuy, $940  год или $2350 постоянная (но скорее всего без автоматических обновлений на новые версии).
avatar

ch5oh

ch5oh, это в любом случае дешевле Блума))) у которого масса потребителей (поэтому сравниваю)
avatar

flextrader

flextrader, блумбергом пользуются, имхо, фонды и банки по историческим причинам. Кто из частников юзает его и платит по полной абонентку?
avatar

ch5oh

flextrader, сравнивать терминал Блумберга и программы статистического анализа, на которых можно делать машинное обучение… Ну такое… Учитывая что на этих программах можно делать в разы больше чем на блумберге именно в плане анализа… При том что Блумберг совершенно другие функции выполняет… Это как сравнивать лифт и велосипед. Вроде бы оба людей перевозят... 
avatar

killanalitic

killanalitic, мля, плз, перечитай коммент. я его написал,  с оговоркой, чтоб по нему стало понятно, что речь не идет ни  о каком функциональном сравнении, а только в качестве примера, что существует масса костов (и в разрезе ведения бизнеса unlim $2350  ->0).

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

flextrader

Все дороги ведут в Рим, а все методы поиска оптимальности ведут к тому, что надо покупать пузыри.
avatar

Cristopher Robin

А что изменится если заменить Debt/assets — при текущей мощности QE (наверное можно плюнуть на них), и заменить на Option Volume — количество выписанных опционов.
avatar

Сергей

Сергей, Разумеется, изменится набор акций)

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

Eugene Logunov

действие коронавируса тоже надо учитывать
avatar

alexKa

в список оптимальных по Парето попали авиакомпании, морские круизные компании и нефтянка. Так и хочется всего этого прикупить!
ну а что? и купим…
avatar

wistopus

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

Kot_Begemot

Kot_Begemot, 
Стратегии игр же не допускают множественных равновесий
Это не так. Инфа 100%, я не тролль 
Это экономическая задача, применимая, например, при построении линейки продуктов.
На тот же «efficient frontier» в портфельной оптимизации по Марковицу можно смотреть с этой точки зрения. И ещё много на что.
avatar

Eugene Logunov

Eugene Logunov, 

На тот же «efficient frontier» в портфельной оптимизации по Марковицу можно смотреть с этой точки зрения. 

Я и говорю, что это не решение. Максимум — его часть, некоторые промежуточные вычисления.


avatar

Kot_Begemot

Несколько часов назад в посте был пример для двухмерного случая. Удалили.

К сожалению, не смог вникнуть в Парето. Хотелось бы каких-то разъяснений. И как меняется результат, если условные (Рост; Вес) поменять на (Вес; Рост)?

Могу ошибаться, но, вроде Парето не может служить критерием Оптимизации — фитнес-функцией эвристических алгоритмов Оптимизации. Здесь, скорее, подходит для скрининга уже посчитанной БД.
avatar

fxsaber

fxsaber, 
Несколько часов назад в посте был пример для двухмерного случая.
Да, для той упрощенной реализации нужны некоторые оговорки про данные, без которых могут получаться некорректные результаты на некоторых граничных случаях.
Вместо обработки этих граничных случаев проще сразу дать универсальный алгоритм для многомерного случая.
К сожалению, не смог вникнуть в Парето. Хотелось бы каких-то разъяснений.
Посмотрите вот это
И как меняется результат, если условные (Рост; Вес) поменять на (Вес; Рост)?
См. функцию dominates() — она инвариантна относительно перестановки координат (это не аргументы функции, а столбцы dataset). Соответственно, результат никак не изменится.

А вот в случае, если у всех координат сменить знак (меняем задачи максимизации на задачи минимизации и наоборот) — и фронт, и ранги по Парето могут получиться другими.
Могу ошибаться, но, вроде Парето не может служить критерием Оптимизации
Зависит от используемого алгоритма. Если многоцелевую задачу оптимизации хочется решать градиентными методами — скаляризация подойдет лучше. Методы случайного поиска вполне можно совместить с фронтами Парето, как внутри поиска, так и как финальный проход по всем сгенерированным точкам.
avatar

Eugene Logunov

Eugene Logunov, Спасибо. Попробую поискать реализацию на C многомерного случая. На практике вижу это очень удобным фильтром при анализе результатов Оптимизации.
avatar

fxsaber

записал карандашиком. «Парето». Потом изучу глубже =)
avatar

Андрей К


....все тэги
2010-2020
UPDONW