Блог им. tranquility

Бесплатные тики с Мосбиржи (python3)

Наконец более-менее довел до ума код, который берет данные с информационно-статистического сервера биржи.
В предыдущей теме скрипт запрашивал некоторое количество тиков, привязанных либо к текущему моменту, либо к началу торгового дня. Сейчас я сделал так, что можно брать тики от начала заданного дня (доступны только текущий и два предыдущих рабочих) до текущего времени заданного дня. Похоже, сервер кривой и не дает за весь прошлый день получить тики. Зато, если дождаться 22:00, можно получить все что требуется за текущий день и два предыдущих.

Пока что заливаю файлы сюда, позже обновлю на гитхабе.
yadi.sk/d/ccTtLzbk3Rbtty

В общем, чтобы сохранить тики в файл, надо просто запустить скрипт iss_simple_main.py, предварительно в нем указав нужный день:
iss.get_trades_for_session( 'futures', 'forts', 'RIH8', 2 ) # доступны значения 0, 1, 2

Когда файл сохранится, можно нарисовать такой вот график с помощью скрипта iss_plot_trades.py:
Бесплатные тики с Мосбиржи (python3)

Для этого надо указать в скрипте имя файла, который будем строить:
fname = 'RIH8 280218 10-00-34+0300.txt'

В файле первая строчка задает время нулевого тика:
zeroTime: 1519801234

а дальше идут строчками тики, задаваемыми тремя значениями, время относительно нулевого тика<tab>цена<tab>объем:

0 130410 3
0 130400 3
0 130370 10

Направления сделок, цены бид/аск, открытый интерес в этих данных недоступны — это уже Мосбиржей продается за деньги.

UPD: В файле iss_simple_main.py строчке 63 я сделал округление до нуля знаков после запятой, чтобы файл меньше занимал места:
f.write( '%d\t%.0f\t%d\n' % ( sec[0] — zeroTime, sec[1], sec[2] ) )
Если ваш инструмент имеет точность сколько-то знаков после запятой, это число надо указать вместо «0» выделенного цветом.
Данная публикация является личным мнением автора. Мнение владельца сайта может не совпадать с мнением автора.
5.4К | ★27
16 комментариев
Полезный пост, спасибо
avatar
Обновил файлы немного. В общем, странно себя ведет этот сервер, данные за предыдущие сессии можно получить за различные промежутки времени в зависимости от того, когда из запрашиваешь. Сейчас, например, в пятницу, между 10 и 12 ночи мне сервер разрешил забрать 4 сессии. Причем как он это понимает в данный момент. То он разбивает утреннюю и дневную сессию, то — нет. Как-то не совсем для людей сделано)) Вот как выглядят 4 сессии, которые мне сейчас удалось запросить. Для удобства на графике показаны времена первого и последнего тиков.
previous_session = 0:

previous_session = 1:


previous_session = 2:



previous_session = 3:


Надеюсь, эти мои исследования действительно кому-то окажутся полезными. Позже я расскажу про свое знакомство с платными данными от Мосбиржи (купил у них месяц тиков и лучших котировок по RIH8). Некоторые моменты хотелось бы прояснить у знающих людей. Там, например в заявках какой-то ад творится, что так просто этими бид-аск не воспользуешься, надо придумывать как их отфильтровывать. Но менеджер по данным продуктам сказал что все норм, алгоритмы поменялись и вот теперь такая фигня, зато все по-честному показано))
avatar
tranquility, а не проще будет вытаскивать данные из ленты?? там и открытый интерес есть, если надо… жалко я пока слишком слабоват в этом…
avatar
ivanov petya, я так и делал до этого, просто понадобились надежные исторические данные за прошлый месяц, которые не получилось до этого записать. Я очень надеялся на ИСС, но как выяснилось, из него можно выжать совсем чуть-чуть. Покупка данных отчасти решила задачу, но вот с бид-аском там беда какая-то. Это еще при том, что файл с данными за месяц весит больше гигабайта. И это только лучшие заявки в нем. Сколько тогда занимает файл со всем стаканом?..
avatar
tranquility, можете поделиться кусочком платных данных? — просто интересно формат посмотреть. Надеюсь когда нибудь тоже дорасту до их полноценного анализа. 
avatar
Носорог, поделюсь, но позже) Вот данные для примера:
www.moex.com/ru/orders?historicaldata
(см .csv файлы). Полный стакан как анализировать по полной программе — это та еще задача, сам такой наукой не владею, на самом деле. Но стакан сохраняю из квика, на всякий пожарный) Да! Эти данные от 2014 года, там нормальные котировки бид-аск, вот так выглядят если построить:


