Tinkov API,投资。第一步

从成立的第一天起,我就成为Tinkov.Investments的客户。

从那一刻起,含糊的疑问困扰着我-个人账户反映了客观现实吗?

事实是,我购买了以美元计价的证券,但在LC中,所有资产的价格均以美元显示,投资组合的总价值以卢布显示。

而且我不知道美元是否增长了,或者我是这样一个成功的投资者?

但是,佣金,税收和其他股息呢?

我想将所有交易记录在FIFO中,就像在仓库记录中一样,将它们写在FIFO中...然后将收到的股息放在最上面,然后扣除税款。

然后,我将看到我了解的结果。

事实证明,廷科夫(Tinkov)有一个API,可让您编写交易机器人(对此我一点都不感兴趣),并且还可以上传有关其投资组合和业务的数据。

该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令牌。也许系统会要求您再次登录,不用担心,这是将机器人连接到交易平台所必需的。
  6. 复制令牌并保存,令牌仅显示一次,以后将无法查看,但是,您可以发行无限数量的令牌。

在撰写本文时,令牌已在页面底部的按钮www.tinkoff.ru/invest/settings上发布

图片

我在沙箱的令牌中出错,因此我开始尝试使用实战版本。我希望你能得到的(警告:不要购买,不小心出售多余的东西)。

登录


from openapi_client import openapi

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

这两行完成了我们所需的一切。

接下来,我们使用client变量。

我们的投资组合中有什么


获取我们投资组合的内容

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

如您所见,figi和名称在那里。就我的目的而言-绰绰有余。

获取操作列表


但是最有趣的是获取我的操作列表。以下操作属于该操作(在我的情况下):

  • PayIn-经纪帐户充值
  • 付款-提款
  • BuyCard-从卡购买
  • 出售-出售
  • BrokerCommission-经纪人佣金
  • 股利-股利支付
  • 税-税
  • TaxDividend-股息税
  • 服务佣金-服务费

卸载投资组合的代码:

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

我们对以下领域感兴趣:

  • 日期-交易日期
  • figi-资产代码
  • operation_type-操作类型
  • 付款-交易金额。对于税款或佣金,由她指示。没有价格
  • 价格-一张纸的价格
  • 数量-计划证券数量
  • 交易-真实交易

问题立即出现-如果有价格和数量,为什么我们需要一些交易?

一切都不那么简单(计划和事实)


据我了解,数量表示我要购买的纸张数量。实际购买的是交易[i] .quantity。

那些。如果您想进行实际交易,则需要理清交易中的内容。

在某些情况下,没有限制-例如,税收或投入/产出资金。

要获取实数,您需要查看交易并交换交易:

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