Форум

Вопросы по программному интерфейсу API у американского брокера IB

Удобное тестирование стратегий и закачка бесплатных исторических данных через API у американского брокера Interactive Brokers

  • 1
Тема создана для вопросов и обсуждения опыта использования программного интерфейса (API) для платформы TWS американского брокера Interactive Brokers.
Через этот интерфейс можно в табличном виде закачивать на свой компьютер исторические и текущие рыночные данные (цены, объемы) в различной детализации (дни, часы, минуты и т.п.), с помощью которых автоматически тестировать свои инвестиционные и спекулятивные стратегии и (кто не боится) посылать торговые заявки и запускать автоматические рабочие алгоритмы/ "роботы".

Официальный интерфейс работает из Python, C++, Java (на ней же написана сама платформа TWS), и в Windows ещё на C# и Visual Basic, в т.ч. DDE для Excel.
Но есть стабильные библиотеки для подкачки рыночных данных из TWS Interactive Brokers также для других языков, в частности для R.
 
Ниже пример простого кода/скрипта на R, который устанавливает (требуется один раз) библиотеку для работы с Interactive Brokers на статистическом языке R, импортирует эту библиотеку, подключается к работающей платформе TWS брокера Interactive Brokers на локальном компьютере через порт 4002 (номер порта нужно поменять согласно настройке TWS в глобальной кофигурации - может отличаться), получает и распечатывает детали по акции Газпрома с Московской биржи, скачивает пяти-минутные бары по акции Джонсон и Джонсон (JNJ) за последний месяц и рисует гистограмму цен, которые эта акция "пилила" нижними краями своих пятиминутных баров за тот же последний месяц. И в конце отключается от TWS.

Код
install.packages("IBrokers")
library(IBrokers)
tws <- twsConnect(port=4002)
isConnected(tws)
myContract <- reqContractDetails(tws, twsEquity("GAZP",exch="MOEX", currency="RUB"))
print(myContract)
history <- reqHistoricalData(tws, twsEquity("JNJ"), barSize = "5 mins", duration = "1 M")
hist(history$JNJ.Low, breaks=30)
twsDisconnect(tws)
 
С версии 10.12 API у Interactive Brokers появилась возможность для исторических данных по инструменту загружать не бары (low, high, open, close), а даты и время начала и окончания сессий. Это интересно, если хочется автоматически отфильтровать неторговые дни или дни с ранним закрытием сессии.

Код на Python:
Код

from ibapi.client import EClient
from ibapi.wrapper import EWrapper
from ibapi.common import BarData, ListOfHistoricalSessions
import threading
from datetime import datetime
from ibapi.contract import Contract
from ibapi.ticktype import TickTypeEnum
import pandas as pd
spx = Contract()
spx.symbol = 'SPX'
spx.secType = 'IND'
spx.exchange = 'CBOE'
spx.currency = 'USD'
result = pd.DataFrame(columns = ['start DateTime', 'end DateTime'])
result.index.name = 'Date'
class IBapi(EWrapper, EClient):
    def __init__(self):
        EClient.__init__(self, self)

    def historicalSchedule(self, reqId: int, startDateTime: str, endDateTime: str, timeZone: str, sessions: ListOfHistoricalSessions):
        for session in sessions:
            result.loc[pd.to_datetime(session.refDate, format= '%Y%m%d' )] = pd.to_datetime(session.startDateTime ,format= '%Y%m%d-%H:%M:%S' ), pd.to_datetime(session.endDateTime ,format= '%Y%m%d-%H:%M:%S' )

app = IBapi()
app.connect('127.0.0.1', 4001, 1)
api_thread = threading.Thread(target=run_loop, daemon=True)
api_thread.start()
time.sl eep(1)
app.reqHistoricalData(5, spx, datetime.today().strftime("%Y%m%d %H:%M:%S"), '12 Y', '1 day', 'SCHEDULE', 1, 1, False, [])


Примечательно то, что у индекса S&P 500 (SPX) в часть дней сессия заканчивается не в 16:00 по Нью-Йорку, а аккурат в 16:15. Соответственно в некоторые из укороченных торговых сессий (перед праздниками) тоже окончание сессии по SPX не в 13:00, а в 13:15.

Проверил: от дня недели это не зависит.

К примеру за последние 12 лет таблица сопряженности дня недели и времени окончания сессии следующая:

Рисунок

Несмотря на небольшой видимый перекос укороченных сессий к пятнице тест хи-квадрат даёт стат. незначимость, т.е. подтверждает отсутствие какой-либо зависимости наличия 15-минутной задержки окончания сессии по SPX от дня недели.

Если кто знает, с чем эти 15-минутные хвосты могут быть связаны? smile:scratch: Буду благодарен за ссылку на официальный источник.
Изменено: Alexander_Y- 30.01.2022 02:18 (исправлены две опечатки)
 
