В терминале Тинькофф Инвестиции вы видите так называемый тикер ценной бумаги. Это набор длиной до 6 символов уникальный на бирже где выпускается эта ценная бумага. AAPL или AGRO — это тикер. Подробнее про тикер можно почитать в википедии. Кроме тикера существуют и другие идентификаторы ценных бумаг, такие как FIGI, ISIN и другие. У этой ситуации есть причины, подробнее о них написаны по ссылкам в википедии, но факт в том что в терминале Тиньков Инвестиций мы видим Тикер и он достаточно хорошо идентифицирует нам ценную бумагу. Однако когда мы решаем воспользоваться API Тинькофф Инвестиции, то неожиданно обнаруживаем что там основным идентификатором бумаги является не тикер, а фиги.
OpenFigi
Если погуглить то легко обнаружить проект OpenFigi, в котором, вроде бы, можно найти нужный figi по тикеру. Сходу не понятно как искать и какой figi использовать (для Мосбиржи Exchange Code == RX и берем FIGI Composite). А потом оказывается что часть Figi полученных на OpenFigi работают, а часть нет. А все потому что:
В контексте работы с TINKOFF INVEST API основным идентификатором инструмента является Figi. Нужно понимать, что не все инструменты, доступные в Тинькофф Инвестициях, имеют общепринятый Figi. Поэтому не гарантируется уникальность инструментов с другими источниками. Узнать актуальный Figi-идентификатор инструмента можно при помощи методов сервиса инструментов.
https://tinkoff.github.io/investAPI/faq_instruments/
Получение figi по ticker с помощью Python + API Тинькофф Инвестиции
В итоге приходится писать код, в моем случае на Python, для получения именно тиньковских figi, которые будут работать в этом 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 |
from pandas import DataFrame from tinkoff.invest import Client, InstrumentStatus, SharesResponse, InstrumentIdType from tinkoff.invest.services import InstrumentsService, MarketDataService 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) TICKER = "TMOS" def run(): with Client(creds.token_ro_all) as cl: instruments: InstrumentsService = cl.instruments market_data: MarketDataService = cl.market_data # r = instruments.share_by(id_type=InstrumentIdType.INSTRUMENT_ID_TYPE_FIGI, id="BBG004S683W7") # print(r) l = [] for method in ['shares', 'bonds', 'etfs']: # , 'currencies', 'futures']: for item in getattr(instruments, method)().instruments: l.append({ 'ticker': item.ticker, 'figi': item.figi, 'type': method, 'name': item.name, }) df = DataFrame(l) # df.to_json() df = df[df['ticker'] == TICKER] if df.empty: print(f"Нет тикера {TICKER}") return # print(df.iloc[0]) print(df['figi'].iloc[0]) if __name__ == '__main__': print("** Hola Hey, Azzrael Code YT subs!!!\n") run() |