Вступление

Предыстория

Все началось несколько лет назад со школьного проекта по Computer science. Моя идея была сделать компьютерную программу которая проанализирует историю рынка, определит комбинации из 4х свечей в кластеры по схожести, запомнит какая свеча шла после этой комбинации и в дальнейшем сможет найти кластер для реальной ситуации на рынке. На странице должна быть отображена ситуация на рынке, найденый кластер комбинаций и его статистика. Если в кластере большой процент комбинаций с последующей зеленой свечей - мы ставим на рост, и соответственно наоборот.

Изначально в качестве API для программы был выбран Forex Oanda. На тот момент это был единственный найденный нами брокер с Open API и кое-какой документацией. В планах сервер который работает с API и фронт для отображения работы
(на тот момент) индикатора, поэтому пишем на Node JS. Проект был доведен до логического завершения, он исправно находил похожие комбинации и собирал их в кластеры, был сделан интерфейс который изображал полу-статичную информацию. Однако протестировать все это мы так и не успели, забросив все после сдачи проекта.

Перерождение

Летом этого года я наконец скачал, так рекламируемое всеми, приложение Тинькофф Инвестиции, но не особо заходил туда, пока осенью я не наткнулся на их API и вспомнил про то что мы уже имели дело с брокерскими API. Окончательно сломило меня наличие готовой SDK для Node JS и протоколом Streaming.

Открыв заброшенный проект, я естественно не имел ни малейшего понятия, спустя столько времени, как что работает и за что отвечает, усугубляла ситуацию ужасная структура проекта со всем бэкендом в одном файле. Я решил начать все с нуля и постепенно подтягивать уже готовые модули из старого проекта.
P.S. Сейчас проект уже на стадии отработки стратегии и до сих пор не все модули используются в новом проекте.

Первые шаги

Соединение с API

Сразу оговорюсь - просто копируя код из этой статьи собрать целый проект не получится, однако, при наличии логики и желания, вполне реально сделать нечто похожее.

Пишем все на Typescript. Для начала определяем все необходимые переменные для соединения, а точнее: apiURL, secretToken, socketURL. Подробности авторизации и остальные детали работы с API описаны в Документации.

import OpenAPI from '@tinkoff/invest-openapi-js-sdk';

// определяем apiURL, secretToken, socketURL

const api = new OpenAPI({ apiURL, secretToken, socketURL});

export default api;

В другом файле импортируем api и уже можем работать с рынком. Обратите внимание что для Production и Sandbox окружений используются разные ссылки и настройки.

import api from './api';
let unSub = function (){};
unSub = api.candle({ figi, interval},async (candle) => {
  console.log(candle);
});

Метод candle возвращает последнюю свечу по данному интервалу и Figi актива, он так же возвращает функцию для отписки, мы будем использовать ее когда пользователь прервет соединение с интерактивным сайтом.

Сбор базы данных для дальнейшего анализа

Приступим к созданию метода по сбору данных, на ходу было решено записывать все в JSON и установить лимит по количеству объектов в файле, при переполнении создавать новый файл и записывать уже туда. Этот модуль разделен на 2 части: первая часть собирает свечи непосредственно из Tinkoff партиями максимум в 1 день, вторая используется внутри первой и принимает в себя свечи из партии, формирует комбинации и записывает следующую свечу для формирования статистики в дальнейшем. После формирования массива комбинаций она записывает их в нужный файл в зависимости от наполнения. В новый модуль, отвечающий за работу с API пишем первую функцию.

import { CandleResolution } from '@tinkoff/invest-openapi-js-sdk';
import api from './api';

export async function getCandles( 
	// возвращает свечи с даты from до даты to
  from: string,
  to: string,
  figi: string,
  interval?: CandleResolution,
) {
  try {
    return await api.candlesGet({
      from,
      to,
      figi,
      interval,
    });
  } catch (e) {
    return { tr: 1, Error: e };
  }
}

У Tinkoff установлен лимит: максимум 1 день данных по методу api.candlesGet именно поэтому мы пишем свечи такими партиями. Даты - очень капризная вещь, везде разные форматы + разные временные зоны, поэтому убеждаемся что мы передаём в api дату в правильном формате, мной была написана простая функция по преобразованию даты в нужный формат. Пишем ее в модуль с различными часто используемыми функциями.