Александр, добрый день! Прошло более 4 месяцев с вашего поста, заметил что тему никто не поддержал, что странно,тема очень интересная, поэтому пользуясь случаем спрошу:
А как применить всё что вы пишете к нашему Российскому рынку?
Дело в том, что американский рынок не интересуют совсем, но очень интересно то что вы пишете применительно к Моск. бирже.
Например, я хочу чтобы такой скрипт покупал облигацию по заданной мной цене, и сразу по факту этой покупки выставлял заявку на продажу этой облигации, также по определенной цене. Как такое реализовать с помощью этих ваших алгоритмов? Спасибо!
 
Street Racer, добрый вечер!
Абсолютно согласен. Не знаю, что бы делал без возможностей получения нужных для бэк-тестов исторических данных в нужном разрешении (т.е. знаю конечно: пришлось бы покупать или экспозировать свои идеи, как в (уже закрытом, но очень крутом) проекте Quantopian).
Но я не торгую российский рынок. Поэтому я не покупал подписку даже на российские акции.
В IB не торгуются корпоративные облигации, эмитированные в РФ. Только суверенные российские облигации (в количестве 15) через OTC.
Их всех пятнадцать можно найти тут.
По API в отношении этой достаточно тривиальной в случае акций задачи Вы спрашиваете наверное потому, что в TWS к ордеру на облигацию нельзя одновременно прикреплять стандартный автоматический доп. ордер Profit Taker, верно? Потому что для акций/ETF/FX/фьючерсов в Interactive Brokers ипользование API для этого наверное большой перебор.

Рисунок
 
Alexander_Y, добрый день, с праздником!
Не совсем... Вопрос возник потому, что в наст. время мне удается довольно успешно (на мой взгляд) покупать облигации по низким ценам на Рос. рынке, увеличивая их доходность.
Я применяю Heat Map, ранжирование, и разными,правда совершенно не профессиональными способами пытаюсь вычислять мин. цену по которой исполнится заявка.
К чему я хочу прийти:
1) Сделать так чтобы программа(скрипт?) откуда-то читала цену по определенному инструменту и выставляла заявку на биржу на покупку по этой цене.
2) По факту исполнения этой заявки в #1, выставляла заявку на продажу этого инструмента по заранее заданной цене, или на определенный % выше цены покупки.
(а если уж совсем помечтать, то выставляла заявку снова на покупку по факту этой продажи)
Не подскажете, как такое реализовать? Программы писать не умею smile:pardon: Поясню, что все бумаги которые я покупаю, я с удовольствием готов держать до погашения. Поэтому такая автоматизация мне очень интересна) по сути стратегия условно беспроигрышная - я продаю только если это ещё выгоднее чем держать)
 
Street Racer,
для мосбиржи?
Цены можно вытаскивать через API, неплохие апи есть у брокеров Тиньkoфф и Алор. Также через апи можно выставлять заявки.
Навыки программирования тут нужны
 
Street Racer, добрый вечер!
Спасибо, что рассказали подробнее об идее.
Действительно (если речь о корпоративных российских облигациях), как предложил dmitriy.voron, придется делать автоматизацию через российского брокера, который дает API, в частности через предложенный Тинькофф.
Без навыков самостоятельного программирования есть два выхода: либо научиться программировать самому (но на это поднадобятся в самом лучшем случае месяцы), либо (если такое потянет размер управляемого портфеля) вступить в партнерство с профессиональным разработчиком (специализирующемся, в случае Тинькофф, конкретно на т.н. REST API).
я точно не знаю, но предполагаю, что Ваша стратегия достаточно нетороплива, и сейчас Вы спокойно исполняете её в "ручном режиме". Если это так, то обосновать трату нескольких месяцев/лет на изучение программирования, чтобы реализовать собственное автоматизированное торговое приложение, кажется очень трудной задачей. Иными словами, кажется, что в плане эффективности временных затрат рациональнее продолжать делать это руками.
Также важно, что знание API для платформы TWS Interactive Brokers не очень существенно поможет в освоении REST API Тинькофф, потому что они очень-очень разные. У Interactive Brokers тоже есть REST API (опять же совсем другие, чем у Тинькофф), и они называются API для "Портала клиентов". И это не те API от Interactive Brokers, с которыми я работаю. Я работаю с API для Trader Workstation (TWS). И код выше тоже именно для API для TWS.

Цитата
Street Racer пишет:
по сути стратегия условно беспроигрышная
я бы всё-таки отметил с финансовой точки зрения, что тут есть два риска: дефолт эмитента и инфляционный риск (когда обесценивание валюты пойдет более интенсивно, чем то, что было заложено/ожидаемо в дисконте цены Вашей покупки конкретной рублевой облигации).
Но упоминая эти существующие-таки риски, если Вы полагаете, что прайсите их (эти риски) в моменте лучше, чем рынок, то ок.
 
  • 1

Все продукты Банки.ру

Показать ещеСкрыть