The programm for collecting data from Tinkoff API and building Excel table.

Overview

tinkproject

The program for portfolio analysis via Tinkoff API

Hello! This is my first project, please, don't judge me. This project was developed for Tinkoff Investments' clients, like me, to gether accurate and full information about portfolio into Excel table.

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

Статья на Хабре: https://habr.com/en/post/555884/

Для автоматического сбора информации используется Tinkoff API. Для этого вам нужно получить его в личном кабинете Тинькофф. Далее вам нужно отредактировать файлик my_account.txt следующим образом:

Ваш API ключ Год начала инвестирования Месяц начала инвестирования День начала инвестирования Программа будет собирать данные за указанный вами период. Для работы программы все файлики программы: main.py, excel_builder.py, data_parser.py, my_account.txt - должны находиться в одной папке. В этой же папке появится файлик Excel с результатом.

Также, для работы программы на вашем компьютере должен быть установлен Python 3.9.1

Запускается программа файликом main.py или через docker:

docker build -t tinkproject .
docker run --rm -it -v $(pwd):/app tinkproject

Программа может формировать отчёт достаточно долго, в зависимости от объёма портфеля и количества совершённых операций.

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

Полученный отчёт включает слудующие разделы:

Текущий портфель <рыночные цены>

Market today rates: курсы валют по бирже

name - название актива

ticker - тикер

balance - количество бумаг в портфеле

currency - валюта, в которой бумага торгуется

ave.price - средняя цена покупки бумаги

exp.yield - ваша потенциальная выручка при полной продаже данного актива

market price - текущая рыночная стоимость одной бумаги данного актива

%change - процент изменения стоимости по сравнению со средней стоимостью покупки

market value - текущая рыночная стоимость всего актива

market value RUB - текущая рыночная стоимость всего актива в рублях по рыночному курсу соответсвующей валюты

ave.% - средний процент изменения стоимости всех бумаг

total value - общая рыночная стоимость всего портфеля в рублях

<перерасчёт по курсу ЦБ>

CB value RUB - стоимость актива в рублях по сегодняшнему курсу ЦБ

ave.buy in RUB - средняя цена покупки одной бумаги в рублях по курсу ЦБ на дату покупки

sum.buy in RUB - общая стоимость преобретения актива в пересчёте на рубли по курсу ЦБ на дату покупки

tax base - разница, облагаемая налогом

expected tax - предполагаемая сумма удерживаемого налога по ставке 13%, если актив будет продан сегодня

Списки всех операций Здесь всё стандартно, сами переведёте, если что Небольшой анализ Investing period - анализируемый период инвестирования, начниая с даты, которую вы указывали в текстовом файле PayIn-PayOut - сумма всех внесённых на счёт средств (в рублях по курсу ЦБ на дату внесения) минус сумма всех выводов средств. Commissions payed - сумма всех комиссий, удержанных брокером Taxes payed- сумма всех налогов, удержанных брокером Clean portfolio - рыночная стоимость всего портфеля за вычетом предполагаемой суммы налога, которая будет удержана (комиссия брокера не учетывается!) Profit - это Clean portfolio минус PayIn-PayOut

Ошибки:

  • если в портфеле есть бумага, недавно приобретённая на IPO
