Блог им. SciFi

Парсер отчета брокера "Отрытие" на Питон

    • 03 июня 2017, 14:48
    • |
    • SciFi
  • Еще
Я много времени тратил на заполнение торгового журнала. Главная трудность была в том, что при исполнении достаточно крупной заявки создается множество мелких сделок. Также каждый день на долларовых активах менялась стоимость пункта цены. Проще брать объемы сделок из отчета брокера, а не вычислять самому. 

Написал парсер отчета брокера «Отрытие» в формате xml, который суммирует такие мелкие сделки по объему и количеству и кроме этого выдает список сделок в нужном мне формате. Особенно это касается даты, точности цены и порядка данных. 

Итак, получается примерно такое:
26.05.2017;23:41:05;BR-6.17;Продажа;52,18;13;382208
29.05.2017;11:20:21;BR-7.17;Продажа;52,44;13;384112
29.05.2017;11:20:29;ED-6.17;Купля;1,1194;5;315361
29.05.2017;12:58:30;ED-6.17;Продажа;1,1198;5;315473
29.05.2017;11:16:23;GOLD-6.17;Продажа;1268,0;5;357225
29.05.2017;12:58:53;GOLD-6.17;Купля;1269,0;5;357506
29.05.2017;11:15:18;RTS-6.17;Продажа;107500,0;3;363422
29.05.2017;12:59:15;RTS-6.17;Купля;107480,0;3;363354
Формат можете откорректировать под себя. Такие строки затем очень легко вставляются в Excel или Google spreadsheets, которыми я пользуюсь, через импорт.

Идея скрипта простая. Мы парсим xml, проходимся по всем сделкам, суммируем мелкие сделки, создаем форматированные строки, затем все полученные строки записываем в файл. 

Файл с результатами создается в папке скрипта.
Файл отчета нужно переименовать в report.xml и положить в папку скрипта.

# Copyright SciFi, 2017
# -*- coding: utf-8 -*-

import xml.etree.ElementTree as ET
from datetime import datetime

# Создаем файл, в который будем писать, открываем его с правами на запись
f = open('result.txt', 'w')

# Считываем файл отчета report.xml и парсим его
tree = ET.parse('report.xml')
root = tree.getroot()
common_deal = root.find('common_deal')

prev_date = ''
prev_price = 0
total_quantity = 0

# Массив строк
lines = []

# Проходимся по всем сделкам и суммируем их, мелкие сделки затем удаляем, суммарные сделки сохраняем в массив lines
for child in common_deal:
    deal_date = child.get('deal_date')
    security_code = child.get('security_code')
    deal_symbol = child.get('deal_symbol')
    price = child.get('price')
    roundto = child.get('roundto')
    quantity = int(child.get('quantity'))
    price_rur = child.get('price_rur')

    # Сделка считается мелкой сделкой в составе крупной, если совпадают даты и код инструмента
    if deal_date == prev_date and security_code == prev_security_code :
        total_quantity = total_quantity + quantity

        # Удаление строки с мелкой сделкой из массива
        lines.pop()

    else :
        total_quantity = quantity

    # Форматирование данных для строки
    price_round = round(float(price), int(roundto))
    if deal_symbol == 'B': deal_symbol = 'Купля'
    else : deal_symbol = 'Продажа'
    volume = float(price_rur) * total_quantity
    volume_string = '%.f' % volume
    datetime_object = datetime.strptime(deal_date, '%Y-%m-%dT%H:%M:%S')
    date_string = datetime_object.strftime('%d.%m.%Y')
    time_string = datetime_object.strftime('%H:%M:%S')
    price_string = str(price_round)
    price_string = price_string.replace('.',',')
    quantity_string = str(total_quantity)

    # Формирование строки
    line = date_string + ';' \
              + time_string + ';' \
              + security_code + ';' \
              + deal_symbol + ';' \
              + price_string + ';' \
              + quantity_string + ';'\
              + volume_string \
              + '\n'

    # Добавление строки в массив
    print line
    lines.append(line)

    prev_date = deal_date
    prev_security_code = security_code

# Запись строк в файл
f.writelines(lines)


| ★8
5 комментариев
Я похожую балалайку для отчётов Альфы написал на R.
avatar
Спасибо. Как раз собирался его написать, а тут такой подарок :)
avatar
Да, всё-таки питончиком приятно автоматизировать какую-нить рутину, сам такое люблю)
avatar
О! Прям сначала подумал, что ошибся и зашёл не на Смартлаб, а на Хабрахабр. :)
через BeatifullSoup, наверное, красивей бы было. 
avatar

Читайте на SMART-LAB:
Инвестиции без спешки: торгуем в выходные
Алексей Девятов Рынок часто движется импульсами, тем важнее оценивать активы без спешки, не отвлекаясь на инфошум. Для этого отлично подходят...
Фото
💼 Подведем итоги 2025 года и поделимся планами на будущее
Друзья, 7 апреля в 18:00 мы раскроем результаты деятельности за 2025 год: опубликуем итоговую консолидированную финансовую и управленческую...
Фото
Каждый инвестор желает знать, где сидит доходность? Взгляд Goldman Sachs на инвестиции до конца года
Если вы инвестируете свой капитал на фондовом рынке, то каждый год легко может принести вам как большие потери, так и несметные богатства....
Фото
Башнефть: есть шанс на переоценку, но нужно запастись терпением. Прогноз сошелся с фактом в высокой точностью, ищем инвест идею
Башнефть отчиталась по МСФО за 2025 год — внимание, квартальных отчетов в прошлом году не было вообще! Традицицинно сравниваем прогноз...

теги блога SciFi

....все тэги



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