Code Monkey home page Code Monkey logo

poptimizer_old's Introduction

poptimizer_old's People

Contributors

epogrebnyak avatar wlm1ke avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar

poptimizer_old's Issues

убрать required test coverage

FAIL Required test coverage of 99% not reached. Total coverage: 93.95%

где это сконфигурировано? надо поскорее отключить

Реализовать базовый класс портфеля

Конструктор:

  • Набор тикеров и лотов (словарь)
  • Объём кэша
  • Дата и стоимость - используются для проверки корректности данных (отклонение расчетной стоимости не должно сильно отличаться от введённой)

Данные:

  • Дата формирования портфеля
  • Тикеры (кэш специальный тикер с ценой 1 и портфель специальный тикер с количеством 1)
  • Лоты
  • Размеры лотов
  • Краткие названия
  • Стоимость/цены/веса бумаг закрытия на дату формирования портфеля
  • Текущая стоимость/цены/веса бумаг

Методы:

  • Получить сводные данные по портфелю - без параметров
  • Если передан массив меток, то информация по указанным в метках параметрам

Метрики доходности

Необходимо реализовать метрики доходности по следующей приблизительной схеме:

  • Формируются ряды цен с шагом в один месяц для всех активов из портфеля
  • Засчитываются месячные доходности. Для коротких рядов отсутствующие значения заменяются 0. Для кэша - 0, для портфеля рассчитываются нуте взвешивания по текущим долям
  • Вычисляется параметр сглаживания с помощью метода максимального правдоподобия для простого экспоненциального скользящего процесса с гетероскедастичностью
  • С учетом полученной константы сглаживания насчитывается матожижание, СКО и беты всех активов
  • На основе полученных значений расчихается ожидаемый DrawDown для всех активов
  • Рассчитываются производные DrawDown по доле каждого актива

Динамический портфель

Необходима возможно динамически анализировать портфель и вести статистику:

  1. Можно покупать и продавать бумаги
  • должна быть возможность устанавливать издержки
  1. Можно передвигаться во времени
  • должно учитываться получение дивидендов
  • сохраняться желаемые метрики портфеля

Расширение истории с учет изменения регистрационных номеров

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

  • Необходимо удалить старые выгрузки истории

убрать *_from_start() из API конечного пользователя

Свежим взглядом - мое предложение насчет двух функций сейчас мне кажется перегружает понимание функций. Предлагаю для конечного пользователи оставить quotes_history(ticker, start_date) и index_history(ticker, start_date), где start_date - опциональный. Внутри кода можно использовать *_from_start() функции.

История котировок акций источник данных - quotes_history(ticker, start_date) и index_history_from_start(ticker)
Итория значений индекса MOEX Russia Net Total Return (Resident) источник данных - index_history(ticker, start_date) и index_history_from_start(ticker)

Множество котировок на одну дату выгрузку одной котировки для каждой даты

В текущей реализации функции quotes_history(ticker, first=None) выгружается одна котировка для каждой даты за счет элемента boards/TQBR/ в URL. В результате история котировок неглубокая - с начала работы режима Т+2 (TQBR). В результате не захватывается 2008 год.
Если исключить этот элемент из URL - длина истории возрастает, но на каждую дату может приходиться несколько котировок.
Необходимо реализовать:

  • Выгрузку данных для всех режимов
  • Сборку одного ряда данных
  • Для дат с несколькими значениями выбирать режим с максимальным оборотом

Возможное решение с помощь groupby и idxmax

не работает скачивание данных

  File "C:\Users\PogrebnyakEV\Desktop\mini-kep\po\src\optimizer\download\tickers.py", line 11, in get_json
    respond = requests.get(url)
...

SSLError: HTTPSConnectionPool(host='iss.moex.com', port=443): Max retries exceeded with url: /iss/securities.json?q=1-02-00028-A (Caused by SSLError(SSLError("bad handshake: Error([('SSL routines', 'tls_process_server_certificate', 'certificate verify failed')],)",),))

Изменяющиеся тикеры

Тикеры акций могут меняться. Так у текущего тикера UPRO очень не глубокая история, так как тикер менялся

  • Подумать и реализовать более глубокую выгрузку для таких ситуаций - видимо надо искать все тикеры с соответствующим регистрационным номером
  • Удалить все скаченные серии котировок

Обрезка при расчете константы сглаживания

Сейчас при расчете константы сглаживания отбрасываются первые 100 значений

Необходимо реализовать более формализованный подход:

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

rename `dl` submodule

  • название dl неудачное, надо переименовать
  • что делает пустой подмодуль load?

Реализовать локальное хранение данных

Описание интерфейса

  1. Каждому типу данных соответсвует класс (или набор функций)

  2. Конструктор класса принимает один или два параметра:

  • Наименование элемента (обычно тикер)
  • Флаг удаления локальных данных - значение по умолчанию False
  1. Ответ является DataFrame:
  • Индекс из упорядоченных по возрастанию дат
  • Числовых (обычно) колонок с данными

