Блог им. 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:
Фото
Нефтяной рынок получил новый источник нестабильности
Европейские валюты во вторник оказались под давлением сразу с нескольких сторон: фондовые рынки снижаются, доллар укрепляется, а инвесторы...
В Accent разработали сервис для оценки влияния недвижимости на портфель инвестора
Группа Accent запустила интерактивный инструмент для анализа инвестиционного портфеля. Сервис, доступный на сайте компании, позволяет оценить,...
Фото
Про нашу нейросеть ByteDog написали в Forbes
В середине апреля мы  рассказали , что с нуля создали собственную нейросеть для поиска вредоносов, которая читает файлы как текст. Мы сделали ее...
Фото
Какой убыток мог быть у Магнита в 2025 году?
На этой неделе, вероятно, под занавес сезона годовых отчетов, свои результаты должен опубликовать Магнит. Что ждать и насколько все плохо?

теги блога 3Qu

....все тэги



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