Блог им. 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 и их тестирования.

Данная публикация является личным мнением автора. Мнение владельца сайта может не совпадать с мнением автора.
1.7К | ★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

Читайте на SMART-LAB:
Фото
Исторический блэкаут и проверка цифровой копии «Вкусно — и точка»: как прошла кибербитва Standoff 17
В этом году кибербитве Standoff исполнилось десять лет. Все началось с соревнований по кибербезопасности на PHDays, а в 2016 году Standoff...
Фото
Размещение новых облигаций «Северстали»
«Северсталь» — одна из крупнейших в мире сталелитейных и горнодобывающих компаний. Она охватывает полный цикл производства: от добычи...
Покупки валюты по бюджетному правилу снизятся почти вдвое
С 7 июля Банк России сократит ежедневные чистые покупки валюты по бюджетному правилу с 9,34 млрд за первую неделю этого месяца до 4,82 млрд руб....
Фото
Мой инвест портфель. Структура портфеля, последние действия по портфелю. Состав портфеля валютных облигаций
Сегодня делал действия по портфелю. Кроме того, решил пособирать инфу по счетам и посмотреть как там дела.  

теги блога 3Qu

....все тэги



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