{"id":50109270,"url":"https://github.com/i-savelev/invest_toolkit","last_synced_at":"2026-05-23T12:06:56.529Z","repository":{"id":315883743,"uuid":"1056036831","full_name":"i-savelev/invest_toolkit","owner":"i-savelev","description":"Инструментарий для анализа инвестиционного портфеля и фундаментального анализа акций MOEX.","archived":false,"fork":false,"pushed_at":"2026-04-28T11:08:12.000Z","size":1616,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-04-28T13:14:26.115Z","etag":null,"topics":["investment-analysis","investment-portfolio","moex","smart-lab"],"latest_commit_sha":null,"homepage":"https://datalens.yandex/5ylyszbllnt6p","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/i-savelev.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":"support_files/20251206-free-float.xlsx","governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":"AGENTS.md","dco":null,"cla":null}},"created_at":"2025-09-13T09:02:39.000Z","updated_at":"2026-04-28T11:08:16.000Z","dependencies_parsed_at":"2025-09-21T12:22:37.869Z","dependency_job_id":"0040a026-c3c7-4589-9024-bff93f5bf145","html_url":"https://github.com/i-savelev/invest_toolkit","commit_stats":null,"previous_names":["i-savelev/moex_broker_toolkit","i-savelev/invest_toolkit"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/i-savelev/invest_toolkit","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/i-savelev%2Finvest_toolkit","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/i-savelev%2Finvest_toolkit/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/i-savelev%2Finvest_toolkit/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/i-savelev%2Finvest_toolkit/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/i-savelev","download_url":"https://codeload.github.com/i-savelev/invest_toolkit/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/i-savelev%2Finvest_toolkit/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33394728,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-23T04:15:53.637Z","status":"ssl_error","status_checked_at":"2026-05-23T04:15:53.242Z","response_time":53,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["investment-analysis","investment-portfolio","moex","smart-lab"],"created_at":"2026-05-23T12:06:55.848Z","updated_at":"2026-05-23T12:06:56.521Z","avatar_url":"https://github.com/i-savelev.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# invest_toolkit\n\n\u003cimg width=\"2088\" height=\"1166\" alt=\"изображение\" src=\"https://github.com/user-attachments/assets/ec190449-3c21-4b36-8ac5-974a58aea1af\" /\u003e\n\n\n\nИнструментарий для анализа инвестиционного портфеля, расчёта рейтингов и визуализации данных по акциям MOEX.\n\n---\n\n## Возможности\n\n- Парсинг отчётов брокеров (Сбербанк, ВТБ)\n- Загрузка данных с MOEX API и SmartLab\n- Расчёт целевого распределения портфеля и ребалансировка\n- Построение графиков с скользящей средней\n- Автоматический расчёт инвестиционного рейтинга\n- Генерация отчётов в Markdown\n- Все функции возвращают `pd.DataFrame` и автоматически логируются в `.log/app.log`\n\n---\n\n## Установка\n\n```bash\n# Через uv (рекомендуется)\nuv pip install -e .\n\n# Или через pip\npip install -e .\n```\n\n\u003e Требуется Python ≥3.13\n\n---\n\n## 📦 Быстрый старт и примеры использования\n\n### Получение финансовых данных с smartlab\n\n```python\nimport invest_toolkit as it\n\nit.scrape_and_download(\n  save_directory=r'support_files/scrapper_reports',\n  period_columns=['2025', 'LTM'],\n)\n```\nДанные по финансовым показателям каждоый компании с сайта smartlab в формате csv будут сохранены в указанную папку\n\n### Сбор всех данных по акциям (moex api + отчеты с smartlab)\n```python\nimport invest_toolkit as it\n\ndf = it.all_stock_info(\n    free_dloat_path='support_files/20251206-free-float.xlsx',\n    ir_path='support_files/ir_rating.xlsx',\n    sl_stock_folder='support_files/scrapper_reports',\n)\n```\nБудет создан датафрейм следующего вида\n\n```\nТАБЛИЦА: Результат выполнения 'all_stock_info'\nРазмер: 149726 строк × 5 столбцов\n================================================================================\n   ticker indicator       value  type year\n0    SBER      name    Сбербанк  moex  NaN\n1    ROSN      name    Роснефть  moex  NaN\n2    NVTK      name  Новатэк ао  moex  NaN\n3    LKOH      name      ЛУКОЙЛ  moex  NaN\n4    PLZL      name       Полюс  moex  NaN\n5    GAZP      name  ГАЗПРОМ ао  moex  NaN\n6    SIBN      name  Газпрнефть  moex  NaN\n7    GMKN      name   ГМКНорНик  moex  NaN\n8    YDEX      name      ЯНДЕКС  moex  NaN\n9    TATN      name  Татнфт 3ао  moex  NaN\n10   OZON      name        Озон  moex  NaN\n11      T      name  Т-Техно ао  moex  NaN\n12   PHOR      name  ФосАгро ао  moex  NaN\n```\n\n### Визуализация\n\n```python\nimport invest_toolkit as it\n# Один график\nit.plot_one_chart(\n    df=df,\n    ticker='SBER',\n    title='Чистая прибыль, млрд руб',\n    window=3  # окно скользящей средней\n)\n\n# Несколько графиков\nit.plot_multiple_chart(\n    df=df,\n    ticker='SBER',\n    metric_list=['Чистая прибыль, млрд руб', 'Див.выплата, млрд руб'],\n    rows=2, cols=1\n)\n```\nПримеры графиков\n\n\u003cimg width=\"600\" height=\"500\" alt=\"изображение\" src=\"https://github.com/user-attachments/assets/fcb99a0d-c69f-4383-8396-f53373b951bf\" /\u003e\n\n\n### Рейтинг\n\n```python\nimport invest_toolkit as it\n# Расчёт рейтинга\nrating = it.rating_df(df, n=7) # (df = it.all_stock_info)\n```\nПример расчета рейтинга\n```\nТАБЛИЦА: Результат выполнения 'rating_df'\nРазмер: 2331 строк × 5 столбцов\n================================================================================\n   ticker           type              indicator  year                                            value\n0    ABIO         rating                     IR  None                                             0.77\n1    ABIO         rating          Выплата див-в  None                                             0.29\n2    ABIO  rating_string  Выплата див-в, расчет  None       Кол-во [Див.выплата, млрд руб]: 2/7 = 0.29\n3    ABIO         rating             Рост див-в  None                                             0.29\n4    ABIO  rating_string     Рост див-в, расчет  None         Рост [Див.выплата, млрд руб]: 2/7 = 0.29\n5    ABIO         rating           Рост прибыли  None                                             0.43\n6    ABIO  rating_string   Рост прибыли, расчет  None      Рост [Чистая прибыль, млрд руб]: 3/7 = 0.43\n```\n\n🔗 **[Рейтинг на datalens](https://datalens.yandex/5ylyszbllnt6p)**\n\n### Управление портфелем\n\n```python\nit.portfolio_report(\n    report_path_sber='.reports/sber_27012026.html',\n    report_path_vtb='.reports/vtb20260208.xlsx',\n    allocation_path='support_files/index_fund.xlsx',\n    deposit=100000,\n    grouping_tickers=['LQDT', 'SBMM'],\n    allow_sell_tickers=['LQDT', 'SBMM'],\n    sell=True,\n    report_save_path='.output'\n)\n```\nПример отчета по портфелю\n \n```\n\nОбщая сумма активов = 2310810 руб.\n\nАкции = 1291352.0 руб. (55.9/60.0%)\n\nДенежный рынок = 1019458.0 руб. (44.1/40.0%)\n\nПополнение = 100000\n\n## Исходный отчет\n        \n\n| ticker     | buy/sell                     | %_src | %_tgt | %_res |\n| :--------- | :--------------------------- | ----: | ----: | ----: |\n| AQUA       | buy 11 шт. (5380 руб.)       |  0.72 |  0.96 |  0.91 |\n| BSPB       | buy 2 шт. (6843 руб.)        |  1.63 |  1.93 |  1.85 |\n| CHMF       | -                            |  0.67 |   0.6 |  0.64 |\n| HEAD       | buy 5 шт. (14560 руб.)       |  1.51 |  2.27 |  2.05 |\n| IRAO       | buy 29 шт. (9599 руб.)       |  2.48 |  2.84 |  2.77 |\n| LKOH       | -                            |  4.95 |   4.2 |  4.74 |\n| LSNGP      | -                            |  1.75 |  1.57 |  1.68 |\n| ...        | ...                          |   ... |   ... |   ... |\n| SNGSP      | -                            |  0.77 |   0.6 |  0.74 |\n| T          | buy 6 шт. (21037 руб.)       |  2.73 |  3.73 |  3.49 |\n| TATN       | -                            |  2.42 |   1.8 |  2.32 |\n| TRNFP      | -                            |  3.25 |     3 |  3.12 |\n| WTCMP      | buy 2 шт. (2584 руб.)        |  1.01 |  1.09 |  1.07 |\n| X5         | buy 5 шт. (12132 руб.)       |  2.73 |  3.19 |  3.12 |\n| YDEX       | -                            |   2.7 |  2.48 |  2.59 |\n| LQDT, SBMM | sell 27910 шт. (-55131 руб.) | 44.12 |    40 |    40 |\n\nAQUA: buy 11 шт. (5380 руб.)\nBSPB: buy 2 шт. (6843 руб.)\nHEAD: buy 5 шт. (14560 руб.)\n...\nWTCMP: buy 2 шт. (2584 руб.)\nX5: buy 5 шт. (12132 руб.)\nLQDT, SBMM: sell 27910 шт. (-55131 руб.)\n```\n\n\nПолные рабочие примеры использования находятся в Jupyter-ноутбуках в папке [`notebooks/`](notebooks/):\n\n- `analysis.ipynb` — анализ данных и рейтинги\n- `portfolio.ipynb` — управление портфелем и ребалансировка\n- `data.ipynb` — загрузка и предобработка данных\n---\n\n## Структура\n\n```\ninvest_toolkit/\n├── notebooks/          # Jupyter-ноутбуки с примерами ← начните отсюда\n├── src/invest_toolkit/\n│   ├── core/           # Бизнес-логика (портфель, рейтинги)\n│   ├── io/             # Загрузка данных (брокеры, MOEX, SmartLab)\n│   ├── orchestration/  # Основные workflows\n│   ├── reports/        # Генерация Markdown-отчётов\n│   ├── utils/          # Логирование и декораторы\n│   └── viz/            # Визуализация (matplotlib)\n├── support_files/      # Конфигурационные Excel-файлы\n└── pyproject.toml\n```\n---\n\n## ⚙️ Конфигурация\n\nЦелевое распределение настраивается в `support_files/index_fund.xlsx`:\n- Лист `categories` — доли категорий (акции, ETF)\n- Отдельные листы — тикеры и веса внутри категорий\n\n---\n\n## 📝 Логирование\n\n```python\nfrom invest_toolkit.utils import log\n\nlog.init(\"my_script.py\")  # инициализация\nlog.info(\"Сообщение\")      # запись в .log/app.log\n```\n\nВсе `DataFrame`, возвращаемые функциями, автоматически логируются в табличном виде.\n\n\n---\n\n\u003e 📌 **Совет**: Для работы скрапера SmartLab требуется Firefox и `geckodriver`. Все пути в примерах относительные — адаптируйте под свою структуру проекта.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fi-savelev%2Finvest_toolkit","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fi-savelev%2Finvest_toolkit","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fi-savelev%2Finvest_toolkit/lists"}