从成立的第一天起,我就成为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
我引用官方令牌接收说明:- 通过tinkoff.ru登录到您的帐户
- 转到投资部分
- 前往设置
- 必须禁用“通过代码确认交易”功能
- 发行用于交换和沙箱的OpenApi令牌。也许系统会要求您再次登录,不用担心,这是将机器人连接到交易平台所必需的。
- 复制令牌并保存,令牌仅显示一次,以后将无法查看,但是,您可以发行无限数量的令牌。
在撰写本文时,令牌已在页面底部的按钮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和票证获取论文名称
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()
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
d1 = datetime(2016, 9, 30, 0, 0, 0, tzinfo=timezone('Europe/Moscow'))
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)
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('--------------')