Comments
  • ошибка

    ошибка

    10:24:26 [INFO] ExBuild: content printing: Currencys Traceback (most recent call last): File "C:\barmen\tinkoff\main.py", line 493, in <module> build_excel_file(account, my_positions, my_operations, rates_today_cb, market_rate_today, File "C:\barmen\tinkoff\excel_builder.py", line 662, in build_excel_file last_row_pos = print_portfolio(1, 1) File "C:\barmen\tinkoff\excel_builder.py", line 203, in print_portfolio last_row = print_content("Currency") File "C:\barmen\tinkoff\excel_builder.py", line 150, in print_content row = print_position_data(row, col) File "C:\barmen\tinkoff\excel_builder.py", line 136, in print_position_data 'font_color': get_color(this_pos.percent_change)}) File "C:\barmen\tinkoff\classes.py", line 107, in percent_change return ((self.market_price / self.ave_price) * 100) - 100 decimal.DivisionByZero: [<class 'decimal.DivisionByZero'>]

    opened by lbarmen 8
  • Некорректный loss после сплита акций

    Некорректный loss после сплита акций

    Привет. Спасибо огромное за такой инструмент. Заметил, что при моих скромных 250к инвестиций, некий показатель loss равен почти -2,5M. Он почти целиком идет из tax base от акции, по которой был недавно сплит. Тут явно есть ошибка, хотя лично мне она сильно не мешает. Могу выслать excel файл для разбора, но не знаю куда. Еще раз спасибо за инструмент и хорошего дня =)

    opened by Thexmanrus 7
  • Дополнение для вывода информации по ИИС

    Дополнение для вывода информации по ИИС

    Дополнение к проекту автора, чтобы получать информацию по ИИС. В файле data_parser.py в функции get_api_data прописываем строку print(client.get_accounts()) после строки print("- authorisation success"): image Затем запускаем main.py и потом можно нажать ctrl+c, чтобы остановить выполнение после получения нужных данных, а именно: image Нам нужен broker_account_id от TinkoffIis, записываем его просто в код, а добавленную строчку удаляем: image Можно записать также и id от брокерского, чтобы потом было проще менять в параметрах, пометив в комментарии, где иис, а где брокерский, после оставляя раскомменченным тот, который нужно запустить: image Теперь добавляем новый параметр broker_account_id=broker_account_id в 3 строки: image И все, запускаем вновь main.py и получаем информацию по ИИС.

    opened by ZIK-1337 7
  • Нестабильно работает ветка API2

    Нестабильно работает ветка API2

    Тестирую ветку API2 (коммит d94e6d3) там где с веткой main проблем не наблюдалось.

    Вижу что иногда проходит создание отчёта по некоторым счетам (у меня это брокерский) а иногда нет. По другим счетам (у меня это ИИС) стабильно падает создание отчёта. Ругань в том и другом случае одна:

    Traceback (most recent call last):
      File "/app/./main.py", line 478, in <module>
        my_positions = creating_positions_objects()
      File "/app/./main.py", line 127, in creating_positions_objects
        if this_pos_instrument.type.lower() == "futures":
    AttributeError: 'NoneType' object has no attribute 'lower'
    

    видел раз и ошибки GRPC-общения.

    Более полный лог обмена для обоих счетов:

    ~/git/github/tinkproject API2 > docker run --rm -it -v $(pwd):/app tinkproject:25.12.2021-45-gd94e6d3 1m 55s 12:17:16 05:21:09 [INFO] root: Start 05:21:09 [INFO] Parser: getting accounts 05:21:09 [INFO] Parser: accounts received 05:21:09 [INFO] root: Account(id='2018218533', name='Брокерский счёт', opened_date=seconds: 1578787200 , closed_date=, type=1, status=2) 05:21:11 [INFO] Parser: portfolio received 05:21:11 [INFO] Parser: investing period: 2 years 0 months 11 days 05:21:11 [INFO] root: creating position objects.. 05:21:11 [INFO] root: 4 positions in portfolio 05:21:11 [INFO] root: 321 operations in period 05:21:21 [INFO] root: Тинькофф Вечный портфель USD 05:21:31 [INFO] root: Тинькофф Bonds RUB 05:21:41 [INFO] root: Тинькофф iMOEX Traceback (most recent call last): File "/app/./main.py", line 478, in my_positions = creating_positions_objects() File "/app/./main.py", line 127, in creating_positions_objects if this_pos_instrument.type.lower() == "futures": AttributeError: 'NoneType' object has no attribute 'lower'

    ~/git/github/tinkproject API2 > docker run --rm -it -v $(pwd):/app tinkproject:25.12.2021-45-gd94e6d3 40s 12:21:43 05:22:19 [INFO] root: Start 05:22:19 [INFO] Parser: getting accounts 05:22:19 [INFO] Parser: accounts received 05:22:19 [INFO] root: Account(id='2018218533', name='Брокерский счёт', opened_date=seconds: 1578787200 , closed_date=, type=1, status=2) 05:22:19 [WARNING] root: Account 2018218533 (Тинькофф) - parsing is OFF 05:22:19 [INFO] root: Account(id='2018327417', name='ИИС', opened_date=seconds: 1578960000 , closed_date=, type=2, status=2) 05:22:23 [INFO] Parser: portfolio received 05:22:23 [INFO] Parser: investing period: 2 years 0 months 11 days 05:22:24 [INFO] root: creating position objects.. 05:22:24 [INFO] root: 8 positions in portfolio 05:22:24 [INFO] root: 368 operations in period 05:22:33 [WARNING] root: Вероятно, был обратный сплит TCS0BMDKNM37 - отношение цен 27:1 05:22:33 [WARNING] root: Вероятно, был обратный сплит TCS0BMDKNM37 - отношение цен 3:1 05:22:34 [WARNING] root: Вероятно, был обратный сплит TCS0BMDKNM37 - отношение цен 42:1 05:22:34 [INFO] root: FinEx Акций компаний развитых стран без США 05:22:39 [WARNING] root: Вероятно, был обратный сплит BBG333333333 - отношение цен 10:1 05:22:39 [WARNING] root: Вероятно, был обратный сплит BBG333333333 - отношение цен 3:1 05:22:45 [INFO] root: Тинькофф iMOEX 05:22:56 [INFO] root: FinEx Акции китайских компаний 05:23:26 [ERROR] tgrpc: Got GRPC error in get_last_price_raw 05:23:26 [ERROR] tgrpc: <_InactiveRpcError of RPC that terminated with: status = StatusCode.UNAVAILABLE details = "Socket closed" debug_error_string = "{"created":"@1643001806.663930998","description":"Error received from peer ipv4:91.194.227.80:443","file":"src/core/lib/surface/call.cc","file_line":1074,"grpc_message":"Socket closed","grpc_status":14}" 05:23:26 [ERROR] tgrpc: StatusCode.UNAVAILABLE 05:23:26 [ERROR] Parser: Get current market price error. 05:23:26 [ERROR] Parser: 'NoneType' object is not subscriptable 05:23:37 [INFO] root: Тинькофф Вечный портфель EUR 05:23:47 [WARNING] root: Вероятно, был обратный сплит BBG00NJ6XQ74 - отношение цен 62:1 05:23:47 [WARNING] root: Вероятно, был обратный сплит BBG00NJ6XQ74 - отношение цен 498:1 05:23:47 [WARNING] root: Вероятно, был обратный сплит BBG00NJ6XQ74 - отношение цен 332:1 05:23:51 [INFO] root: Сбер Индекс Мосбиржи ОФЗ 05:24:02 [INFO] root: FinEx Акции американских компаний 05:24:13 [INFO] root: Евро Traceback (most recent call last): File "/app/./main.py", line 478, in my_positions = creating_positions_objects() File "/app/./main.py", line 127, in creating_positions_objects if this_pos_instrument.type.lower() == "futures": AttributeError: 'NoneType' object has no attribute 'lower'

    bug 
    opened by evgkrsk 5
  • Implemented multiple currencies and DB

    Implemented multiple currencies and DB

    Можно задавать любое количество валют, входящих в ЦБ РФ. Вся информация по валюте (название, figi, формат вывода числа) хранится в файле currencies.py

    Запрашивает центробанк только если не нашелся курс в базе на нужную дату, большая часть - заполняется при первом прогоне.

    Сейчас прописал только Швейцарский франк, но можно и остальные из тинькоффского списка прописать. Вероятно, в понедельник допишу HKD и допишу CHF.

    Реализовано:

    • Возможность прописывать дополнительные валюты
    • Кэш инструментов (на 1 неделю) и рыночных цен (на 10 минут)
    • fixes #22 - проблема полностью закрыта, в том числе за счет обработки исключений.
    • fixes #32 - запрашивает исторические свечи и смотрит цену

    Проблемы:

    • где и как разместить списки курсов валют ЦБ-рынок на сегодня? Под таблицей?
    • На данный момент API тинькова не отдает дополнительные валюты как находящиеся в составе портфеля, так и через запрос валютных пар.
    opened by alexanderkmd 5
  • Division by Zero

    Division by Zero

    File "./main.py", line 245, in my_positions = creating_positions_objects() File "./main.py", line 73, in creating_positions_objects percent_change = ((market_price / this_pos.average_position_price.value) * 100) - 100 decimal.InvalidOperation: [<class 'decimal.DivisionUndefined'>]

    Похоже что пытается поделить на ноль. У меня есть акции VTRS, которые достались мне выделением от PFE по нулевой цене :)

    opened by demon-ru 5
  • UnexpectedError: 401 при запуске

    UnexpectedError: 401 при запуске

    При запуске вылетает с ошибкой: D:\tinkproject-main>python main.py 00:37:15 [INFO] root: Start 00:37:15 [INFO] Parser: getting accounts Traceback (most recent call last): File "D:\tinkproject-main\main.py", line 451, in accounts = data_parser.get_accounts() File "D:\tinkproject-main\data_parser.py", line 68, in get_accounts accounts = client.get_accounts() File "C:\Users\Admin\AppData\Roaming\Python\Python310\site-packages\tinvest\clients.py", line 731, in get_accounts return accounts_get( File "C:\Users\Admin\AppData\Roaming\Python\Python310\site-packages\tinvest\apis.py", line 394, in accounts_get return request( File "C:\Users\Admin\AppData\Roaming\Python\Python310\site-packages\tinvest\clients.py", line 537, in _request raise UnexpectedError(response.status_code, response.text) tinvest.exceptions.UnexpectedError: 401

    файл my_account.txt состоит из след строчек: t.3QQ_a8KQQuaCxaLPXXXXXXXXXXXXXXXXXXXXXXXXXXfJ_Iyl1R5G638ЧЧ5JWoS4_JP3dQ Asia/Novosibirsk 2022 01 14

    токен брал такой: Все счета - Полный доступ

    При этом не вижу появившегося лога. Пробовал с запустить с опцией -d => python -d main.py тоже лога не вижу.

    opened by Starmont 4
  • Пустые сделки в отчете.

    Пустые сделки в отчете.

    Как советовали на Хабре.

    "не хватает проверки статуса операции в create_operations_objects. В противном случае в отчете показываются и отмененные заявки"

    Человет добавил пару строк в файл main.py (у меня это строка 312).

     for this_op in operations.payload.operations:
            if this_op.status != 'Done':
                continue
    

    Добавил себе, прогнал. Реально помогло. Рекомендую в прод.

    enhancement 
    opened by IntelOut 4
  • Create parts-statistics tables

    Create parts-statistics tables

    Добавил закладку со статистикой по типам активов, валютам и их долям в портфеле.

    Примерный вид таблиц:

      |   | Value | Value RUB | Currency % | Total % -- | -- | -- | -- | -- | -- RUB | Stock | 64 405,99   ₽ | 64 405,99   ₽ | 52,5 | 40,2 76,5 % | Bond | 10 945,73   ₽ | 10 945,73   ₽ | 8,9 | 6,8   | Etf | 45 522,31   ₽ | 45 522,31   ₽ | 37,1 | 28,4   | Currency | 1 896,63   ₽ | 1 896,63   ₽ | 1,5 | 1,2   |   | 122 770,66   ₽ |122 770,66   ₽ |   |     |   |   |   |   |   USD | Stock | 396,68   $ | 29 033,49   ₽ | 77,4 | 18,1 23,4 % | Etf | 100,44   $ | 7 351,32   ₽ | 19,6 | 4,6   | Currency | 15,64   $ | 1 141,56   ₽ | 3,1 | 0,7   |   | 512,76   $ | 37 526,37   ₽ |   |     |   |   |   |   |   EUR | Currency | 1,00   € | 86,40   ₽ | 100,0 | 0,1 0,1 % |   | 1,00   € | 86,40   ₽ |   |  

    Таблица 2:

      | Stock | Bond | Etf | Other | Currency |   -- | -- | -- | -- | -- | -- | -- RUB | 40,2 | 6,8 | 28,4 |   | 1,2  | 76,5 % USD | 18,1 |   | 4,6 |   | 0,7 | 23,4 % EUR |   |   |   |   | 0,1 | 0,1 %   | 58,3 % | 6,8 % | 33,0 % |   | 0,8 % |  

    • Изменение: актуализировал вид таблиц
    opened by alexanderkmd 4
  • Неверно вычет налога

    Неверно вычет налога

    Странная ситуация, имею несколько рублевых акций, по одной, как ни странно по TCS имею положительную динамику. Но почему то в таблице налог считается не по exp.yield, а на всю сумму market value.

    opened by glemag 4
  • Табличка расчета вычета по ИИС налезает на историю купонов и дивидендов за прошлый год

    Табличка расчета вычета по ИИС налезает на историю купонов и дивидендов за прошлый год

    Привет! В отчете по счету ИИС на листе "Coupons and Dividends" табличка с вычетами начинается с ячейки J6, и записывается поверх последних операций за предыдущий год. Кажется, что лучше эту табличку переместить на другой лист, где она не будет мешаться. Например, на лист portfolio или вообще на новый лист

    bug 
    opened by talvind 3
  • Нет поддержки инструментов в юанях

    Нет поддержки инструментов в юанях

    Traceback (most recent call last): File "D:\Nextcloud\Work\HiLevel!Python\Finance\tinkproject-API2\tinkproject-API2\main.py", line 479, in my_positions = creating_positions_objects() File "D:\Nextcloud\Work\HiLevel!Python\Finance\tinkproject-API2\tinkproject-API2\main.py", line 124, in creating_positions_objects market_rate = market_rate_today[currency] KeyError: 'CNY'

    opened by emptymind 0
  • Ошибка при первом запуске - UnicodeEncodeError: 'charmap' codec can't encode characters in position 8-17: character maps to <undefined>

    Ошибка при первом запуске - UnicodeEncodeError: 'charmap' codec can't encode characters in position 8-17: character maps to

    15:26:56 [INFO] root: Start 15:26:56 [INFO] Parser: getting accounts 15:26:57 [INFO] Parser: accounts received 15:26:57 [INFO] Config: New account found - 2000223111 - Брокерский счёт - adding config Traceback (most recent call last): File "D:\tinkproject-API2\main.py", line 461, in accounts = data_parser.get_accounts() File "D:\tinkproject-API2\data_parser.py", line 74, in get_accounts config.check_accounts_config(accounts) File "D:\tinkproject-API2\configuration.py", line 100, in check_accounts_config self._write_config_to_file() File "D:\tinkproject-API2\configuration.py", line 63, in _write_config_to_file yaml.dump(self.config, File "C:\Users\USERNAME\AppData\Local\Programs\Python\Python310\lib\site-packages\yaml_init.py", line 253, in dump return dump_all([data], stream, Dumper=Dumper, **kwds) File "C:\Users\USERNAME\AppData\Local\Programs\Python\Python310\lib\site-packages\yaml_init.py", line 241, in dump_all dumper.represent(data) File "C:\Users\USERNAME\AppData\Local\Programs\Python\Python310\lib\site-packages\yaml\representer.py", line 28, in represent self.serialize(node) File "C:\Users\USERNAME\AppData\Local\Programs\Python\Python310\lib\site-packages\yaml\serializer.py", line 54, in serialize self.serialize_node(node, None, None) File "C:\Users\USERNAME\AppData\Local\Programs\Python\Python310\lib\site-packages\yaml\serializer.py", line 108, in serialize_node self.serialize_node(value, node, key) File "C:\Users\USERNAME\AppData\Local\Programs\Python\Python310\lib\site-packages\yaml\serializer.py", line 108, in serialize_node self.serialize_node(value, node, key) File "C:\Users\USERNAME\AppData\Local\Programs\Python\Python310\lib\site-packages\yaml\serializer.py", line 89, in serialize_node self.emit(ScalarEvent(alias, node.tag, implicit, node.value, File "C:\Users\USERNAME\AppData\Local\Programs\Python\Python310\lib\site-packages\yaml\emitter.py", line 115, in emit self.state() File "C:\Users\USERNAME\AppData\Local\Programs\Python\Python310\lib\site-packages\yaml\emitter.py", line 412, in expect_block_mapping_simple_value self.expect_node(mapping=True) File "C:\Users\USERNAME\AppData\Local\Programs\Python\Python310\lib\site-packages\yaml\emitter.py", line 244, in expect_node self.expect_scalar() File "C:\Users\USERNAME\AppData\Local\Programs\Python\Python310\lib\site-packages\yaml\emitter.py", line 268, in expect_scalar self.process_scalar() File "C:\Users\USERNAME\AppData\Local\Programs\Python\Python310\lib\site-packages\yaml\emitter.py", line 533, in process_scalar self.write_plain(self.analysis.scalar, split) File "C:\Users\USERNAME\AppData\Local\Programs\Python\Python310\lib\site-packages\yaml\emitter.py", line 1132, in write_plain self.stream.write(data) File "C:\Users\USERNAME\AppData\Local\Programs\Python\Python310\lib\encodings\cp1252.py", line 19, in encode return codecs.charmap_encode(input,self.errors,encoding_table)[0] UnicodeEncodeError: 'charmap' codec can't encode characters in position 8-17: character maps to

    opened by profarvin 0
  • Ошибка в Версии APIv2 по фьючерсам.

    Ошибка в Версии APIv2 по фьючерсам.

    Начал баловаться фьючерсами. После этого при запуске получаю ошибку.

    04:15:00 [ERROR] tgrpc: Got error in get_future_margin 04:15:00 [ERROR] tgrpc: conversion from Quotation to Decimal is not supported 04:15:00 [ERROR] Parser: Get current market price error. 04:15:00 [ERROR] Parser: 'NoneType' object has no attribute 'min_price_increment' 04:15:00 [ERROR] tgrpc: Got error in get_future_margin 04:15:00 [ERROR] tgrpc: conversion from Quotation to Decimal is not supported Traceback (most recent call last): File "/app/./main.py", line 479, in <module> my_positions = creating_positions_objects() File "/app/./main.py", line 128, in creating_positions_objects average_position_price = data_parser.tinkoff_access.futures_price_calculation( File "/app/tgrpc/__init__.py", line 75, in wrapper return_val = func(self, *args, **kwargs) File "/app/tgrpc/__init__.py", line 421, in futures_price_calculation min_price_increment = margin.min_price_increment AttributeError: 'NoneType' object has no attribute 'min_price_increment'

    opened by IntelOut 0
  • Отправка результатов файлов на ftp/smb.

    Отправка результатов файлов на ftp/smb.

    Для себя еще сделал отправку файлов на FTP. Мне так удобно получать результаты. Единственное, оно сделано через пень колоду. Не так силен я в программировании. :) Сделал по аналогии с использованием ТХТ файла конфига creds.txt где каждая по-строчно прописан: хост, логин, пасс, папка куда складывать файлы. Как вариант внести данные настройки в yaml файл.

    В excel_builder.py добавлено:

    import os
    import ftplib
    ...
        #FTP send and delete + check for creds.txt
        if os.path.isfile('creds.txt'):
            filename = excel_file_name
            con = ftplib.FTP(host, ftp_user, ftp_password)
            con.cwd(ftp_dir) #
            f = open(filename, "rb")
            send = con.storbinary("STOR "+ filename, f)
            logger.info('Excel file sent to FTP: '+excel_file_name)
            con.close
            if os.path.isfile(excel_file_name):
                   os.remove(excel_file_name)
                   print("Success: Deleted "+excel_file_name)
            else:
                   print(excel_file_name+" - File doesn't exists!")
        else:
            print("No creds.txt file exist, skipping FTP send.")
    

    В версии APIv2 работает. Можно добавить отправку в SMB папку. Как вариант добавление фичи в прод по желанию автора...

    opened by IntelOut 0
  • API2: Ошибка при первом запуске, построении отчета

    API2: Ошибка при первом запуске, построении отчета

    12:51:19 [DEBUG] root: Отношение цен - 1.000137797988149373019153920
    12:51:21 [INFO] root: Royal Dutch Shell (A)
    12:51:21 [DEBUG] Parser: Instrument for BBG00QPYJ5H0 found in DB
    Traceback (most recent call last):
      File "/app/./main.py", line 479, in <module>
        my_positions = creating_positions_objects()
      File "/app/./main.py", line 138, in creating_positions_objects
        ave_buy_price_rub = calculate_ave_buy_price_rub(this_pos)
      File "/app/./main.py", line 96, in calculate_ave_buy_price_rub
        logger.warning('unknown currency in position: ' + this_pos.name)
    AttributeError: 'PortfolioPosition' object has no attribute 'name'
    
    bug 
    opened by chelishchev 5
  • [Feature Request] Аналитика: состав портфеля

    [Feature Request] Аналитика: состав портфеля

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

    enhancement 
    opened by 3XclusiVe 2
Releases(v2.5)
  • v2.5(Aug 13, 2021)

  • v2.4(Aug 6, 2021)

    Внизу страницы с портфелем добавил пояснения на русском языке по каждому параметру

    Source code(tar.gz)
    Source code(zip)
  • v2.3(Aug 4, 2021)

    В этом обновлении я добавил новый лист, который будет интересен инвесторам с дивидендным портфелем. На данном листе все полученные купоны и дивиденды собраны по годам и выводится их сумма с вычетом налогов (кроме налога в 3%, если вы подписывали форму W-8BEN). Фишкой является показатель: "average monthly salary for the last 12 months" - это ваша дивидендная зарплата за последний год.

    Source code(tar.gz)
    Source code(zip)
  • v2.2(Aug 3, 2021)

    В данном обновлении была решена проблема, на которую указали пользователи, а именно: При расчёте ожидаемого налога с прибыли, не учитывалось его снижение при наличии убытков. Немного изменён внешний вид таблицы - теперь отображаются положительная и отрицательная налоговые базы (если можно так выразиться). Однако, этот ожидаемый налог (expected tax) показывает, какой налог светит при фиксации всего портфеля без учёта 3-х летней налоговой льготы и других льгот. И он не учитывает, тот налог, который уже набежал на прибыль по ранее закрытым в этом году позициям.

    Source code(tar.gz)
    Source code(zip)
52pojie 吾爱破解论坛 签到 支持云函数/服务器等Py3环境运行

52pojie-Checkin 52pojie 吾爱破解论坛 签到 Py3单程序 支持云函数/服务器等Py3环境运行 只需要Cookie即可运行 新版说明 依赖包请用项目 https://github.com/BlueSkyXN/requirements-serverless 需要填写的参数有 co

BlueSkyXN 22 Sep 15, 2022
A simple test repo created following docker docs.

docker_sampleRepo A simple test repo created following docker docs. Link to docs: https://docs.docker.com/language/python/develop/ Other links: https:

Suraj Verma 2 Sep 16, 2022
Google Sheets Python API v4

pygsheets - Google Spreadsheets Python API v4 A simple, intuitive library for google sheets which gets your work done. Features: Open, create, delete

Nithin Murali 1.4k Jan 08, 2023
An asyncio Python wrapper around the Discord API, forked off of Rapptz's Discord.py.

Novus A modern, easy to use, feature-rich, and async ready API wrapper for Discord written in Python. A full fork of Rapptz's Discord.py library, with

Voxel Fox 60 Jan 03, 2023
Set up recurring buys in Gemini

Overview Set up recurring buys in Gemini. Given some keys (Create API Keys), allows you to configure a recurring buy using the reduced API maker and t

Ahmad Abuomar 3 Jan 06, 2022
基于nonebot2的twitter推送插件

HanayoriBot(Twitter插件) ✨ 基于NoneBot2的Twitter推送插件,自带百度翻译接口 ✨ 简介 本插件基于NoneBot2与go-cqhttp,可以及时将Twitter用户的最新推文推送至群聊,并且自带基于百度翻译的推文翻译接口,及时跟进你所关注的Vtuber的外网动态。

鹿乃まほろ / Mahoro Kano 16 Feb 12, 2022
A tool written in Python used to instalock agents in VALORANT using the local API.

Valorant Instalock Tool v2.1.0 by Mr. SOSA A tool written in Python used to instalock agents in VALORANT using the local API. This is NOT a hotkey pro

Mr. SOSA 3 Nov 18, 2021
A file-based quote bot written in Python

Let's Write a Python Quote Bot! This repository will get you started with building a quote bot in Python. It's meant to be used along with the Learnin

0 Jan 20, 2022
A wrapper for the Discord Python Pixels API.

DPYPX A simple wrapper around Python Discord Pixels. Requires Python 3.7+ (3.x where x = 7). Requires pillow and aiohttp from pip. Example import dpy

Artemis 3 Oct 01, 2022
A simple, infinitely scalable, SQS based queue.

SimpleQ A simple, infinitely scalable, SQS based queue. Meta Author: Randall Degges Email: [emai

Randall Degges 162 Dec 21, 2022
alpaca-trade-api-python is a python library for the Alpaca Commission Free Trading API.

alpaca-trade-api-python is a python library for the Alpaca Commission Free Trading API. It allows rapid trading algo development easily, with support for both REST and streaming data interfaces

Alpaca 1.5k Jan 09, 2023
Dicha herramienta esta creada con una api... esta api permite enviar un SMS cada 12 horas dependiendo del pais... Hay algunos paises y operadoras no están soportados.

SMSFree pkg install python3 pip install requests git clone https://github.com/Hidden-parker/SMSFree cd SMSFree python sms.py DISFRUTA... Dicha herrami

piter 2 Nov 14, 2021
Versatile async-friendly library to retry failed operations with configurable backoff strategies

riprova riprova (meaning retry in Italian) is a small, general-purpose and versatile Python library that provides retry mechanisms with multiple backo

Tom 108 Apr 27, 2022
Easy & powerful bot to check if your all Telegram bots are working or not

Easy & powerful bot to check if your all Telegram bots are working or not. This bot status bot updates every 105 minutes & runs for 24x7 hours.

35 Dec 30, 2022
Nasdaq Cloud Data Service (NCDS) provides a modern and efficient method of delivery for realtime exchange data and other financial information. This repository provides an SDK for developing applications to access the NCDS.

Nasdaq Cloud Data Service (NCDS) Nasdaq Cloud Data Service (NCDS) provides a modern and efficient method of delivery for realtime exchange data and ot

Nasdaq 8 Dec 01, 2022
🐲 Powerfull Discord Token Stealer made in python

🐲 Follow me here 🐲 Discord | YouTube | Github ☕ Usage 💻 Downloading git clone https://github.com/KanekiWeb/Powerfull-Token-Stealer

Kaneki 61 Dec 19, 2022
A discord bot written in discord.py to manage custom roles assigned to boosters of your server.

BBotty A discord bot written in discord.py to manage custom roles assigned to boosters of your server. v0.0.1-alpha released! This version is incomple

Oui002 1 Nov 27, 2021
Infinity: a Twitter retweet bot that can be used by anyone

INSTAMATE Requires Firefox Instapy Python3 How To Use? Fork the repository Add your credentials in the bot.py file Save commits Clone your fork cd int

unofficialdxnny 3 Jun 23, 2022
A Telegram bot that add a dynamic caption to musics

Music Channel Manager A Telegram bot that add a dynamic caption to musics Deploy to Heroku What is it ? It manage your music channel. With just adding

13 Oct 18, 2022
Accurately dump Commodore 64 tapes

TrueTape64 A cheap, easy to build adapter to interface a Commodore 1530 (C2N) Datasette to your PC to dump and preserve your aging Commodore 64 softwa

francesco 38 Dec 03, 2022