Вопросы по работе библиотеки okama

Вот полный пример:

test_assets3 = ['DGP.US','TQQQ.US','BND.US']
ef_all3 = ok.EfficientFrontierReb(test_assets3, ccy="USD")
ef_all3.ef_points

ну т.е. идея в тестировании портфелей, которые на 70-80% состоят из бондов и на 20-30% из плечевых etf с ежемесячной или даже еще более частой ребалансировкой. Хочу понять насколько это здравая мысль, если отбросить эмоции и например написать робота который будет проводить ребалансировку при сильном отклонении волатильных активов от целевой доли в портфеле.

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

Пока у алгоритма вычисления точек многопериодной границы эффективности для портфелем с учетом ребалансировки (EfficienFrontierReb) есть сложности. Часто это невыпуклая задача. Для одной точки доходности есть 2 точки риска. Для поиска решения окама использует SciPy SLSQP, но этот алгоритм не предназначен для решения невыпуклых задач. Поэтому приходится “выкручиваться”, в сложных случаях подсказывая где ему искать решения. Пока ничего более подходящего чем SLSQP найти не удалось.

Как резюме, иногда встречаются ситуации, когда SLSQP не справляется. В случае с набором test_assets3 = [‘DGP.US’,‘TQQQ.US’,‘BND.US’] сложности возникают в нижней точке границы эффективности (минимальная доходность). В ближайшем обновлении я добавлю возможность отрисовывать только верхнюю часть границы эффективности выше GMV (global minimum variance) - точки с минимальным риском. Такая возможность сеqчас есть в EfficentFrontier, но отсутствовала в EfficeintFrontierReb. Нижняя часть границы обычно строится “для красоты” и наглядности.

В версии для разработчиков это появится уже сегодня-завтра.
Верхняя часть границы эффективности для test_assets3 = [‘DGP.US’,‘TQQQ.US’,‘BND.US’] выглядит так:


Кстати, эта часть не является “невыпуклой”.

П.С. Интервал исторических данных, доступный для [‘DGP.US’,‘TQQQ.US’,‘BND.US’] явно не является доверительным. Данные доступны только с 2010 года и не захватывают ни одного глобального финансового кризиса.

А из гугл колаб можно как-то импортировать версию для разработчиков?

Можно:
!pip install git+https://github.com/mbk-dev/okama@dev

1 лайк

Добрый день!

Сергей, только начал осваивать библиотеку okama. Хотел построить график (код ниже), но у меня появляется ошибка:

RetryError: HTTPConnectionPool(host='185.63.191.70', port=5000): Max retries exceeded with url: /api/ts/macro/RUB.INFL?first_date=2021-09-01+00%3A00%3A00&last_date=2021-11-01+00%3A00%3A00&period=m (Caused by ResponseError('too many 500 error responses'))

запрос:

import okama as ok

russ = ok.AssetList(['FXIT.MOEX', 'FXMM.MOEX', 'FXRD.MOEX', 'FXGD.MOEX', 'FXCN.MOEX'], ccy='RUB')

russ.wealth_indexes.plot(figsize=(18,9))

Подскажите, что я делаю не так. Заранее спасибо.

1 лайк

Проблема вызвана тикером ‘FXRD.MOEX’. Эта бумага имеет историю с сентября, а данные инфляции за октябрь еще отсутствуют. Поэтому мы имеем только месяц истории. Отсюда ошибка. Но в любом случае библиотека так себя вести не должна. Так что спасибо… добавим проверку на слишком короткую историю бумаг.

Если при инициализации добавить атрибут inflation=False, то все работает:
russ = ok.AssetList(['FXIT.MOEX', 'FXMM.MOEX', 'FXRD.MOEX', 'FXGD.MOEX', 'FXCN.MOEX'], ccy='RUB', inflation=False)

Понял, спасибо большое за оперативный ответ!

1 лайк

Сергей, добрый день!

Продолжаю работать с Okama. Скажите, а библиотека может работать с шортами?

Заранее спасибо.

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

