3Qu
3Qu личный блог
02 ноября 2020, 22:55

Python. Импорт данных OHLCV из файла CSV.

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

Я уже давно не работаю непосредственно с CSV, и храню все данные в БД SQLite. Поначалу я хотел написать программу чтения CSV с нуля, но выяснилось, что я уже подзабыл как это делается, однако нашелся рояль в кустах — моя старая библиотека читающая данные из CSV-файла непосредственно в программу. Ее мы и будем использовать.
Собственно, Python и ориентирован на работу с библиотеками, и не нужно знать что там внутри, важно только уметь с ними работать, а сами программы с использованием библиотек станут очень простыми.
Для начала качаем с Финам историю в формате CSV-файла следующего вида:

<TICKER>,<PER>,<DATE>,<TIME>,<OPEN>,<HIGH>,<LOW>,<CLOSE>,<VOL>
SPFB.Si-12.20,1,04/05/20,10:00:00,76900.0000000,76990.0000000,76900.0000000,76990.0000000,3
SPFB.Si-12.20,1,04/05/20,10:06:00,77695.0000000,77695.0000000,77400.0000000,77400.0000000,8
SPFB.Si-12.20,1,04/05/20,10:08:00,77781.0000000,77781.0000000,77700.0000000,77750.0000000,30
SPFB.Si-12.20,1,04/05/20,10:13:00,78088.0000000,78098.0000000,78088.0000000,78098.0000000,6
SPFB.Si-12.20,1,04/05/20,10:14:00,78100.0000000,78100.0000000,78100.0000000,78100.0000000,1

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

import matplotlib.pyplot as plt
import SLPack.csvjob as csvj # грузим либу работы с CSV

data = [] # Данные
title = [] # Строка заголовков

csvfile = "SPFB.Si-12.20_200501_201001_2.csv"

# фомат строки файла, если данные читаются из другой папки
# "D:/Download/Futures/SPFB.Si-3.21_200501_201001.csv"

csv = csvj.cCSVReadFile(csvfile) # Открываем файл CSV и считываем данные
csv.ConvertT() # Конвертируем время свечей к формату гггг-мм-дд чч:мм:сс
title = csv.title # копируем строку заголовка в нашу переменную title
title.pop(3) #
data = csv.InData # копируем данные в нашу переменную data

# Строим график Close,
dclose =[data[i][6] for i in range(0,len(data))] # по индексу 6 у нас Close
plt.plot(dclose)
plt.grid()
plt.show()

Запускаем, и смотрим график Closе за 3 месяца.
Python. Импорт данных OHLCV из файла CSV.


И наконец, ссылка на архив. Качаете, распаковываете, открываете, запускаете. Файл CSV c данными OHLCV тоже в архиве - https://yadi.sk/d/ZxW6ozwgRX3pBA

Возможно, кому-то это может пригодиться для моделирования стратегий в Python и их тестирования.

19 Комментариев
  • Михаил
    02 ноября 2020, 22:58
    В 99% все равно потом будет pandas использоваться — легче сразу https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.read_csv.html
    • Replikant_mih
      03 ноября 2020, 19:17
      Михаил, да, у меня щас даже мысли не возникает импортировать csv как-то кроме как через pd.read_csv() :)
  • PSH
    03 ноября 2020, 08:12
    Да, начинал я также с python и csv :)
    Сначала задолбало скачивать файлы, сделал, чтобы их скачивал сам скрипт
    Потом задолбало их держать в csv, стал лить в SQLite
    Потом захотелось больше функциональности, поэтому отпал python
    Потом перестало хватать производительности SQLite, поэтому провел миграцию в PostgreSQL (на данный момент обе системы работают параллельно и производится ежемесячная сверка данных, надеюсь SQLite остановить к Новому Году)
      • PSH
        03 ноября 2020, 12:26
        3Qu, полностью с Вами согласен, я так, ностальгирую :)
        Не думайте, что я опять заскочил пайтона попинать. Я вот прямо сейчас тесты на Lua пишу для новой стратегии :)
        • Replikant_mih
          03 ноября 2020, 19:18
          PSH, Это что ж за такая за функциональность, которой в питоне не хватает?)
          • PSH
            03 ноября 2020, 20:08
            Replikant_mih, вот здесь была развернутая дискуссия по этому вопросу. Насколько я вижу, Вы там тоже успели отписаться. Не вижу никакого смысла начинать гонять свиней по кругу заново и не понимаю, зачем это понадобилось Вам.
              • PSH
                03 ноября 2020, 23:41
                3Qu, так оно :)
            • Replikant_mih
              04 ноября 2020, 11:10
              PSH, А, понятно. Ну короче скорость основная претензия. Ну да, есть такое, вложенные циклы везде лепить, действительно, не стоит без надобности)). Но в большинстве случаев это решаемо скомпилированные и библиотеками.


              Лично мне в питоне иногда не хватает строгости — но это на больших проектах, на маленьких это наоборот мешало бы.
              • Михаил
                04 ноября 2020, 11:42
                Replikant_mih, пишите аннотации типов и проверяйте MyPy. 
                • Replikant_mih
                  04 ноября 2020, 11:49
                  Михаил, Ну там помимо типов много всяких приколов). Например, я определил класс, в конструкторе переменную self.table = 1, потом в каком-то из методов класса я спокойно могу сделать что-то типа self.tabble = 10 и никто особо возражать не будет. Ну разве что IDE неявно не способствует таким опечаткам выдавая подсказки, но тем не менее.
                  • Михаил
                    04 ноября 2020, 11:53
                    Replikant_mih, а а в чем тут проблема? Если хотите, чтобы не менялось есть аннотация Final или ClassVar (в зависимости от потребностей) и MyPy такое не пропустит. 
                    • Replikant_mih
                      04 ноября 2020, 12:11
                      Михаил, Надо почитать. В питоне, действительно, куча всего для всего)), только надо знать, что оно есть).
  • day0markets.ru
    04 ноября 2020, 16:26

    from collections import namedtuple

    candle = namedtuple('candle', ('t', 'o', 'h', 'l', 'c', 'v'))
    with open('my_csv.csv') as f:
        candles = [candle(*x.split(',')) for x in f.read().splitlines()]

    4 стоки без пандасов, csv  и файлов с гугл драйва

    • PSH
      04 ноября 2020, 21:40
      day0markets.ru, вот что у пайтона реально круто — это его чумовой синтаксис :)

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

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