Евгений Шибаев
Евгений Шибаев личный блог
29 февраля 2020, 12:55

Искусственный трейдер. Часть 2. Парсинг и визуализация тренировочного набора данных в Python

Всем, привет! Неделя выдалась «боевой», надеюсь все живы-здоровы!
В продолжении топика «Искусственный трейдер. Часть 1. Подготовка данных для машинного обучения (видео)»
Рассмотрим python-код «парсера» и «визуализатора» данных. Скажу сразу, что этот код вы можете легко модифицировать для анализа ваших данных любого другого формата.
Сам датасет формируется при помощи платформы Jatotrader, которая во время воспроизведения исторических данных сохраняет параметры частотных графиков для дальнейшего анализа и построения модели машинного обучения  в Python.
Для работы с тестовой выборкой нам понадобятся:
1. Установленная платформа Jatotrader FREE (или круче) версии 2.9.3 (или выше). С ее помощью вы сможете создавать любые тестовые наборы для любых инструментов. Либо воспользоваться, в качестве примера, готовым набором для фьючерсного контракта RIH0 с 20.12.19 по 28.02.20 (по два частотных графика 500 и 125 тиков на бар для каждой торговой сессии).
2. Питон. Jupyter Notebook (Anaconda3) или любой другой Питон 3.
Датасет разбит на файлы в формате csv с именами типа 2020-01-31_RIH0_TICKS_500.frq. Это значит, что файл сформирован для RIH0 за 31 января 2020 года, исходя из расчета 500 тиков на бар. Методов построения бара может быть несколько — по количеству тиков, по объему, по времени, по изменению цены (Ренко), по изменению модуля маркет-дельты, и даже отдельно по объемам покупок или продаж. Данные в файле разбиты по строкам, каждая строка обозначает свечу частотного графика, строки идут в хронологическом порядке. Первая строка — имена столбцов. DATETIME,H,L,O,C,DH,DL,DO,DC,OTO,BI,SI,BV,SV,BC,SC. DATETIME-строка в формате 'ГГГГ-ММ-ДД ЧЧ: ММ: СС', H,L,O,C — максимальная, минимальная цена и цена открытия и закрытия бара. DH и DL — максимальное и минимальное значение накопленной маркет-дельты бара, DO и DC — значение маркет-дельты при открытии и закрытии бара. OTO — значение объемно-тикового осциллятора на закрытии бара, BI-интенсивность покупок (тиков в секунду), SI- интенсивность продаж, BV-объем покупок, SV-объем продаж, BC-количество покупок, SC-количество продаж.
Сам код содержит порядка 20 строк (не считая определений библиотек и подписей шкал графиков).
Код ноутбука можно скачать здесь.
import numpy as np
import pandas as pd
from datetime import datetime
import matplotlib.pyplot as plt
%matplotlib inline

#Исходными данными являются файлы в формате csv.
#Файлы находятся в папке Jatotrader\DATASET\имятикера\. Каждый файл содержит в себе информацию по одной торговой сессии
#одного тикера с заданным методом формирования баров. Дата сессии и метод формирования баров указаны в имени файла.
#Например, в файле 2020-02-03_RIH0_TICKS_500.FRQ содержится информация за 3 февраля 2020 года по фьючерсному контракту RIH0,
#сформированная из расчета 500 тиков на бар. Первая строка файла - это имена столбцов DATETIME,H,L,O,C,DH,DL,DO,DC,OTO,
#BI,SI,BV,SV,BC,SC. Последующие строки - это бары, идущие в хронологическом порядке. DATETIME-строка в формате
#"ГГГГ-ММ-ДД ЧЧ:ММ:СС", H,L,O,C - максимальная, минимальная цена и цена открытия и закрытия бара. DH и DL - максимальное
# и минимальное значение накопленной маркет-дельты бара, DO и DC - значение маркет-дельты при открытии и закрытии бара.
#OTO - значение объемно-тикового осциллятора на закрытии бара, BI-интенсивность покупок (тиков в секунду),
#SI- интенсивность продаж, BV-объем покупок, SV-объем продаж, BC-количество покупок,SC-количество продаж

#Читаем в датафрейм candles из файлов с частотными данными за соответствующую дату с соотв. частотными настройками
candles=pd.read_csv('C:\\acl90-smp\\DATASET\\RIH0\\2020-02-04_RIH0_TICKS_500.frq', header=0, sep=',')
MOEXCloseTime=pd.to_datetime(candles['DATETIME'][0][0:11]+'23:50:00') #Определяем ДатуВремя закрытия торгов
candles['DATETIME']= pd.to_datetime(candles['DATETIME']) #Преобразуем весь столбец DATETIME в формат datetime
clen=len(candles) #Общее количество частотных свечей в наборе данных

