Пользователь
0,0
рейтинг
22 октября 2014 в 13:26

Разработка → Пошаговая инструкция к созданию торгового робота на Python из песочницы

Тема онлайн торгов (будь то форекс, акции, полезные ископаемые) обычно вызывает интерес. Но вместе с тем многие люди думают: «я в этом не разбираюсь, мне спец. терминология неизвестна. Да и непонятно, как начать». Вот над этим мы и поработаем! К концу статьи у вас будет достаточно знаний и примеров, чтобы начать играть на финансовых рынках.

Покроем следующие моменты:
  • Суть биржевой игры;
  • Брокеры;
  • API для торговли/Пример робота;
  • Деплоймент онлайн;
  • Заключительные мысли.


Суть биржевой игры


Есть много теорий и объяснений. Но мы подойдем к вопросу с точки зрения софтверщика и понятия об уровнях абстракции. Очень просто (но вместе с тем правдиво) суть игры в следующем: есть график некоей (псевдо?) случайной величины (цены). Известна её история за довольно большой период. Стоит задача предсказания движения (вверх или вниз). Всё. Реально. То, что делают трейдеры — предсказывают, пойдет цена вверх или вниз и делают на это ставки (оpen trades): покупают (buy/long) какое-то количество «продукта» (instrument) в надежде на поход вверх, или продают (sell/short) в надежде, что пойдет вниз.
После какого-то времени (если цена изменилась значительно) open trades закрывают и получают в результате прибыть (угадали с движением) или убыток (не угадали).

Сделку можно закрыть руками, а можно автоматичеки (order): можно заранее задекларировать — если цена достигнет такого-то уровня, то закрыть trade.

Доступ к рынку для совершения сделок предоставляет брокер. И за это он взимают плату за каждую сделку.

Подкованные теорией, мы можем опять вернуться в область, далекую от финансов и сказать: хей! да мы же просто ищем сигнал в шуме! Сейчас по быстрому разложим в ряд Фурье, определим частоты и озолотимся!

Всё верно, так всё и есть. Игра началась.

Брокеры


Есть много брокеров, которые специализируются на частных лицах. Они отличают набором инструментов доступных для торгов, ценами на услуги, надежностью, возможность создания роботов.

Я не буду давать сравнительный анализ. Сразу дам лучшего — Oanda. Почему Oanda:

  • Репутация;
  • Возможность открыть сделку в 1 доллар и нет требований к размеру trade (некоторые брокеры обязывают делать его кратным большим величинам);
  • Низкая цена за сделки (узкий spread);
  • Огромное количество инструментов: валюты, драг металлы и нефть, индексы;
  • Возможность торговать через API;
  • Ввод вывод денег возможен через PayPal.


Для того, чтобы торговать, надо создать учетную запись на Oanda. Для начала — тренировочную (fxtrade practice). В меню «Manage API Access» нужно указать, что на вашем счету возможна торговля через API. После этого вам сгенерят секретный токен для использования в RESTful вызовах.

API для торговли


image

developer.oanda.com/docs — RESTful
Примеры: developer.oanda.com/docs/v1/code-samples

Я буду использовать Python 2.7 и библиотеку requests.

Для того, чтобы торговать, нам нужно:

Получать информацию о цене. Робот должен знать, что происходит

def connect_to_stream():
    try:
        s = requests.Session()
        url = "https://stream-fxpractice.oanda.com/v1/prices"
        headers = {'Authorization' : 'Bearer ' + "YOUR TOKEN",
                   #'X-Accept-Datetime-Format' : 'unix'
                  }
        params = {'instruments' : "EUR_USD,AUD_JPY", 'accountId' : "YOUR ACC ID"}
        req = requests.Request('GET', url, headers = headers, params = params)
        pre = req.prepare()
        resp = s.send(pre, stream = True, verify = False, timeout=20)
        return resp
    except Exception as e:
        s.close()
        print "Caught exception when connecting to stream\n" + str(e) 


Эта функция позволит соединиться к потоку цен на EUR/USD и AUD/JPY.

Теперь мы можем их считывать:

 try: #infinite loop on receiving events about price. on each tick Strategy function is called
         for line in response.iter_lines(1):
             if line:
                 msg = json.loads(line)         
                 if msg.has_key("instrument") or msg.has_key("tick"): 
                       strategy(msg['tick']['instrument'], msg['tick']['time'], msg['tick']['ask'])
    except Exception as e:
         print "something gone bad " +str(e)
         return



Теперь нам нужен мозг. Принятие решений

image

Как видно, в функцию стратегии передается информация о названии инструмента, цена и время.
Мы можем решать в функции strategy: а что нам делать с этой новой инфой? Проигнорировать? Или, может, открыть новую сделку?

