Хранилище (Store) Источников данных Московской биржи MOEX для Backtrader.
Содержание:
Назначение
Позволяет осуществить загрузку исторических котировок по инструментам Московской Бирже MOEX с информационного сервера биржи iss.moex.com прямо из кода тестирования вашей стратегии в backtrader. Не требует предварительной регистрации и аутентификации при запросе данных. Больше не нужно искать данные по историческим котировкам в открытых источниках, сохранять их в файлы и регулярно обновлять.
Установка
pip install moex-store
Установит библиотеку и все необходимые зависимости. Требуется Python 3.9 и выше.
Применение в Backtrader
Получение источников данных (котировок)
-
Импортируйте класс Хранилища
MoexStoreиз библиотекиmoex_storeв скрипте, где вы инициализируетеcerebro.from moex_store import MoexStore ...
-
Создайте экземпляр Хранилища, сохраните его в переменную.
store = MoexStore(write_to_file=True, read_from_file=True)
Хранилище имеет устанавливаемые пользователем атрибуты:
-
write_to_file(по умолчаниюTrue) - еслиTrue, полученных с Биржи котировок на диск в файлcsvдля их визуальной проверки и повторного использования. Запись осуществляется в папкуfiles_from_moex, расположенную в папке вашего скрипта. Папка создается в случае ее отсутствия. -
read_from_file(по умолчаниюTrue) - еслиTrue, при повторном запросе Инструмента с теми же параметрами, он будет считан из файла в директорииfiles_from_moex, а не запрошен у Биржи. Проверка осуществляется по имени актива, тайм-фрейму, дате-с и дате-по запрошенных котировок.
-
-
Получение котировок осуществляется вызовом метода
get_data(илиgetdata) экземпляра Хранилищаstore. На примере акций Аэрофлота (тикер на биржеAFLT), сохраняем исторические котировки с тайм-фреймом 1 минута с 01 января 2023 по 01 января 2024 года в источник данных (DataFeed)data, присваивая ему имяaflt:data = store.getdata(sec_id='AFLT', fromdate='01-01-2023', todate='01-01-2024', tf='1m', name='Аэрофлот')
Все аргументы метода
get_dataявляются обязательными, кромеname(по умолчаниюNone):-
sec_id- тикер инструмента Мосбиржи (Код инструмента в торговой системе). -
fromdate- дата, с которой будут загружаться котировки. -
todate- дата, по которую будут загружаться котировки.Допустимые форматы для
fromdateиtodate:- datetime (
datetime.datetime(2023, 1, 1)). - строка в формате
'YYYY-MM-DD'или'DD-MM-YYYY', как в примере выше.
- datetime (
-
tf- тайм-фрейм котировки. Допустимые значения:1m: 1 минута,5m: 5 минут,10m: 10 минут,15m: 15 минут,30m: 30 минут,1h: 60 минут,1d: день,1w: неделя,1M: месяц,1q: квартал
-
name- имя возвращаемого источника данных для отображения на графиках платформы backtrader.
Метод
get_dataвозвращает объект feeds.PandasData экосистемы backtrader, поэтому его можно сразу подгружать вcerebroс помощьюcerebro.adddata(). -
-
Добавление Источника данных в движок cerebro осуществляется стандартно:
cerebro.adddata(data)
Полный код примера:
from __future__ import (absolute_import, division, print_function,
unicode_literals)
import backtrader as bt
from moex_store import MoexStore
def runstrat():
cerebro = bt.Cerebro(stdstats=False)
cerebro.addstrategy(bt.Strategy)
store = MoexStore()
data = store.getdata("AFLT", "01-01-2023", "01-01-2024", "1h", 'aflt-2023-hour')
cerebro.adddata(data)
cerebro.run()
cerebro.plot(style="bar")
if __name__ == '__main__':
runstrat()
Вывод покажет загруженный Источник данных:
Экземпляр Хранилища store позволяет осуществлять загрузку нескольких источников данных:
from __future__ import (absolute_import, division, print_function,
unicode_literals)
import backtrader as bt
from moex_store import MoexStore
from datetime import datetime
def runstrat():
cerebro = bt.Cerebro(stdstats=False)
cerebro.addstrategy(bt.Strategy)
store = MoexStore(write_to_file=False)
tf = '1d'
fromdate = '01-01-2023'
todate = datetime.today()
for tiker in ('GAZP', 'NLMK', 'SIH4'):
data = store.get_data(sec_id=tiker,
fromdate=fromdate,
todate=todate,
tf=tf, name=tiker)
cerebro.adddata(data)
cerebro.run()
cerebro.plot(style='bar')
if __name__ == '__main__':
runstrat()
Источники данных, добавленные в cerebro:
Информация по фьючерсам MOEX
Начиная с версии 0.0.7, библиотека дает возможность получить имена, даты экспирации и другую
полезную информацию о фьючерсных контрактах. Функции для получения информации помещены в модуль библиотеки futures.
Для получения информации о фьючерсе нужно знать код его базового актива. Что такое код базового актива фьючерсного контракта? Это уникальный идентификатор (тикер или символ), который используется для обозначения базового актива, и на который ссылается фьючерс.
ℹ️ Информация: Примеры кодов базовых активов:
1. Фьючерсы на индексы:
* Фьючерсы на индекс ММВБ (MOEX): `MIX`
* Фьючерсы на Индекс РТС: `RTS`
2. Валютные фьючерсы:
* Фьючерсы на курс доллар США - российский рубль: `Si`
* Фьючерсы на курс китайский юань – российский рубль: `CNY`
3. Товарные фьючерсы:
* Фьючерсы на нефть марки Brent: `BR`
* Фьючерсы на золото: `GOLD`
4. Фьючерсы на акции:
* Фьючерсы на обыкновенные акции ПАО Сбербанк: `SBRF`
* Фьючерсы на обыкновенные акции ПАО Газпром: `GAZR`
Чтобы найти код базового актива можно воспользоваться функцией:
store.futures.get_all_active_futures(show_table=True)
Функция запросит биржу, вернет и откроет в браузере таблицу со всеми активными торгуемыми фьючерсами на момент ее вызова. Html файл с этой таблицей будет сохранен в папке вашего скрипта:
⚠️ Внимание: Активный фьючерсный контракт — это фьючерсный контракт с ближайшей к текущей датой экспирации, который характеризуется наибольшей ликвидностью и объемом торгов на рынке.
В колонках таблицы:
- код текущего активного фьючерсного контракта
SECID, - его короткое имя
SHORTNAME, - искомый код базового актива
ASSETCODE, - имя фьючерсного контракта
CONTRACTNAME, - тип группы фьючерсного контракта
GROUPTYPE(пригодится для определения комиссий, см. пост «Комиссия при работе с фьючерсами MOEX»), - дата начало торгов текущего активного фьючерсного контракта
FRSTTRADE, - дата его экспирации
LASTTRADEDATE, - количество знаков после запятой в значениях котировок
DECIMALS, - минимальный шаг цены
MINSTEP, - стоимость шага цены
STEPPRICE, - количество контрактов в лоте
LOTVOLUME, - и начальное значение гарантийного обеспечения
INITIALMARGIN
Пример использования в backtrader
В качестве примера использования новых функций moex-story разберем кейс, в котором получим котировки фьючерсных
контрактов на индекс РТС за один прошедший год, начиная с текущей даты:
1. from __future__ import (absolute_import, division, print_function,
2. unicode_literals)
3. import backtrader as bt
4. from datetime import datetime, timedelta
5. from moex_store import MoexStore
6.
7.
8. def runstrat():
9. cerebro = bt.Cerebro(stdstats=False)
10. store = MoexStore()
11. from_date = datetime.today() - timedelta(days=365) # 2023-09-22
12. to_date = datetime.today() # 2024-09-21
13. contracts = store.futures.get_contracts_between(asset='RTS',
14. from_date=from_date,
15. to_date=to_date)
16. # contracts - ['RIZ3', 'RIH4', 'RIM4', 'RIU4', 'RIZ4']
17.
18. for tiker in contracts:
19. from_date = store.futures.get_previous_contract_exp_date(tiker)
20. to_date = store.futures.get_contract_exp_date(tiker)
21. data = store.getdata(sec_id=tiker,
22. fromdate=from_date, todate=to_date,
23. tf='1h', name=tiker)
24. cerebro.adddata(data)
25.
26. cerebro.run()
27. cerebro.plot(style='bar')
28.
29.
30. if __name__ == '__main__':
31. runstrat()
Разберем код по строкам:
-
9 - инициализируем движок
cerebro -
10 - инициализируем экземпляр хранилища источников данных
moex-story -
11-12 - задаем даты с/по, за которые попросим
moex-storyвернуть коды активных фьючерсных контрактов -
13 - вызов функции
get_contracts_between()для получения списка кодов фьючерсных контрактов с датыfrom_dateпоto_date.Функция принимает на вход аргументы:
-
asset- код базового актива искомого фьючерса, у нас этоRTS, -
from_date- дата, на которую функция вернет начальный активный фьючерсный контракт, по умолчанию - текущая дата минус один год, -
to_date- дата, на которую функция вернет конечный активный фьючерсный контракт, по умолчанию - текущая дата.Тип
from_dateиto_dateможет бытьdatetimeили строка вида'YYYY-MM-DD'или 'DD-MM-YYYY'
Функция вернет список с кодами фьючерсных контрактов, от раннего к позднему. Список начнется с кода активного фьючерсного контракта на дату
from_dateи закончится кодом активного фьючерсного контракта на датуto_date. В нашем случае:['RIZ3', 'RIH4', 'RIM4', 'RIU4', 'RIZ4'] -
-
18 - проходим циклом по полученному списку с фьючерсными контрактами и для каждого:
-
19 - получаем дату экспирации предыдущего контракта функцией
get_previous_contract_exp_date(tiker), -
20 - дату экспирации самого контракта функцией
get_contract_exp_date(tiker), -
21 - получаем котировки каждого контракта с помощью функции
store.getdata(), начиная с даты экспирации предыдущего контракта по дату экспирации текущего в цикле. Получаем котировки в виде экземпляра встроенного в backtrader класса источника данныхPandasData. Подробное описание функции см. в посте MOEX Store. -
24 - добавляем полученный источник данных с котировками фьючерсного контракта в движок
cerebro.
Котировки фьючерсных контрактов загружены в cerebro и готовы к склейке или другим манипуляциям!
Обратите внимание, строго говоря, мы загрузи котировки не за год с текущей даты. На дату год назад мы определили
действующий тогда активный фьючерсный контракт (под капотом функции get_contracts_between()) и загрузили его котировки
с момента экспирации предшествующего ему фьючерсного контракта. Обрезать котировки ровно на год назад, конечно, труда не составит.
Справка по функциям
Применение:
store = MoexStore()
result = store.futures.function()
get_all_active_futures(show_table)
- Алиас:
all_active - Принимает на вход параметр
show_table(по умолчаниюTrue):True- результат выводится в виде таблицы в файлhtml, который будет открыт в браузере по умолчанию и сохранен в папку скрипта. ВозвращаетNone.False- результат вернет в виде списка списков.
- Возвращает информацию об активных фьючерсных контрактах биржи MOEX. Информация представлена в виде таблицы с колонками:
- код текущего активного фьючерсного контракта
SECID, - его короткое имя
SHORTNAME, - код базового актива фьючерсного контракта
ASSETCODE, - имя фьючерсного контракта
CONTRACTNAME, - тип группы фьючерсного контракта
GROUPTYPE, - дата начало торгов текущего активного фьючерсного контракта
FRSTTRADE, - дата его экспирации
LASTTRADEDATE, - количество знаков после запятой в значениях котировок
DECIMALS, - минимальный шаг цены
MINSTEP, - стоимость шага цены
STEPPRICE, - количество контрактов в лоте
LOTVOLUME, - начальное значение гарантийного обеспечения
INITIALMARGIN
- код текущего активного фьючерсного контракта
get_sec_info(sec_id)
- Алиас:
info - Принимает код инструмента
sec_id(фьючерсного контракта). Ответ вернется, только если тип инструмента - фьючерс. - Возвращает словарь с информацией об инструменте. Ключи словаря:
* Тип ценной бумаги
sectype* Тип группы инструментаgrouptype* Код базового актива фьючерсного контрактаassetcode* Режим торгов инструментаboard* Тип финансового рынка инструментаmarket* Торговая система инструментаengine
get_asset_code(sec_id):
- Алиас:
asset - Принимает код инструмента
sec_id(фьючерсного контракта) - Возвращает код базового актива фьючерса
assetcode(строка)
get_history_stat(asset, to_active, show_table)
- Алиас:
stat - Принимает на вход:
- код базового актива фьючерса
asset - параметр
to_active(по умолчаниюTrue):True- вернет данные, ограничившись текущим активным фьючерсным контрактом.False- вернет полные данные.
- параметр
show_table(по умолчаниюTrue):True- результат выводится в виде таблицы в файлеhtml, который будет открыт в браузере по умолчанию и сохранен в папку скрипта. ВозвращаетNone.False- результат вернет в виде списка списков.
- код базового актива фьючерса
- Возвращает таблицу (или список списков) интервалов торгов всех фьючерсных контрактов для указанного базового актива (список списков). Таблица содержит следующие колонки:
- Код контракта
secid - Краткое имя контракта
shortname - Дата начала торгов
startdate - Дата экспирация
expdate - Код базового актива
assetcode - Базовый актив
underlyingasset - Торгуется контракт или уже нет
is_traded(0 - нет, 1- торгуется)
- Код контракта
- Пример - результат вызова
get_history_stat('NG'): exp_dates.html
get_history_list(asset, to_active)
- Алиас:
list - Принимает код базового актива фьючерса
assetи параметрto_active(по умолчаниюTrue):True- вернет данные, ограничившись текущим активным фьючерсным контрактом.False- вернет полные данные.
- Возвращает список кодов всех торговавшихся фьючерсных контрактов, от поздних к текущему активному (список строк).
- Пример - результат вызова
get_history_list('CNY'): ['CRM2', 'CRU2', 'CRZ2', 'CRH3', 'CRM3', 'CRU3', 'CRZ3', 'CRH4', 'CRM4', 'CRU4', 'CRZ4']
get_n_last_contracts(asset, n, to_active)
- Алиас:
nlast - Принимает:
- код базового актива фьючерса
asset, n- количество крайних контрактов в списке всех когда-либо торгуемых (0- все),to_active- см. выше.
- код базового актива фьючерса
- Возвращает список кодов
nпоследних торговавшихся фьючерсных контрактов, от раннего к позднему.
get_contracts_between(asset, from_date, to_date)
-
Алиас:
contracts_between -
принимает на вход аргументы:
-
asset- код базового актива фьючерса, -
from_date- дата, на которую функция вернет начальный активный фьючерсный контракт, по умолчанию - текущая дата минус один год, -
to_date- дата, на которую функция вернет конечный активный фьючерсный контракт, по умолчанию - текущая дата.Тип
from_dateиto_dateможет бытьdatetimeили строка вида'YYYY-MM-DD'или 'DD-MM-YYYY'
-
-
возвращает список с кодами фьючерсных контрактов, от раннего к позднему, от кода активного фьючерсного контракта на дату
from_dateдо кода активного фьючерсного контракта на датуto_date.
get_active_contract(asset, date)
- Алиас:
active - Принимает код базового актива фьючерса
assetиdate(по умолчанию - текущая дата) - дату, на которую нужно вернуть код активного фьючерсного контракта. - Возвращает код активного фючерсного контракта, действовавшего на дату
date.
get_contract_exp_date(sec_id)
- Алиас:
expdate - Принимает код инструмента
sec_id(фьючерсного контракта) - Возвращает дату экспирации фьючерсного контракта
sec_id. Тип - строка формата'YYYY-MM-DD'
get_previous_contract_exp_date(sec_id)
- Алиас:
prevexpdate - Принимает код инструмента
sec_id(фьючерсного контракта) - Возвращает дату экспирации фьючерсного контракта, предшествующего контракту
sec_id. Тип - строка формата'YYYY-MM-DD'
Release files for moex-store 0.2.239
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| moex_store-0.2.239.tar.gz | 43.1 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| moex_store-0.2.239-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 72.6 kB
Release files / moex_store-0.2.239.tar.gz
| Download URL | moex_store-0.2.239.tar.gz |
|---|---|
| Size | 43.1 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
86a714b320e8b6a87178c4b56442273a574d9cc61f7e010ed7eb5c53fe5f3243
|
|
BLAKE2b-256 checksum How to use checksums |
0e0b1c2c65edda92614bd8080a1dec126f9e7536215553994a02c4a98ce76810
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.12.0
|
Release files / moex_store-0.2.239-py3-none-any.whl
| Download URL | moex_store-0.2.239-py3-none-any.whl |
|---|---|
| Size | 29.5 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
1f957b0ca1f13229dc28605a0497fb12a0f8e51e0b06d506f3413fa621e6a602
|
|
BLAKE2b-256 checksum How to use checksums |
65dad1f6522ab671f10e5042ce62d40a7526e86e31427483c0d92e86f5ebcfc3
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.12.0
|