Метод getPortfolio был и в первой версии API Тинькофф Инвестиций. Во второй версии API v2 этот метод делает тоже самое — отдает информацию по текущим позициям в портфеле и информацию по «бумажной» доходности открытых позиций. В самом методу get_portfolio нет информации по налогам и комиссии Тинькофф Инвестиций, если бы мы решили полностью все распродать. Но я могут это все рассчитать по данным полученным через обращение к методу get_portfolio. Подробно об этом методе в видео:
Полезные ссылки
- Описание метода getPortfolio в API v2 Тинькофф Инвестиции
- Видео по установке SDK для Python и получение токенов
- Полный плейлист по API v2 Тиньков Инвестиции
Код из видео
Пока я снимал видео команда Тиньков Инвестиции обновила API. Многие типы кот были float/int … стали Quotation. SDK тоже обновился. В видео все ещё для старой версии, код ниже поправлен уже под новую. Для обновления SDK
1 2 |
pip install tinkoff-investments -U pip show tinkoff-investments # д.б. версия не ниже b13, для более старых будут ошибки или пустые данные |
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 |
from tinkoff.invest import Client, RequestError, PortfolioResponse, PositionsResponse, PortfolioPosition import creds import pandas as pd pd.set_option('display.max_rows', 500) pd.set_option('display.max_columns', 500) pd.set_option('display.width', 1000) """ Для видео по get_portfolio https://tinkoff.github.io/investAPI/operations/#portfoliorequest https://tinkoff.github.io/investAPI https://github.com/Tinkoff/invest-python """ def run(): try: with Client(creds.token_ro_acc_main) as client: # т.к. есть валятные активы (у меня etf), то нужно их отконвертить в рубли # я работаю только в долл, вам возможно будут нужны и др валюты u = client.market_data.get_last_prices(figi=['USD000UTSTOM']) usdrur = cast_money(u.last_prices[0].price) r : PortfolioResponse = client.operations.get_portfolio(account_id=creds.account_id_main) df = pd.DataFrame([portfolio_pose_todict(p, usdrur) for p in r.positions]) print(df.head(100)) print("bonds", cast_money(r.total_amount_bonds), df.query("instrument_type == 'bond'")['sell_sum'].sum(), sep=" : ") print("etfs", cast_money(r.total_amount_etf), df.query("instrument_type == 'etf'")['sell_sum'].sum(), sep=" : ") print(df['comission'].sum()) except RequestError as e: print(str(e)) def portfolio_pose_todict(p : PortfolioPosition, usdrur): r = { 'figi': p.figi, 'quantity': cast_money(p.quantity), 'expected_yield': cast_money(p.expected_yield), 'instrument_type': p.instrument_type, 'average_buy_price': cast_money(p.average_position_price), 'currency': p.average_position_price.currency, 'nkd': cast_money(p.current_nkd), } if r['currency'] == 'usd': # если бы expected_yield быk бы тоже MoneyValue, # то конвертацию валюты можно было бы вынести в cast_money r['expected_yield'] *= usdrur r['average_buy_price'] *= usdrur r['nkd'] *= usdrur r['sell_sum'] = (r['average_buy_price']*r['quantity']) + r['expected_yield'] + (r['nkd']*r['quantity']) r['comission'] = r['sell_sum']*0.003 r['tax'] = r['expected_yield']*0.013 if r['expected_yield'] > 0 else 0 return r def cast_money(v): """ https://tinkoff.github.io/investAPI/faq_custom_types/ :param v: :return: """ return v.units + v.nano / 1e9 # nano - 9 нулей |
В коде и те доработки, о кот. я говорил в финале видео! Надеюсь вы и без меня разобрались, а возможно и лучше сделали!
Аноним 2023-03-31