Вот здесь пригодится, что вы — программист. Изобретайте! Есть числовой ряд — ищете закономерности, анализируйте, да всё, что угодно.

Допустим, робот подумал и сказал: точно цена пойдет вверх! Чувствую своей shiny metal ass!

Тогда нам нужна возможность заключить сделку

def order(instr, take_profit, stop_loss):
    try:
         url = "https://" + "api-fxpractice.oanda.com" + "/v1/accounts/"+"YOUR ACC"+"/orders"
        
         headers = {'Authorization' : 'Bearer ' + "YOUR TOKEN",
                    #'X-Accept-Datetime-Format' : 'unix'
                    "Content-Type" : "application/x-www-form-urlencoded"
                  }
    
         params = urllib.urlencode({
                                    "instrument" : instr,           # инструмент, по которому открывает сделку
                                    "units" : 10,                       # сколько единиц покупаем
                                    "type" : 'market',                # прям сейчас исполнить!
                                    "side" : "buy",                     #  считаем, что цена пойдет вверх ("sell"  если думаем что вниз)
                                    "takeProfit" : take_profit     #   насколько цена должна пройти вверх, чтобы наша жадность удовлетворилась, и мы закрыли бы сделку. и считали профит
                                    "stopLoss" : stop_loss       # насколько цена может опуститься, прежде чем наш страх скажет "ты чё?!! дальше только хуже будет. закрывай немедля. фиг с ними с потерями"
                                    	})
                                	
         req =requests.post(url, data=params, headers=headers)
         for line in req.iter_lines(1):
          print "order responce: ", line
    except Exception as e:
         print "Caught exception when connecting to orders\n" + str(e) 



Вот, в общем-то, и всё. Мы научились получать информацию о цене и, исходя из этого, открывать сделки с фиксированными целями.

Деплоймент онлайн


Открыл для себя наличие vps по бросовым ценам. Например, ftpit.com. Взял тот, что за 2 доллара в месяц.
Этот хостиг без проблем держит на себе 3-х моих роботов, которые день и ночь пытаются одолеть толстосумов с Wall Street. Плюс к этому есть свой SMTP server и небольшой сайт.

Заключительные мысли


Торговля на финансовых рынках может стать замечательным хобби, которое не только дает возможность программировать, но и приобщиться к огромной онлайн игре, в которой каждый день много новостей, мнений, событий, страха, жадности и надежды!

Если у вас есть вопросы — отвечу с радостью и в меру сил.

image

UPDATE


Очень рекомендую оставаться на practice account хотя бы 1 год
не торопитесь вводить настоящие деньги
если Вы будете видеть, что у вас прям «прёт» и все получается, то просто замониторьте счет вот здесь — forexfactory.com
если будет стабильный результат даже на демо счете — инвесторы сами вас будут искать и предлагать деньги в управление

UPDATE 2


Вспомнил кто еще любил сыграть на финасовых рынках — сэр Исаак Ньютон (тот самый :))
@Alexnn
карма
32,0
рейтинг 0,0
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Реклама

Самое читаемое Разработка

