MOEX Store for Backtrader
Project description
Хранилище (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'
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
File details
Details for the file moex_store-0.1.0.tar.gz
.
File metadata
- Download URL: moex_store-0.1.0.tar.gz
- Upload date:
- Size: 29.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/5.1.1 CPython/3.10.11
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | e4210deb73f1aad4f17acebbc0f1305e8e71b3e55badb2e1aa5dbb03f538c537 |
|
MD5 | d70c213c64ffc94efb498ca502e27a80 |
|
BLAKE2b-256 | df741a595701ecb2f02e88c0637b475577dd16c7f4f1b0c84fc8c76504868c3a |
File details
Details for the file moex_store-0.1.0-py3-none-any.whl
.
File metadata
- Download URL: moex_store-0.1.0-py3-none-any.whl
- Upload date:
- Size: 24.3 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/5.1.1 CPython/3.10.11
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 4ef39acf31f155026046955cdb098208ee55ec621d31405f2a19acbf4e6e46d4 |
|
MD5 | b7464785581fb51f1c602370acea342d |
|
BLAKE2b-256 | b231a2ee09619379606704fa624ba772af10337eda5840e6da9f14a9544cc5ea |