Tinkov API الاستثمار. الخطوات الأولى

منذ الأيام الأولى تقريبًا أصبحت عميلاً لـ Tinkov.

ومن تلك اللحظة فصاعداً ، شكوك غامضة تعذبني - هل يعكس الحساب الشخصي الواقع الموضوعي؟

الحقيقة هي أنني أشتري الأوراق المالية المقومة بالدولار ، ولكن في LC يتم عرض أسعار جميع الأصول بالدولار ، والقيمة الإجمالية للمحفظة بالروبل.

وأنا لا أفهم ما إذا كان الدولار قد نما أم أنني مستثمر ناجح؟

ولكن ماذا عن العمولات والضرائب والأرباح الأخرى؟

أود أخذ جميع معاملاتي وكتابتها في FIFO ، كما هو الحال في سجلات المستودعات ... ووضع الأرباح المستلمة على القمة ، ثم خصم الضرائب.

ثم سأرى النتيجة التي أفهمها.

اتضح أن Tinkov لديه واجهة برمجة تطبيقات تسمح لك بكتابة روبوتات التداول (لست مهتمًا بذلك على الإطلاق) ، بالإضافة إلى تحميل البيانات على محفظته وعملياته.

يحتوي API هذا على وصف رسمي ، ولكن لم يكن كل شيء واضحًا بالنسبة لي ، كان عليّ فهمه.
تظهر نتائج هذه المواجهات انتباهكم.

روابط مفيدة: وصف

API
وصف آخر

الحصول على رمز وتثبيت مكتبة


قبل أن تبدأ ، تحتاج إلى تثبيت المكتبة والحصول على رمز مميز.

تركيب المكتبة:

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

أقتبس تعليمات تلقي الرمز الرسمي:

  1. قم بتسجيل الدخول إلى حسابك على tinkoff.ru
  2. انتقل إلى قسم الاستثمار
  3. اذهب للاعدادات
  4. يجب تعطيل وظيفة "تأكيد المعاملات برمز"
  5. قم بإصدار رمز OpenApi للتبادل و Sandbox. ربما سيطلب منك النظام تسجيل الدخول مرة أخرى ، لا تقلق ، فهذا ضروري لربط الروبوت بمنصة التداول.
  6. انسخ الرمز المميز واحفظه ، ولا يتم عرض الرمز مرة واحدة فقط ، ولن تتمكن من عرضه لاحقًا ، ومع ذلك ، يمكنك إصدار عدد غير محدود من الرموز المميزة.

في وقت كتابة هذا التقرير ، تم إصدار الرمز المميز على الصفحة www.tinkoff.ru/invest/settings ، وهو زر في أسفل الصفحة.

صورة

لقد واجهت أخطاء في الرمز المميز ل sandbox ، لذلك بدأت في تجربة الإصدار القتالي. ما أتمنى لكم (تحذير: لا تشتري ، تبيع عن طريق الصدفة شيء إضافي).

تسجيل الدخول


from openapi_client import openapi

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

يفعل هذان الخطان كل ما نحتاجه.

بعد ذلك نعمل مع متغير العميل.

ماذا يوجد في محفظتنا


الحصول على محتويات دينا محفظة:

pf = client.portfolio.portfolio_get()

دعونا نرى البيانات الأساسية للعنصر الأول:

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)

في حالتي ، هذا هو:

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

القيمة -
رصيد سعر الورق - عدد الأوراق المالية في المحفظة والقيمة والعملة - قيمتها النقدية.

figi - مؤشر الأداة المالية العالمية للمُعرِّف (مُعرِّف الأداة المالية العالمية)
- أصول مؤشر .

من هذه البيانات ، يمكننا معرفة اسم الأصل الذي يمكن قراءته بواسطة الإنسان.

بالنسبة لهذا الطلب ، لا نحتاج إلى هذا (انظر حقل الاسم) ، ولكن في حالات أخرى سيكون مفيدًا.

احصل على اسم الورقة عن طريق FIGI وتذكرة


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

نحن نحصل:

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

تعمل وظيفة API هذه كما يجب. نرى أن "BBG000BWPXQ8" -> "التبغ الأمريكي البريطاني".

لكن البحث عن اسم الأصل بواسطة شريط لا يعمل بالنسبة لي: (((

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

اقترح المطورون تحديث المكتبة ، ولكن حتى بعد ذلك لم تقلع.

قم بتنزيل دليل الأوراق المالية


ومع ذلك ، قمت بحل هذه المشكلة بشكل جذري. لقد قمت بتنزيل دليل كامل من الأصول المتداولة من Tinkov:

#   
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]
حصلت
[{'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'}]

كما ترون ، التين والاسم هناك. لأغراضي - أكثر من كافية.

احصل على قائمة العمليات


لكن الشيء الأكثر إثارة للاهتمام هو الحصول على قائمة بعملياتي. تقع الإجراءات التالية في العملية (في حالتي):

  • PayIn - تجديد حساب الوساطة
  • PayOut - سحب الأموال
  • BuyCard - الشراء من البطاقة
  • بيع - بيع
  • BrokerCommission - لجنة السمسرة
  • توزيعات الأرباح - توزيعات الأرباح
  • الضرائب - الضرائب
  • TaxDividend- ضرائب الأرباح
  • ServiceCommission - رسوم الخدمة

رمز تفريغ المحفظة:

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())
دعونا نرى ما حدث. في حالتي ، هذا العنصر مهم
ops.payload.operations[217]
هذا ما هو عليه
{'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'}]}

نحن مهتمون بالمجالات:

  • التاريخ - تاريخ المعاملة
  • فيجي - رمز الأصول
  • نوع العملية - نوع العملية
  • الدفع - مبلغ المعاملة. بالنسبة للضرائب أو العمولات ، يشار إليها. السعر بينما لا يوجد
  • السعر - سعر ورقة واحدة
  • الكمية - الكمية المخططة للأوراق المالية
  • الصفقات - صفقات التبادل الحقيقي

نشأ السؤال على الفور - لماذا نحتاج إلى بعض الصفقات إذا كان هناك سعر وكمية؟

كل شيء ليس بهذه البساطة (الخطة والحقيقة)


كما أفهمها ، تشير الكمية إلى عدد الأوراق التي أردت شراؤها. وما يتم شراؤه بالفعل يكمن في الصفقات [i]. الكمية.

أولئك. إذا كنت ترغب في التحول إلى المعاملات الفعلية ، فأنت بحاجة إلى فرز ما يكمن في الصفقات.

في بعض الحالات ، لا يوجد شيء - على سبيل المثال ، للضرائب أو إيداع / سحب الأموال.

للحصول على أرقام حقيقية ، تحتاج إلى إلقاء نظرة على المعاملات وتبادل المعاملات:

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