Комментарии (25)

  • 0
    Самое интересное в торговых роботах — не их конкретная реализация, а то, как потом тестируются стратегии. Вы что-нибудь думали в эту сторону?
    • 0
      Ну самое простое скачать MetaTrader и играть с его встроенным тестером. Скачать можно много откуда, на Оанде тоже есть

      Дальше чем тестер в метатрейдере и разнообразные рейтинги типа — www.forexfactory.com/trades.php (Leadershipboards) не смотрел.

      Честно говоря я тяготею к сверхскоростной торговле (поэтому и робот). И из за этого practice account — достаточно для меня. Цель сделать робота, который
      1) Работает в + :)
      2) прибыльность в год не менее 20-30%
      3) сделки не живут дольше недели (в идеале одного дня)

  • +4

    Сейчас по быстрому разложим в ряд Фурье, определим частоты и озолотимся!

    А на самом деле посмотрели на несколько строк кода из документации и «смешные» картинки.

    И это ни разу не пошаговая инструкция.
    • 0
      задача была: уменьшить порог вхождения в эту игру
      поэтому объяснены азы и есть примеры того как получать информацию и ценах и как заключать сделки

      Математический аппарат посредине, который думает торговать или нет — такого не обещалось. Болеее того, я думаю, что у многих есть наработки из прошлого (может даже из универа) по поиску сигнала в шуме. Вот для них в первую очередь эта статья. теперь они могут легко присоединить ее в потоку цен и генерировать сделки…

      Если есть нужда в примитивной функции strategy — даете знать. Выложу, что нить простейшее типа «цена за 5 минут упала/выросла больше чем на 20 пунктов-> купить/продать»

      обещаний выложить прибыльную стратегию — не было :)

      • 0
        Буду благодарен, за пример стратегии. Выигрышная/проигрышная не важно.
        • +1
          Пожалуйста. Робот, который торгует по 4м парам. Только в buy. Cтратегия: если цена за минуту уменьшилась больше чем на 2 спреда — открыть сделку, с целью один спред. Стоп лосс не ставится.

          Для конфирурации робота нужны:
          1) Счет fxtrade practice на оанда
          2) счет должен быть enabled for API трэйдинг
      • +2
        объяснены азы и есть примеры того как получать информацию и ценах и как заключать сделки

        Это просто два code sample из документации по API.
        Самое главное и чего нет в статье — механизма принятия решений — покупать или продавать, то есть:
        а. Что такое стратегия
        б. Виды стратегий
        г. Примеры стратегий
        д. Мнение автора (опционально)
        Без этого ценность статьи чуть более чем нулевая.
        • 0
          суть статьи не в обсуждении стратегий, а в том чтобы дать легкий путь людям далеким от финансовых рынков — доступ на них. для тестрирования своих стратегий
      • 0
        А почему бы и не выложить? Трейдер трейдеру не конкурент ведь.
  • 0
    Первое, что необходимо для создания хоть какой то торговой стратегии — это историческая и не только информация по торговле на бирже. И это не только ticker history (список цен, по которым были/могли быть совершены сделки на бирже) и тем более не агрегированные min,max,open,close,volume свечки, но и список текущих открытых не исполненных сделок (ордеров) — так называемый стакан, но и его история (в идеале, нужна история всех событий на бирже — списки открытия/закрытия ордеров и списки их пересечений — собственно торговых сделок).

    Внимание вопрос — каким способом можно получить доступ к этим данным хотя бы для межбанковских валютных торгов? И не нужно отмазываться слишком большим потоком данных, сегодня гигабайты в сутки — ничтожны.
    • 0
      На оанде есть вот это fxtrade.oanda.co.uk/analysis/forex-order-book

      в свое время пытался использовать (OMG… 2005), но пользы (мне) не принесло
      • 0
        Хм, эти картинки — именно стакан самого брокера (тоже полезно, жаль только не в виде чисел и не в реальном времени, например стремом или вебсокетом), предоставляющего маржинальную торговлю… а где брать стакан биржи, являющейся поставщиком ликвидности, где брокер торгует?
        • 0
          Когда-то тоже интересовался этой темой. Нужны были тиковые данные (каждый шаг изменения цены). О истории стаканов я вообще и не мечтал. В итоге все, что удалось выяснить: тиковые данные можно получить в крупных информационных агентствах, типа Bloomberg, но за очень большие деньги. Удивляет, насколько примитивным и одновременно прибыльным может быть бизнес по сбору и продаже рыночной статистики. Ну чем не идея для стартапа? :)
          • 0
            Задача сбора биржевых данных кажется примитивной, только если не знать, как все это устроено внутри :)
            Преобразование данных в единый формат, хранение и обеспечение качества данных требуют некоторых усилий, кроме того биржи взимают плату за подключение к фиду, так что, всякие блумберги, так же данные получают не просто так.
    • +1
  • +2
    Вся индустрия биржевой торговли, петабайты, петафлопсы и миллионы мозгов работают над тем, чтобы раскачать рынок, внести свой вклад в общую ПОС и поддерживать непрерывную осцилляцию в попытках урвать кусок у кого-то, кто менее удачлив.
    Хотя достаточно просто инвертировать логику, и вся эта мощь будет работать в обратную сторону, стабилизируя рынки и сглаживая острые углы. Что, несомненно, было бы намного полезнее для экономики и реальной торговли (а не спекуляций).
    Но раз что-то происходит, значит, кому-то это выгодно.

    Не обращайте внимания, это просто бухтение вслух.
    • 0
      Я к чему это все… Просто в свое время всей этой ерундой переболел, и форексами-шморексами, и онлайн тотализаторами, и стратегиями… В результате, вполне согласен с утверждением, что «нет более печального зрелища, чем юнец, выигравший на скачках».
  • +2
    которые день и ночь пытаются одолеть толстосумов с Wall Street.

    Не обманывайтесь сами и других не вводите в заблуждение…
    Нет ну поиграться так конечно интересно, но… имеется куча знакомых программеров (ваш покорный слуга к сожалению не исключение), которые наигравшись на фантики решали сыграть по настоящему. Большие деньги или нет — не суть важно, важно что для каждого есть какой-то предел (по крайней мере должен быть — иначе зависимость). Так вот проигрались все, кто раньше, кто позже — но в результате все!
    Нет, бывали и успешные фазы, но в основном все шаталось туда-сюда в каком-то пределе — усредненно же в лучшем случае было плюс/минус ноль. Пока в один день не съедался весь запас (или даже какой-то dispo). Причем мы все довольно не глупые люди, да и начинали еще во времена пузыря доткомов, т.е. индексы тогда в основном росли как на дрожжах (некоторым нужно было остановится уже тогда).
    И в очередной (который уже) раз снова закинув деньги на счет и позже снова спустив их, человек для себя решал зарабатывать привычным способом — поверте так намного интереснее.

    ПС. не холивара ради, просто в качестве предупреждения неопытным трейдерам… хотя кто не рискует…
    • +1
      Согласен. Но помимо рисков проигрыша, которые, без сомнения, велики, меня еще удручило в моем скромном опыте трейдинга огромная потеря личного времени. Смысл в том, что очень сложно сделать ставку и забыть о ней хотя бы на день, если на кону твои деньги. В итоге я для себя понял: хоть трейдинг мне и интересен, я не могу на него просаживать столько своего времени. Иначе я выпадаю из жизни.

      Это очень походе на наркотическую зависимость. Ловить кайф от наркотиков — это одно, но полностью зачеркивать свою жизнь и становиться рабом наркотика — это совсем другое. Трейдинг для многих похож на наркотическую зависимость. Поэтому я бы не согласился со словами автора статьи: «Торговля на финансовых рынках может стать замечательным хобби».
    • 0
      Ну я же нигде не писал, что это принесет большие деньги. Я только писал о «Торговля на финансовых рынках может стать замечательным хобби, которое не только дает возможность программировать, но и приобщиться к огромной онлайн игре, в которой каждый день много новостей, мнений, событий, страха, жадности и надежды!»

      Уверен, что есть много людей, которые думаю — победю я этот рынок! что тут сложного. знаю я как сигналы анализировать!

      вот для них эта статья. чтобы легко было попробовать.
      • 0
        Я вам пожалуй на примере расскажу немного о том, чем надо кормить такого робота (кроме чартов и т.п.):
        например, есть очень интересная (в смысле charts, capitalization, PER и т.д.) фирма XY, которая производит автоматику для банков (софт, банкоматы, принтеры и т.д.).
        Сценарий «курс падает вниз»:
        — S&P, GS и т.д. понижают рейтинг банковского сектора (заметьте не самой фирмы);
        — закрывается отделение фирмы в крупной стране;
        — по фирме прошел слух что уходит директор — сотрудники XY массово сбрасывают свои акции;
        — банкоматы изжили себя — в моде доставка денег дроном до двери;
        Сценарий «курс летит вверх»:
        — прямой конкурент фирмы XY закончил квартал с огромной прибылью;
        — фирма XJ закончила квартал с огромной прибылью, трейдеры на фоне общей истерии долго не замечали, что XJ просто похоже на XY;
        — фирма XY объявила о сокращении персонала в стране Z на 1000 человек.
        и т.д. и т.п.

        Так вот «пытаться одолеть толстосумов с Wall Street», не зная всего этого, самому не работая сутками только по трейдингу, просто даже не «чувствуя» рынок, имхо, сравнимо с ловлей рыбы в пруду, заведомо зная что она в том году зимой передохла. Разве что ваш робот — уже A.I. какой-нибудь.
        Это не про высокочастотный трейдинг, если что.
        • –2
          Спасибо за коммент. Я согласен почти со всем кроме " сравнимо с ловлей рыбы в пруду, заведомо зная что она в том году зимой передохла"

          Все эти люди, которые следят за факторами, что Вы упомянули… Они должны сделать сделки. А это повлияет на цену. А робот цену анализирует. Так что (имхо) философия «все включено в цену» тоже имеет право на жизнь.
          • +1
            А робот цену анализирует. Так что (имхо) философия «все включено в цену» тоже имеет право на жизнь.
            Ага, т.е. изходя из моментального среза истории цены ваш робот говорит «покупаем»… Nasdaq закрывается до утра…
            А в кулуарах сегодня уже шептались «финансовый сектор завтра свалят — перенасыщен и т.д. — продовать»;
            А на завтра 5 компаний презентируют квартальные отчеты (ожидаемо плохие);
            А пожар на складах в Гонконге не затухает;
            И т.д.
            Суть той воды что я сейчас вылил — не один уважающий себя трейдер (опять же невысокочастотный) не купит на одном лишь основании ценовой истории (фурье там или чего еще) и этот критерий для решения покупки/продажи как раз абсолютно вторичен (примерно как в суде — косвенные улики).

            Но переубеждать не буду — некоторые учатся только на своих ошибках… да и если кто-то в плюсе, должны быть же и те кто в минусах…
  • –2
    Отлично написано, многим трейдерам наверняка будет полезно.
  • 0
    «Ты ж программист! Напиши мне торгового бота!»

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.