API de Tinkov, inversión. Primeros pasos

Casi desde los primeros días me hice cliente de Tinkov. Investments.

Y a partir de ese momento, me atormentan vagas dudas: ¿el relato personal refleja la realidad objetiva?

El hecho es que compro valores denominados en dólares, pero en LC los precios de todos los activos se muestran en dólares y el valor total de la cartera en rublos.

¿Y no entiendo si el dólar ha crecido o soy un inversionista tan exitoso?

Pero, ¿qué pasa con las comisiones, los impuestos y otros dividendos?

Me gustaría tomar todas mis transacciones y escribirlas en FIFO, como en la contabilidad de acciones ... Y poner los dividendos recibidos en la parte superior, y luego deducir impuestos.

Y luego veré el resultado que entiendo.

Resultó que Tinkov tiene una API que le permite escribir robots comerciales (no estoy interesado en absoluto en esto), así como cargar datos sobre su cartera y operaciones.

Esta API tiene una descripción oficial, pero no todo estaba claro para mí, tenía que entenderlo.
Los resultados de estos enfrentamientos se presentan a su atención.

Enlaces útiles: descripción de la

API
Otra descripción

Obtener un token e instalar una biblioteca


Antes de comenzar, debe instalar la biblioteca y obtener un token.

Instalación de la biblioteca:

pip install -i https://test.pypi.org/simple/ --extra-index-url=https://pypi.org/simple/ tinkoff-invest-openapi-client

Cito el token oficial que recibe las instrucciones:

  1. Inicie sesión en su cuenta en tinkoff.ru
  2. Ir a la sección de inversiones
  3. Ir a la configuración
  4. La función "Confirmación de transacciones por código" debe estar deshabilitada
  5. Emita el token OpenApi para el intercambio y Sandbox. Quizás el sistema le pedirá que inicie sesión nuevamente, no se preocupe, esto es necesario para conectar el robot a la plataforma de negociación.
  6. Copie el token y guarde, el token se muestra solo una vez, no podrá verlo más tarde, sin embargo, puede emitir un número ilimitado de tokens.

Al momento de escribir, el token se emitió en la página www.tinkoff.ru/invest/settings , un botón en la parte inferior de la página.

imagen

Tuve errores con el token para el sandbox, así que comencé a experimentar con la versión de combate. Lo que deseo para usted (Precaución: no compre-venda por accidente algo extra).

Iniciar sesión


from openapi_client import openapi

token = '    '  
client = openapi.api_client(token)

Estas dos líneas hacen todo lo que necesitamos.

A continuación, trabajamos con la variable cliente.

¿Qué hay en nuestro portafolio?


Obtenga los contenidos de nuestra cartera:

pf = client.portfolio.portfolio_get()

Veamos los datos básicos del primer elemento:

print('value:', pf.payload.positions[0].average_position_price.value)
print('currency:', pf.payload.positions[0].average_position_price.currency)
print('balance:', pf.payload.positions[0].balance)
print('figi:', pf.payload.positions[0].figi)
print('ticker:', pf.payload.positions[0].ticker)
print('name:', pf.payload.positions[0].name)

En mi caso, esto es:

value: 45.98
currency: USD
balance: 21.0
figi: BBG000BWPXQ8
ticker: BTI
name: British American Tobacco

valor -
Balance de precios en papel - El número de valores en la cartera, valor y moneda - su valor monetario.

figi - el instrumento financiero de Global the Identifier (Global Financial Instrument Identifier)
ticker - Ticker activo.

A partir de estos datos, podemos averiguar el nombre legible por humanos del activo.

Para esta solicitud, no necesitamos esto (ver el campo de nombre), pero en otros casos será útil.

Obtenga el nombre del artículo por FIGI y boleto


#    FIGI
instr = client.market.market_search_by_figi_get('BBG000BWPXQ8') 
instr

Obtenemos:

{'payload': {'currency': 'USD',
             'figi': 'BBG000BWPXQ8',
             'isin': 'US1104481072',
             'lot': 1,
             'min_price_increment': 0.01,
             'name': 'British American Tobacco',
             'ticker': 'BTI',
             'type': 'Stock'},
 'status': 'Ok',
 'tracking_id': 'a1979917d2141916'}

Esta función API funciona para mí como debería. Vemos que 'BBG000BWPXQ8' -> 'British American Tobacco'.