#Эти два параметра можно менять для удобства просмотра. По умолчанию на графике умещается весь набор.
istart=0 #Индекс первой свечи на графике
xwidth= min(clen, clen) #Количество свечей, отображаемое на графике

fig, [axPrice, axOTO, axIntence, axVol] = plt.subplots(4, 1, figsize=(16, 15)) #Четыре секции графика с соответствующими осями для индикаторов
axPrice.set_ylabel('Price')
axOTO.set_ylabel('OTO')
axIntence.set_ylabel('Intence')
axVol.set_ylabel('Buy&Sell Vol')
axIntence.set_yscale('log') #Логарифмическая шкала интенсивностей покупок продаж
axDELTA = axPrice.twinx() #Дополнительная шкала маркет-дельты на графике цены
axDELTA.set_ylabel('Delta')
for ax in [axPrice, axOTO, axIntence, axVol]: #цикл по секциям
    ax.grid(True) #Добавляем сетку в каждую секцию
    ax.set_xlim(xmin=istart, xmax=xwidth) #Задаем границы отображения по шкале X

t = np.arange(istart, xwidth) #Шкала Х по количеству свечей
axOTO.plot(t, candles['OTO'][istart:xwidth], linewidth=1) #Рисуем график ОТО 
axPrice.plot(t, candles['C'][istart:xwidth], color = 'black', linewidth=1) #Рисуем график цены
axDELTA.plot(t, candles['DC'][istart:xwidth], linewidth=1) #График маркет-дельты
axIntence.plot(t, candles['BI'][istart:xwidth], color = 'yellowgreen', linewidth=1) #График интенсивности покупок
axIntence.plot(t, candles['SI'][istart:xwidth], color = 'darksalmon', linewidth=1) #График интенсивности продаж
axIntence.fill_between(t, candles['BI'][istart:xwidth], 0, color='palegreen', alpha=0.5) #Заливка с прозрачным наложением
axIntence.fill_between(t, candles['SI'][istart:xwidth], 0, color='lightsalmon', alpha=0.4) #Заливка с прозрачным наложением
axVol.vlines(t-0.1, 0, candles['BV'][istart:xwidth], color='darkseagreen', linewidth=1, alpha=0.9) #Объем покупок
axVol.vlines(t+0.1, 0, candles['SV'][istart:xwidth], color='lightsalmon', linewidth=1, alpha=0.9) #Объем продаж
print(clen, "свечей прочитано") #Сколько всего свечей в наборе данных

 
Данные тестовых наборов можно найти в папке \JATOTRADER\DATASET\ИмяТикера. Если вы не устанавливали Jatotrader,
то укажите явно путь файла из тестового набора. В строке 19 указан путь к файлу данных 'C:\\JATOTRADER\\DATASET\\RIH0\\2020-02-04_RIH0_TICKS_500.frq'. 
После выполнения этого кода (CTRL+ENTER) у вас появятся графики, соответствующие тестовому набору:
Искусственный трейдер. Часть 2. Парсинг и визуализация тренировочного набора данных в Python
Чтобы детализировать какую-либо часть графика, измените значения в строках 25, 26:
istart=200 #Индекс первой свечи на графике
xwidth= min(270, clen) #Количество свечей, отображаемое на графике
Этот код отобразит данные с 200-й по 270-ю свечу, таким образом увеличивая масштаб:
Искусственный трейдер. Часть 2. Парсинг и визуализация тренировочного набора данных в Python
В коде шкала интенсивностей покупок-продаж логарифмическая. Чтобы получить обычную шкалу поставьте # в начало строки 33. График будет выглядеть так:
Искусственный трейдер. Часть 2. Парсинг и визуализация тренировочного набора данных в Python

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