export function preoDate(date: Date) {
  date.setDate(date.getDate() + 1);
  const rA = date.toISOString().split(':');
  rA.pop();
  const rC = rA.join(':');
  // addToD - GMT+addToD
  return rC + ':00+0' + addtoD + ':00';
}

Непосредственная запись свечей после получения не особо интересна, к тому же если вы решите использовать сразу базу данных вместо JSON файлов, то работать все будет абсолютно по-другому. В моем случае готовые комбинации это папка файлов в которой каждый файл состоит из таких объектов:

{
  "mLength": 2013,
  "main": [
    {
      "candles": [
        {
          "o": 44.4375,
          "c": 44.4125,
          "h": 44.4375,
          "l": 44.4125,
          "v": 8820,
          "time": "2018-01-23T13:25:00Z",
          "interval": "5min",
          "figi": "BBG000B9XRY4"
        },
        {
          // candle
        },
        {
          // candle
        },
        {
          // candle
        }
      ],
      "afterCandle": {
        // candle
      }
    },
    ...

В объект можно добавлять различные данные связанные с комбинацией, например сейчас разрабатывается метод определения и записи тренда в котором та или иная комбинация находилась.

Заключение

В следующей части мы детальнее рассмотрим структуру проекта и постепенно начнем смотреть самый главный модуль, ответственный за сборку кластеров.

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


  1. sanneo
    07.12.2021 00:03

    Получается, что если, грубо говоря, совпало 4 свечей, то с бОлейшей вероятностью совпадёт и 5ая. Тогда у вас будет уже кластер из 5 -> ещё бОльшая вероятность, что и 6ая совпадёт и т.д. Получается такая логика?


    1. Makskorn Автор
      07.12.2021 16:07

      Если последние 4 свечи на графике совпали с одним из кластеров, мы смотрим на его статистику, и например видим, что следующая свеча в 70% случаев (просто по статистике) была зелёной. На основе этой статистики можно сделать вывод какой будет следующая свеча. Пока точных тестов способных сказать насколько точно это работает нет.


      1. Elsajalee
        08.12.2021 00:47

        Нельзя. Грубая аналогия: это примерно как 10 раз подряд выпал орел, какая вероятность, что и на 11 раз выпадет орёл? Вы надеетесь, что ответ - 100%, монета, вероятно, бракованная. К тому же, совершенно не уточняется, о каком временном интервале свечей идёт речь и не учитываются комиссии.

        Надеюсь, что доказывать будете не на реальных деньгах, т.к. такая элементарная стратегия прекрасно проверяется за 3-4 часа написания программы и скачиваем архивных данных (или включите MetaTrader и начинайте писать логи с экспортом в csv).


        1. Makskorn Автор
          08.12.2021 01:54

          Если представить на монетке, то мы смотрим не на то сколько раз подряд выпал орёл, а при каких движениях бросающего чаще выпадает орёл. Для начала смотрим только на 4 свечи, дальше добавляем значения разных индикаторов, тем самым, образно, смотря на все больше разных показателей бросающего монетку. Смысл не в брокере, можно за 2 часа переписать все на любое API. Временные интервалы не имеют абсолютно никакого значения на данном этапе, это важно во время тестирования на разных временных интервалах и разных базах.

          Что касается теста, то он давно есть и естественно использует демо счёт.


          1. Elsajalee
            08.12.2021 02:00

            Пока точных тестов способных сказать насколько точно это работает нет.

            Что касается теста, то он давно есть и естественно использует демо счёт.

            Хм...


  1. Dmitry3A
    07.12.2021 00:38

    Попробуйте ещё объёмы торгов добавить. Относительные значения по дням, может корреляция улучшиться (можно попробовать использовать moving average, чтобы сгладить всплески).

    Можно ещё таким же образом попробовать добавить значения по общим индексам и по конкретной индустрии.

    Плюс наверное надо убрать из анализа аномальные/кризисные периоды, когда обычные рыночные механизмы не работали. Например короновские волнения в начале 2020.


    1. Shmaiser
      07.12.2021 00:47
      +5

      А еще добавить ML для твитов всех политиков, крупных компаний и, как модно говорить, инфлюенсеров, времена года, прогноз погоды, фазы луны, настроения кошки Маруси и <добавить по вкусу>... (чем больше тем лучше - увеличится точность прогноза, так как описав состояние вселенной мы можем с большей долей вероятности предсказать ее следующее состояние)


      1. Dmitry3A
        07.12.2021 00:54

        Это было бы круто, но думаю данных будет слишком много, в шуме потеряешься.

        Были например фонды которые как раз твитер Трампа использовали в качестве индикаторов с анализом тональности твита для продажи/покупки.

        Гугл в своё время также делал анализ корреляции поисковых запросов для компаний и её ценами на рынке — там была вполне себе явная зависимость.

        Ну и как вишенка на торте — хомячок mr. Goxx торгующий криптой, который лучше рынка доходность показывает.

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

        У меня так как раз было — делал ML для предсказания торгов и через некоторое время результаты начали получаться прям супер хорошие. Я думал что нашёл философский камень, но оказалось что в исходные данные просочилась производная от конечной функции, ну и модель её конечно с удовольствием нашла.


        1. D1abloRUS
          07.12.2021 10:21
          +1

          Хомяк того, нужен новый


        1. Makskorn Автор
          07.12.2021 16:11

          Про фундаментальный анализ пока мыслей не было, но технический данных действительно много не бывает, и именно для этого пишется бот, что бы не запутываться и делать все вычисления с максимальной точностью.

          Это действительно проект скорее ради опыта и интереса в конкретной теме.


    1. Makskorn Автор
      07.12.2021 16:09

      В планах уже кучу разных данных которые постепенно добавляются, например сейчас по 2м индикаторам EMA, будет выявляться тренд в котором комбинация находится, что бы улучшить корреляцию.


      1. Dmitry3A
        07.12.2021 18:00
        +1

        Основной совет — собирайте данные локально, api только для загрузки. Если поискать, то можно даже intraday данные получать, там конечно объёмы сильно большие, но если сконцентрировать внимание на подмножестве, то вполне можно осилить.


  1. tuxi
    07.12.2021 01:29
    +3

    Не будет это работать. Верней не будет работать с положительным мат. ожиданием. Особенно на нашем рынке. И особенно, если не получать данные напрямую с биржи, а получать их от брокера или например от трейдинг вью (см. липовые свечки объема и цены основных фишек РФ за 06 декабря в 21:04 на минутном тф).

    Более менее будет иметь смысл использовать этот механизм «на дневках». Просто чтобы глазами не искать. Но вот опять же натуральный газ. Посмотрите сколько дней падения подряд. За последние лет 10 первый раз такое. Хотя разворот должен был быть уже на 4-й день (судя по размеру коррекции за первые 3 дня).

    PS: посмотрите в сторону свечных моделей, например price action, поглощение и тп. Но повторюсь, нужны валидные исходные данные. Не доверяйте данным, которые передают брокеры через свое апи.


    1. Makskorn Автор
      07.12.2021 16:17

      Во первых, первичная цель проекта немного другая. Это опыт работы с API разных брокеров, обработки большого объема данных, работа с рыночными индикаторами и т.д. Поэтому даже если этот метод никогда не будет работать, то поменять стратегию торговли можно за 1 день, уже имея удобную заготовку и кучу опыта.


  1. OGR_kha
    07.12.2021 16:23

    Так уже не работает. Раньше были паттерны поведения трейдеров, связанные с психологией. Отсюда и все эти фигуры теханализа (паттерны) - голова-плечи и т.д. Но когда фигуры начали отрабатывать алгоритмы, то ценность паттернов сначала смазалась, потом и вовсе сошла на нет - против них начали играть боты. Теперь уже в 99 % случаев фигуры/паттерны не работают, просто белый шум. А комиссия биржам и брокерам капает )


    1. Dmitry3A
      07.12.2021 17:49
      +1

      А комиссия биржам и брокерам капает )
      У большинства комиссии на торговлю stocks, options, and ETF уже нету. Робингуд сильно на брокеров повлиял.


    1. reactos
      07.12.2021 21:21
      +1

      Теперь настало время паттернов поведения ботов