Pero la búsqueda del nombre del activo por ticker no funciona para mí: ((((

instr = client.market.market_search_by_ticker_get('BTI' ) 
print(instr)

Los desarrolladores sugirieron actualizar la biblioteca, pero incluso después de eso no despegó.

Descargar el directorio de valores


Sin embargo, resolví este problema radicalmente. Descargué de Tinkov un directorio completo de activos negociados:

#   
bonds = client.market.market_bonds_get() 

#   ETF
etfs = client.market.market_etfs_get() 

#   
stocks = client.market.market_stocks_get() 

instr_list = bonds.payload.instruments + etfs.payload.instruments + stocks.payload.instruments

instr_list[:3]
tiene
[{'currency': 'RUB',
  'figi': 'BBG00844BD08',
  'isin': 'RU000A0JU898',
  'lot': 1,
  'min_price_increment': 0.1,
  'name': '  9',
  'ticker': 'RU000A0JU898'}, {'currency': 'RUB',
  'figi': 'BBG00R05JT04',
  'isin': 'RU000A1013Y3',
  'lot': 1,
  'min_price_increment': 0.1,
  'name': ' \xa02',
  'ticker': 'RU000A1013Y3'}, {'currency': 'RUB',
  'figi': 'BBG00PNLY692',
  'isin': 'RU000A100DC4',
  'lot': 1,
  'min_price_increment': 0.1,
  'name': '- 002P  2',
  'ticker': 'RU000A100DC4'}]

Como puede ver, figi y nombre están ahí. Para mis propósitos, más que suficiente.

Obtenga una lista de operaciones


Pero lo más interesante es obtener una lista de mis operaciones. Las siguientes acciones se incluyen en la operación (en mi caso):

  • PayIn - Reposición de cuenta de corretaje
  • PayOut - Retirar dinero
  • BuyCard - Compre de una tarjeta
  • Venta - Venta
  • BrokerCommission - Broker Commission
  • Dividendo - Pago de dividendos
  • Impuesto - Impuestos
  • TaxDividend- Dividend Taxes
  • ServiceCommission - Tarifa de servicio

Código para descargar una cartera:

from datetime import datetime
from pytz import timezone

#     30  2016 (      )
d1 = datetime(2016, 9, 30, 0, 0, 0, tzinfo=timezone('Europe/Moscow'))  # timezone  .  - 
d2 = datetime.now(tz=timezone('Europe/Moscow'))  #   
ops = client.operations.operations_get(_from=d1.isoformat(), to=d2.isoformat())
Vamos a ver que pasó. En mi caso, este elemento es de interés.
ops.payload.operations[217]
Eso es lo que es
{'commission': {'currency': 'USD', 'value': -0.42},
 'currency': 'USD',
 'date': datetime.datetime(2018, 11, 7, 10, 55, 53, 648913, tzinfo=tzoffset(None, 10800)),
 'figi': 'BBG000PSKYX7',
 'id': '42281525510',
 'instrument_type': 'Stock',
 'is_margin_call': False,
 'operation_type': 'BuyCard',
 'payment': -141.05,
 'price': 141.05,
 'quantity': 4,
 'status': 'Done',
 'trades': [{'date': datetime.datetime(2018, 11, 7, 10, 55, 53, 648913, tzinfo=tzoffset(None, 10800)),
             'price': 141.05,
             'quantity': 1,
             'trade_id': '42636800'}]}

Estamos interesados ​​en los campos:

  • fecha - fecha de transacción
  • figi - código de activo
  • tipo_operación - tipo de operación
  • pago: el monto de la transacción. Para impuestos o comisiones, es ella quien está indicada. precio mientras ninguno
  • precio - precio de un papel
  • cantidad - cantidad planificada de valores
  • oficios - ofertas de intercambio real

La pregunta surgió de inmediato: ¿por qué necesitamos algunos intercambios si hay precio y cantidad?

No todo es tan simple (plan y realidad)


Según tengo entendido, la cantidad indica la cantidad de papeles que quería comprar. Y lo que realmente se compra reside en los intercambios [i] .cantidad.

Aquellos. Si desea recurrir a las transacciones reales, debe resolver lo que hay en las operaciones.

En algunos casos, no hay ninguno, por ejemplo, para impuestos o depósitos / retiros de fondos.

Para obtener números reales, debe mirar las transacciones e intercambiar transacciones:

for op in ops.payload.operations: #  
    print(op.figi) # figi    
    print(op.operation_type)   #    
    if op.trades == None:      #    
        print('price:', op.price)       #     
        print('payment:', op.payment)   #  
        print('quantity:', op.quantity) #   
    else:     
        for t in op.trades:                   #     -   
            print('price:', t.price)          #     
            print('quantity:', t.quantity)
    print('--------------')

All Articles