Сейчас рассмотрим возможность создания собственных индикаторов, на основе имеющегося набора данных.
Добавим индикатор длительности частотного бара в секундах. Для обычных свечей время длительности бара фиксировано: например 1 минута (60 секунд), или 15 минут (900 секунд).
В наборе данных есть столбец 'DATETIME' — время начала бара. Для того, чтобы рассчитать длительность бара, нужно из времени начала следующего бара вычесть время начала текущего бара, и результат представить в секундах. Обратите внимание, что длительность последнего бара рассчитывается как разность между временем окончания торговой сессии и временем начала последнего бара.
#Рассчитаем длительность каждой свечи (в секундах) и добавим в таблицу под именем 'DUR'(создадим новый столбец)
#Эта строка кода означает, что мы берем разницу в секундах между временем текущей и последующей свечи, добавляем их в список
#длительностью последней свечи в наборе будет разница между временем окончания торговой сессии и временем начала свечи
candles['DUR']=[max(1,(candles['DATETIME'][i+1]-candles['DATETIME'][i]).seconds) for i in range (clen-1)]+[(MOEXCloseTime - candles.iloc[-1, 0]).seconds]
#Длительность свечей очень важный параметр, если мы рассматривает данные не как фиксированный таймфрейм, например 5 мин.
#Давайте посмотрим, есть ли корреляция этого параметра с ценой
axDUR = axPrice.twinx() #Дополнительная шкала длительности свечи на графике цены
axDUR.yaxis.set_ticklabels([]) #Не показывать шкалу длительности
axDUR.plot(t, 1/(candles['DUR'][istart:xwidth]), linewidth=1, color='r') #График скоротечности баров (длительность в знаменателе)
Добавьте эти четыре строчки кода в после основного кода и сделайте вычисление CTRL+ENTER. В результате на графике цены и маркет-дельты появится график скоротечности баров (т.к. длительность мы поставили в знаменатель).
Искусственный трейдер. Часть 2. Парсинг и визуализация тренировочного набора данных в Python
Очевидно, что параметр длительности каждого бара из 500 тиков, коррелирует с локальными экстремумами графика цены.

В следующем топике я постараюсь рассказать как в Jatotrader разметить данные для машинного обучения (обучение с учителем).

Скачать Jatotrader можно здесь. Как получить ключ в этом видео. Как подключиться к КВИКУ смотри здесь. С 8-м Квиком пока не работает, доделываю. Подписаться на мой канал можно здесь в ютьюбе.






13 Комментариев
  • Turbo Pascal
    29 февраля 2020, 20:33
    Них нипанятна но лайк.
  • Петр Ткаченко
    29 февраля 2020, 21:29
    Коннекторы к криптобиржам не планируете сделать в Jatotrader?
  • Петр Ткаченко
    29 февраля 2020, 21:51
    Это радует, а то крипту поскальпить можно только на CScalp, но у него функционал пока не богат, TigerTrade сильно дорогой, а ATAS Crypto сильно тормозной для этих целей. А ваш терминальчик как раз буде впрок.
    • ch5oh
      29 февраля 2020, 22:21

      Петр Ткаченко, в TSLab есть бесплатные боевые коннекторы для криптобирж.

      Binance, Bitfinex, Deribit, и ещё какие-то, емнип.

      • Антон Б
        23 мая 2020, 11:42
        ch5oh, до 60 долларов на счете. конечно бесплатные, демка.
        а после 60 долларов вообще не понятно где цена?
        • ch5oh
          23 мая 2020, 15:54
          Антон Б, там слайдер есть. Указываете каким счетом собираетесь работать и на основании этого система вычисляет абонентскую плату.
        • ch5oh
          23 мая 2020, 15:57

          Антон Б, 60 баксов — это 6 лотов фьючерса PERPETUAL на Deribit (если не больше). Должно быть вполне достаточно, чтобы определиться рабочая у Вас ТС или нет.

           

          Для некоторых криптобирж (например, Binance и Binance Futures) — коннектор бесплатен БЕЗ ОГРАНИЧЕНИЙ на размер счета.

  • Петр Ткаченко
    29 февраля 2020, 22:38
    TSLab это для алготрейдеров, скальпить через него извращение))
    • ch5oh
      29 февраля 2020, 23:37
      Петр Ткаченко, =) может быть. Стакан с быстрым вводом заявок там есть. А что ещё не хватает ручному скальперу для счастья мне судить трудно.
    • Антон Б
      23 мая 2020, 16:05
      Петр Ткаченко, скальпинг все больше превращается в запуск микропрограмм.
      тойесть человек принимает решение что он входит.
      а специальный бот на горячей клавише старается зайти так чтобы не заплатить спред.
      или чтобы по максимуму получить ребейт.
      но и на последние сопли успеть.

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

      рискменеджемент, автовыход по краю стакана, это уже давно боты.

Активные форумы
Что сейчас обсуждают

Старый дизайн
Старый
дизайн