Tinkov API. Investition. Erste Schritte

Fast von den ersten Tagen an wurde ich Kunde von Tinkov. Investments.

Und von diesem Moment an quälen mich vage Zweifel - spiegelt der persönliche Bericht die objektive Realität wider?

Tatsache ist, dass ich auf Dollar lautende Wertpapiere kaufe, aber in LC werden die Preise aller Vermögenswerte in Dollar und der Gesamtwert des Portfolios in Rubel angezeigt.

Und ich verstehe nicht, ob der Dollar gewachsen ist oder ob ich ein so erfolgreicher Investor bin?

Aber was ist mit Provisionen, Steuern und anderen Dividenden?

Ich möchte alle meine Transaktionen in FIFO aufnehmen, wie in der Aktienbuchhaltung ... Und die erhaltenen Dividenden darüber setzen und dann Steuern abziehen.

Und dann sehe ich das Ergebnis, das ich verstehe.

Es stellte sich heraus, dass Tinkov über eine API verfügt, mit der Sie Handelsroboter schreiben können (das interessiert mich überhaupt nicht) und Daten zu seinem Portfolio und seinen Aktivitäten hochladen können.

Diese API hat eine offizielle Beschreibung, aber nicht alles war mir klar, ich musste es verstehen.
Die Ergebnisse dieser Showdowns machen Sie darauf aufmerksam.

Nützliche Links:

API-
Beschreibung Eine weitere Beschreibung

Ein Token erhalten und eine Bibliothek installieren


Bevor Sie beginnen, müssen Sie die Bibliothek installieren und ein Token erhalten.

Bibliotheksinstallation:

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

Ich zitiere die offizielle Token-Empfangsanweisung:

  1. Melden Sie sich bei Ihrem Konto unter tinkoff.ru an
  2. Gehen Sie zum Investmentbereich
  3. Gehe zu den Einstellungen
  4. Die Funktion "Bestätigung von Transaktionen per Code" muss deaktiviert sein
  5. Stellen Sie das OpenApi-Token für den Austausch und die Sandbox aus. Möglicherweise werden Sie vom System aufgefordert, sich erneut anzumelden. Machen Sie sich keine Sorgen. Dies ist erforderlich, um den Roboter mit der Handelsplattform zu verbinden.
  6. Kopieren Sie das Token und speichern Sie es. Das Token wird nur einmal angezeigt. Sie können es später nicht mehr anzeigen. Sie können jedoch eine unbegrenzte Anzahl von Token ausgeben.

Zum Zeitpunkt des Schreibens wurde der Token auf der Seite www.tinkoff.ru/invest/settings ausgegeben , eine Schaltfläche am unteren Rand der Seite.

Bild

Ich hatte Fehler mit dem Token für die Sandbox, also fing ich an, mit der Kampfversion zu experimentieren. Was ich Ihnen wünsche (Achtung: nicht kaufen, versehentlich etwas extra verkaufen).

Anmeldung


from openapi_client import openapi

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

Diese beiden Zeilen machen alles, was wir brauchen.

Als nächstes arbeiten wir mit der Clientvariablen.

Was ist in unserem Portfolio


Holen Sie sich den Inhalt unseres Portfolios:

pf = client.portfolio.portfolio_get()

Sehen wir uns die Basisdaten des ersten Elements an:

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)

In meinem Fall ist dies:

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

Wert - Papierpreisbilanz
- Die Anzahl der Wertpapiere im Portfolio, Wert und Währung - ihr Geldwert.

figi - das Finanzinstrument von Global the Identifier (Global Financial Instrument Identifier)
Ticker - Ticker- Asset.

Aus diesen Daten können wir den für Menschen lesbaren Namen des Assets herausfinden.

Für diese Anfrage benötigen wir dies nicht (siehe Namensfeld), aber in anderen Fällen wird es nützlich sein.

Holen Sie sich den Namen des Papiers von FIGI und Ticket


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

Wir bekommen:

{'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'}

Diese API-Funktion funktioniert bei mir wie es sollte. Wir sehen, dass 'BBG000BWPXQ8' -> 'British American Tobacco'.

Die Suche nach dem Asset-Namen per Ticker funktioniert bei mir jedoch nicht: ((()

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

Die Entwickler schlugen vor, die Bibliothek zu aktualisieren, aber auch danach wurde sie nicht gestartet.

Laden Sie das Wertpapierverzeichnis herunter


Ich habe dieses Problem jedoch radikal gelöst. Ich habe von Tinkov ein vollständiges Verzeichnis der gehandelten Vermögenswerte heruntergeladen:

#   
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]
habe
[{'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'}]

Wie Sie sehen können, sind figi und Name da. Für meine Zwecke - mehr als genug.

Holen Sie sich eine Liste der Operationen


Am interessantesten ist es jedoch, eine Liste meiner Operationen zu erhalten. Die folgenden Aktionen fallen in die Operation (in meinem Fall):

  • PayIn - Auffüllung des Brokerage-Kontos
  • PayOut - Geld abheben
  • BuyCard - Kaufen Sie von einer Karte
  • Verkaufen - Verkaufen
  • BrokerCommission - Broker Commission
  • Dividende - Dividendenausschüttung
  • Steuern - Steuern
  • TaxDividend- Dividendensteuern
  • ServiceCommission - Servicegebühr

Code zum Entladen eines Portfolios:

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())
Lass uns nachsehen, was passiert ist. In meinem Fall ist dieses Element von Interesse
ops.payload.operations[217]
Das ist er
{'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'}]}

Wir interessieren uns für die Bereiche:

  • Datum - Transaktionsdatum
  • figi - Asset Code
  • operation_type - Art der Operation
  • Zahlung - der Betrag der Transaktion. Für Steuern oder Provisionen ist sie angegeben. Preis während keine
  • Preis - Preis für ein Papier
  • Menge - geplante Menge an Wertpapieren
  • Trades - echte Tauschgeschäfte

Es stellte sich sofort die Frage: Warum brauchen wir einige Trades, wenn es Preis und Menge gibt?

Alles ist nicht so einfach (Plan und Fakt)


Nach meinem Verständnis gibt die Menge die Anzahl der Papiere an, die ich kaufen wollte. Und was tatsächlich gekauft wird, liegt in der Menge des Handels.

Jene. Wenn Sie sich tatsächlichen Transaktionen zuwenden möchten, müssen Sie herausfinden, was in den Trades liegt.

In einigen Fällen gibt es keine - zum Beispiel für Steuern oder Ein- / Auszahlungen von Geldern.

Um reelle Zahlen zu erhalten, müssen Sie sich Transaktionen ansehen und Transaktionen austauschen:

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