Блог им. 3Qu

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

    • 02 ноября 2020, 22:55
    • |
    • 3Qu
  • Еще

Простите за банальность, работа с данными начинается с их получения из внешнего источника. Мы будем получать их из 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 и их тестирования.

★13
19 комментариев
В 99% все равно потом будет pandas использоваться — легче сразу https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.read_csv.html
avatar
Михаил, кто ж против? Я дал уже готовый к применению простой инструмент. Дальше пусть сами выбирают что использовать.
avatar
Михаил, да, у меня щас даже мысли не возникает импортировать csv как-то кроме как через pd.read_csv() :)
avatar
Да, начинал я также с python и csv :)
Сначала задолбало скачивать файлы, сделал, чтобы их скачивал сам скрипт
Потом задолбало их держать в csv, стал лить в SQLite
Потом захотелось больше функциональности, поэтому отпал python
Потом перестало хватать производительности SQLite, поэтому провел миграцию в PostgreSQL (на данный момент обе системы работают параллельно и производится ежемесячная сверка данных, надеюсь SQLite остановить к Новому Году)
avatar
PSH, как бы этот топик и не для вашего уровня, а для тех, кто только начинает работать с Python 
Ну, и у БД Postgres и SQLite тоже разные области применяемости.
Один любит ананас, а другой свиной хрящик.©
avatar
3Qu, полностью с Вами согласен, я так, ностальгирую :)
Не думайте, что я опять заскочил пайтона попинать. Я вот прямо сейчас тесты на Lua пишу для новой стратегии :)
avatar
PSH, я предпочитаю вообще не думать.)
Тесты у меня на Питоне, а сами стратегии на С++. Луа только источник данных.
В дальнейшем собираюсь либы Питон использовать в стратегиях, но это пока абстрактные планы.
avatar
PSH, Это что ж за такая за функциональность, которой в питоне не хватает?)
avatar
Replikant_mih, вот здесь была развернутая дискуссия по этому вопросу. Насколько я вижу, Вы там тоже успели отписаться. Не вижу никакого смысла начинать гонять свиней по кругу заново и не понимаю, зачем это понадобилось Вам.
avatar
PSH,  всяк кулик свое болото хвалит.© И, самое главное, каждый из них прав.
avatar
3Qu, так оно :)
avatar
PSH, А, понятно. Ну короче скорость основная претензия. Ну да, есть такое, вложенные циклы везде лепить, действительно, не стоит без надобности)). Но в большинстве случаев это решаемо скомпилированные и библиотеками.


Лично мне в питоне иногда не хватает строгости — но это на больших проектах, на маленьких это наоборот мешало бы.
avatar
Replikant_mih, пишите аннотации типов и проверяйте MyPy. 
avatar
Михаил, Ну там помимо типов много всяких приколов). Например, я определил класс, в конструкторе переменную self.table = 1, потом в каком-то из методов класса я спокойно могу сделать что-то типа self.tabble = 10 и никто особо возражать не будет. Ну разве что IDE неявно не способствует таким опечаткам выдавая подсказки, но тем не менее.
avatar
Replikant_mih, а а в чем тут проблема? Если хотите, чтобы не менялось есть аннотация Final или ClassVar (в зависимости от потребностей) и MyPy такое не пропустит. 
avatar
Михаил, Надо почитать. В питоне, действительно, куча всего для всего)), только надо знать, что оно есть).
avatar
Replikant_mih, специальный раздел для любителей большей строгости.
avatar

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  и файлов с гугл драйва

avatar
day0markets.ru, вот что у пайтона реально круто — это его чумовой синтаксис :)
avatar

теги блога 3Qu

....все тэги



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