Блог им. 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» выделенного цветом.
★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

теги блога tranquility

....все тэги



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