Здравствуйте. Подскажите пожалуйста на оси х (plot_assets) размещается риск, а это в свою очередь волатильность? Она откуда-то берется или как-то считается? Просто если это волатильность, то цифры отличаются от тех, что вижу в интернете, например по VT.US, okama говорит что риск = 22.3458%, а IB говорит историческая волатильность 24.662%, здесь может быть дело именно в приписке “историческая”, но вот portfolioslab (первый попавшийся источник в интеренете) говорит о волатильности в 23.01%, у VT разница не такая большая, а вот у MCFTR.INDX разница по больше, okama - 27.0373%, а вот в portfolioslab 20.39%. И какая доходность помещается на ось у, в describe() этих цифр нет, как она рассчитывается?

1 лайк

Подскажите пожалуйста на оси х (plot_assets) размещается риск, а это в свою очередь волатильность? Она откуда-то берется или как-то считается?

Да в библиотеке окама по умолчанию “риск” - это волатильность (стандартное отклонение доходности). Хотя, считаются почти все метрики риска (полудисперсия, VAR, CVAR и т.п.).

Почему значения риска могут отличаться от других источников:

  • В окаме мы используем “приведенные цены закрытия” (adjusted close) для расчета доходности и риска. Adjusted close - это цена закрытия скорректированная на полученные дивиденды (сплиты и другие корпоративные действия). Adjusted Close удобна т.к. позволяет рассчитать полную доходность. Но в расчет риска она вносит небольшую неточность, т.к. доходность очевидно отличается от чисто “ценовой доходности”. Я завел специальную задачу для дополнительного расчета ценовых метрик риска. Но пока сходу решить эту задачу не получилось.
  • Риск в разных источниках может значительно отличаться банально потому, что рассматриваются исторические данных на разных промежутках времени (глубина истории). Влияние этого фактора гораздо выше чем небольшое различие, связанное с adjusted close. Например, в базе данных окама есть данные по MCFTR.INDX c 1997 года. В других источниках, как правило, это 2003 или 2006 г.

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

1 лайк

Этот вопрос я не понял. Decribe() на выходе дает таблицу. Какую ось Y вы имеете ввиду?

я спрашивал какая доходность помещается на ось У в plot_assets


так как в describe этих бумаг нету строки, которая соответствовала сразу всем бумагам

метод AsseList.plot_assets() отображает риск (ось Х), доходность (ось Y). Риск - всегда приведенное к годовым значениям стандартное отклонение месячной доходности. Вся библиотека работает на месячных данных. Поэтому большинство величин считается в месячном выражении. Потом приводится к году. Здесь есть подробное изложение, как риск приводится к году:
Приведение месячных данных портфеля к годовым. Как избежать ошибки

Теперь про доходности. AsseList.plot_assets() имеет возможность считать доходность двумя способами: среднее арифметическое (матожидание), среднее геометрическое (CAGR).
Подробности есть в документации по этому методу.

В describe() нет математического ожидания, т.к. оно само по себе мало информативно. Я его оставил в библиотеке как дань Марковицу, которые в своих первых работах все доходности считал как среднее арифметическое. Это на много упрощает и ускоряет расчеты, но дает очень неточные результаты.

1 лайк

Сергей, посоветуйте, пожалуйста, как наиболее оперативно найти актив с самой ранней first_date? Например, в namespace ‘INDX’.

как наиболее оперативно найти актив с самой ранней first_date

Только методом перебора всех тикеров и сравнения Asset.first_date

1 лайк

Сергей, может быть, знаете “самый взрослый” индекс облигаций США полной доходности (не важно, корп. или гос.)? Я пока нашел ‘SP500BDT.INDX’: Timestamp(‘1995-01-01 00:00:00’).
Хотелось бы пораньше найти, в районе 1970-х хотя бы, а то и раньше. Спасибо.

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

Вместо индекса бондов можно использовать самый старый индексный фонд Vanguard на индекс облигаций: VBMFX (Vanguard Total Bond Market Index Fund Investor Shares). По нему данные есть с 1986 года.

1 лайк

Спасибо! А нет ли предусмотренного способа получить месячные total return (по аналогии с ежедневными adj_close) для активов с дивидендами? Пока придумал только объединить два Series и сложить close_monthly и dividends). Только вот как это интегрировать в построение портфеля через ok.Portfolio)?