Блог им. 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 месяца.
И наконец, ссылка на архив. Качаете, распаковываете, открываете, запускаете. Файл CSV c данными OHLCV тоже в архиве - https://yadi.sk/d/ZxW6ozwgRX3pBA
Возможно, кому-то это может пригодиться для моделирования стратегий в Python и их тестирования.
Сначала задолбало скачивать файлы, сделал, чтобы их скачивал сам скрипт
Потом задолбало их держать в csv, стал лить в SQLite
Потом захотелось больше функциональности, поэтому отпал python
Потом перестало хватать производительности SQLite, поэтому провел миграцию в PostgreSQL (на данный момент обе системы работают параллельно и производится ежемесячная сверка данных, надеюсь SQLite остановить к Новому Году)
Ну, и у БД Postgres и SQLite тоже разные области применяемости.
Один любит ананас, а другой свиной хрящик.©
Не думайте, что я опять заскочил пайтона попинать. Я вот прямо сейчас тесты на Lua пишу для новой стратегии :)
Тесты у меня на Питоне, а сами стратегии на С++. Луа только источник данных.
В дальнейшем собираюсь либы Питон использовать в стратегиях, но это пока абстрактные планы.
Лично мне в питоне иногда не хватает строгости — но это на больших проектах, на маленьких это наоборот мешало бы.
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 и файлов с гугл драйва