(первые 15 секунд от начала вечерней сессии)
А на нынешний 2018 год оно уже выглядит совсем по-другому.
avatar
tranquility, а не подскажите как вы читали данные с квик?? сохраняете в текстовый файл или через trans2quik ??
avatar
ivanov petya, потиково, начиная со времени запуска скрипта. Пришел тик, я его в список, а в конце дня — весь список в txt файл. Если нужен стакан, там посложнее, надо вычислять изменения и сохранять только их, иначе гигантский объем данных может получиться. На демо счете объем файла с тиками и стаканом занимает мегабайт 8, но там еще 4 поводыря (нефть, сбер, газпром, доллар), без стаканов. А на реальном только fRTS + стакан будет где-то 30, судя по дневному объему реальных данных, которые я получил от Биржи за плату.
avatar
tranquility, я имел ввиду как вы считываете данные?? через DDE? что-то попытался текстовый файл прочитать в питоне.читаю например в readlines.а если пробую что-то вывести через print выдаёт ошибку, что должен обернуть файл… я дилетант в этом деле, так что извиняйте…
avatar
ivanov petya, 

из питона прочесть файл построчно очень просто!

f = open( 'file.txt' )
for line in f:
  print( line[ :-1 ] ) #откусываем последний символ "\n"
f.close()

А дде я не использую, посылаю тик (или другие данные) в dll и там уже их сохраняю в с++ коде, который в основном stl использует. Получается очень быстро, насколько быстрее чем это делать в lua не измерял, но, подозреваю, что при некотором потолке выделенной памяти, скажем, 50 мб или 100 может резко производительность деградировать. С сишным кодом такого не происходит при сотне мб уж точно.

P.S. с readlines() не должно быть никаких проблем:
If you want to read all the lines of a file in a list you can also use list(f) or f.readlines().

например, предыдущий код можно переписать так:
f = open( 'file.txt' )
lines = f.readlines() #или list(f)
f.close()
for line in lines:
  print( line[ :-1 ] ) #откусываем последний символ "\n", тут не уверен, может, питон уже откусил
avatar
tranquility, спасибо, я немного не так пытался…
avatar
tranquility, а не подскажите?? везде в литературе в анализе данных используются данные с заголовками… что-то не пойму как из строки вытянуть нужный столбец… если использовать срез, то как дальше с этим работать??
например хочу получить следующее если данные в этом столбце меняются на больше 20 и oi вырос на 20, то print(значение)
можете ссылочку дать на книгу какую или статью… а то, что у меня есть не помогает мне))
avatar
ivanov petya, numpy в помощь. Ключевые слова — slicing и boolean indexing

пример slicing:
i-й столбец матрицы:
ith_column = matr[ :, i ]

надо помнить, что ith_column не новый объект, а ссылка на часть matr. Чтобы был новый, надо написать
ith_column = numpy.array( matr[ :, i ] )

boolean indexing. Вычленяем из столбца значения, которые больше либо равны какого-то уровня, скажем
level = 0
filtered = ith_column[ ith_column >= level ]

можно использовать комбинированное условие:
low_level = 0
high_level = 1000
filtered = ith_column[ numpy.logical_and( ith_column >= low_level, ith_column < high_level ) ]

С обычными списками (кортежами) такое напрямую не работает. А если заставить чтобы работало, все равно по скорости это будет сильно уступать показанных примеров с numpy
avatar
tranquility, спасибо, буду дальше мучить…
avatar
Спасибо, очень круто!
avatar
Архив на яндекс.диске умер, вот то же самое на github:
github.com/pecec/moex_iss
avatar

Читайте на SMART-LAB:
💰 Российский бизнес откладывает инвестпроекты
Высокая ключевая ставка и охлаждение экономики вынуждают российские компании пересматривать инвестиционные планы. Об этом заявил глава Российского...
Фото
Какие акции могут быстро закрыть дивидендный гэп
Дмитрий Пучкарев На российском рынке стартовал дивидендный сезон. После закрытия реестра акции обычно снижаются примерно на размер выплат —...
Фото
Энергопереход под вопросом. Ускорит ли развитие зеленой энергетики конфликт с Ираном?
Война в Иране поставила мир на грань энергетического кризиса. По данным The Economist, только за первые 50 дней конфликта мир лишился 550 млн...
Фото
Нефтяной срез: выпуск №9. Ормуз перекрыт, но акции нефтегаза падают. Надо ли покупать или сидеть на заборе в LQDT? Ищем лучших в секторе, где растет прибыль!
Продолжаю выпускать рубрику — Нефтяной срез.  Цель: отслеживать важные бенчмарки в нефтяной отрасли, чтобы понимать куда дует ветер.  Прошлый пост:...

теги блога tranquility

....все тэги



UPDONW
Новый дизайн