Структура и поведение класса

  1. Если флаг использования локальных данных True:
  • Удаляются старые локальные данные
  • Идет прямое обращение к функциям загрузки данных из интернета
  • Данные сохраняются локально
  • Возвращается ответ
  1. Если флаг использования локальных данных False:
  • Производится загрузка локальных данных при наличии
  • Для данных предусматривающих загрузку из интернета с некой даты, определяет последняя локальная дата
  • Загружаются данные из интернета с последней доступной даты или целиком при отсутствии возможности частичной загрузки
  • Производится кросс-валидация данных для последней доступной локальной даты или для всех локальных данных - при различии выкидывается исключение
  • Объединяются локальные и загруженные данные в единый DataFrame
  • Объединенные данные сохраняются локально
  • Возвращается ответ

Организация хранения даных

  1. Данные хранятся в формате csv (при необходимости в xlsx)

  2. Корневая папка с данным задается глобальной переменной на уровне пакета - первоначально папка data в корне проекта

  3. Типы данных, содержащие один элемент, хранятся в корне папки данных в файле с именем соответствующего типа данных. Пример: класс данных инфляция - один элемент CPI - хранится в корне папки данных

  4. Типы данных, содержащих несколько элементов, хранятся в отдельных папках с именем класса и файлами внутри с именем соответствующего элемента. Пример: класс котировки - много элементов, соответствующих отдельным тикерам - создается папка котировки и в ней файлы для каждого тикера

локальные данные не работают

  File "<ipython-input-3-0972a52afb4b>", line 1, in <module>
    runfile('C:/Users/PogrebnyakEV/Desktop/mini-kep/po/src/optimizer/portfolio.py', wdir='C:/Users/PogrebnyakEV/Desktop/mini-kep/po/src/optimizer')

  File "D:\Continuum\Anaconda3\lib\site-packages\spyder\utils\site\sitecustomize.py", line 880, in runfile
    execfile(filename, namespace)

  File "D:\Continuum\Anaconda3\lib\site-packages\spyder\utils\site\sitecustomize.py", line 102, in execfile
    exec(compile(f.read(), filename, 'exec'), namespace)

  File "C:/Users/PogrebnyakEV/Desktop/mini-kep/po/src/optimizer/portfolio.py", line 96, in <module>
    value=3_728_568.41)

  File "C:/Users/PogrebnyakEV/Desktop/mini-kep/po/src/optimizer/portfolio.py", line 40, in __init__
    self._create_df(cash)

  File "C:/Users/PogrebnyakEV/Desktop/mini-kep/po/src/optimizer/portfolio.py", line 54, in _create_df
    df = getter.security_info(self.tickers)

  File "C:\Users\PogrebnyakEV\Desktop\mini-kep\po\src\optimizer\getter\local_securities_info.py", line 109, in get_security_info
    df = update_local_securities_info(tickers)

  File "C:\Users\PogrebnyakEV\Desktop\mini-kep\po\src\optimizer\getter\local_securities_info.py", line 75, in update_local_securities_info
    validate(df, df_update)

  File "C:\Users\PogrebnyakEV\Desktop\mini-kep\po\src\optimizer\getter\local_securities_info.py", line 60, in validate
    f'{df_update}')

ValueError: Загруженные данные ['VSMO', 'GAZP', 'TTLK'] не стыкуются с локальными. 
               COMPANY_NAME    REG_NUMBER  LOT_SIZE
TICKER                                             
VSMO    Р’РЎРњРџРћ-РђР’РЎРњ  1-01-30202-D         1
GAZP    ГАЗПРОМ ао  1-02-00028-A        10
TTLK     Таттел. ао  1-02-50049-A     10000 
       COMPANY_NAME    REG_NUMBER  LOT_SIZE
TICKER                                     
VSMO     ВСМПО-АВСМ  1-01-30202-D         1
GAZP     ГАЗПРОМ ао  1-02-00028-A        10
TTLK     Таттел. ао  1-02-50049-A     10000

Метрики дивидендного потока

Основа подхода

Для оптимизации дивидендного потока портфеля необходимо максимизировать нижнюю границу его доверительного интервала для t-статистики=T (по умолчанию 2)

Поход к решению

Необходимо последовательно рассчитать метрики дивидендного потока по следующей схеме:

  • За основу берутся legacy dividends за 2012 - 2016 годы
  • С помощью CPI переводятся в постоянные цены 2016 года
  • С помощью цен на отчетную дату портфеля переводятся в дивидендные доходности для 2012-2016 годов
  • Рассчитывается матожидания дивидендных доходностей для отдельных позиций и портфеля с помощью простой средней
  • Рассчитывается риск дивидендных доходностей. Для отдельных позиций в качестве меры риска используется СКО. СКО портфеля рассчитывается из допущения нулевой корреляции между дивидендами отдельных позиций - можно вывести аналитическую формулу. Допущение о нулевой корреляции необходимо в качестве простого приема регуляризации, так как число лет существенно меньше количества позиции. Данное допущение используется во всех дальнейших расчетах
  • Рассчитываются беты дивидендов отдельных позиций и дивидендов портфеля относительно дивидендов портфеля - можно вывести аналитическую формулу. Бета портфеля при корректном расчете равна 1
  • Для всех позиций и портфеля рассчитывается производная нижней границы доверительного интервала по доле позиции в портфеле - можно вывести аналитическую формулу на основе бет. Производная для портфеля при корректном расчете равна 0

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.