Сегодня разбираю метод (endpoint) portfolio из Open API Тинькофф Инвестиций. Этот метод позволяет получить из выбранного портфеля в брокерском аккаунте список всех бумаг, их среднюю цену покупки и ожидаемую прибыль при продаже на момент обращения к API. Этот endpoint можно использовать, например, для расчета прибыльности текущего портфеля при продаже в момент, в том числе для расчета ожидаемой комиссии и налогов.
На канале есть Плейлист Open API Тинькофф Инвестиции. В нем все видео о работе с этим API с самого начала.
Подробный метода разбор смотри в видео:
Код из примера в видео:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 |
import json import requests import tinvest as tinvest from tcs_token import token def get_portfolio(): # авторизация https://tinkoff.github.io/invest-openapi/auth/ headers = {"Authorization": "Bearer %s" % token} # урл до серверов апи https://tinkoff.github.io/invest-openapi/env/ api = 'https://api-invest.tinkoff.ru/openapi/' # метод Портфель https://tinkoff.github.io/invest-openapi/swagger-ui/#/portfolio endpoint = "portfolio" resp = requests.get(api + endpoint, headers=headers).json() # todo: Обработка ошибок разного уровня: транспорта (легли сеть, сервер), превышение лимитов или ошибка в запросе, нужно распарсивать json print(json.dumps(resp, ensure_ascii=False, sort_keys=True, indent=4)) return resp # r = get_portfolio() ################## Использование неофициального Python SDK от @daxartio https://github.com/daxartio/tinvest c = tinvest.SyncClient(token) # для брокерского счета # print(c.get_market_orderbook("BBG0013HGFT4", 1)) # usd = float(c.get_market_orderbook("BBG0013HGFT4", 1).payload.last_price) # цена доллара из стакана, имхо usd = float(c.get_market_orderbook("BBG0013HGFT4", 1).payload.close_price) # цена доллара из стакана, имхо # r = c.get_accounts() # https://tinkoff.github.io/invest-openapi/swagger-ui/#/user # если портфелей несколько, то их нужно указать "brokerAccountId": "string" из endpoint /user/accounts или метода get_accounts r = c.get_portfolio() # print(r) ############ Классы объектов ответа get_portfolio в SDK от @daxartio https://github.com/daxartio/tinvest # tinvest.Portfolio = List[PortfolioPosition] # список объектов класса tinvest.PortfolioPosition # tinvest.PortfolioPosition # class PortfolioPosition(BaseModel): # name: str # Название бумаги # average_position_price: Optional[MoneyAmount] = Field(alias='averagePositionPrice') # сред. цена покупок бумаги в портфеле # average_position_price_no_nkd: Optional[MoneyAmount] = Field( # актуально для облигаций # alias='averagePositionPriceNoNkd' # ) # balance: Decimal # колво акций (не лотов) # lots: int # лот, минимальный объем покупки # blocked: Optional[Decimal] # заблокировано под продажу # expected_yield: Optional[MoneyAmount] = Field(alias='expectedYield') # ожидаемая прибыль НА ВСЮ ПОЗИЦИЮ !!! # figi: str # обязательно # ticker: Optional[str] # isin: Optional[str] # instrument_type: InstrumentType = Field(alias='instrumentType') # stock, bond, etf etc. # class MoneyAmount(BaseModel): # currency: Currency # value: Decimal ################# посчитаю ожидаемую прибыль портфеля за вычетом комиссий и налогов ПРИМЕРНО ! profit = [] sales = [] for p in r.payload.positions: y = float(p.expected_yield.value) # НА ВСЮ ПОЗИЦИЮ, а не на 1 бумагу price = float(p.average_position_price.value) # для долларовых бумаг (доллар в портфеле тоже считается бумагой) if p.expected_yield.currency == tinvest.Currency.usd: y *= usd price *= usd profit.append(y) # налоги считаю по прибыли уменьшая налог. базу убытками sales.append(price*float(p.balance) + y) # комиссию считаю от всей суммы продаж total = { 'sales_total, rub': sum(sales), 'profit_total, rub': sum(profit), } total['taxes'] = total['profit_total, rub']*0.13 # 0.13% НДФЛ total['comission'] = total['sales_total, rub']*0.003 # 0.3% Тариф Инвестор на 2021-07 Тинькофф Инвестиции total['payed_total'] = total['taxes'] + total['comission'] total['money_cleaned'] = total['sales_total, rub'] - total['payed_total'] total['profit_cleaned'] = total['profit_total, rub'] - total['payed_total'] print(json.dumps(total, ensure_ascii=False, indent=4)) |
Если у тебя есть вопросы или замечания смело пиши их в комментариях под видео, я стараюсь реагировать на все.
Я что-то сказал не правильно? Такое тоже может быть и запросто, я сам только разбираюсь с API Тинькофф Инвестиций, — пиши в комментарии ниже. Лайки/дислайки тоже помогают выбирать правильный путь и я благодарен всем зрителям за участие.
А если ты собираешься стать клиентом Тинькофф Инвестиций то сделай это по моей ссылке. Олег обещал мне за это акций аж на 20к руб ))))) за каждого зарегистрировавшегося. Оно конечно вряд ли, но некоторая мотивация создавать контент таки будет…
Егор 2021-07-13