Найти тему

Пишем скрипт на QLUA по расчёту коэффициента корреляции между ценами двух активов

Всем привет!

В прошлом выпуске мы порассуждали и повычисляли коэффициенты корреляции по различным теоретическим графикам. А сегодня давайте реализуем скрипт на QLUA, который будет вычислять коэффициент корреляции между двумя активами. При этом и сами активы, и тайм-фрейм, по которым будем вычислять коэффициент мы сможем менять.

Данные расчеты могут помочь найти два инструмента, по которым в дальнейшем можно будет вести торговлю по схеме «парного трейдинга».

Что такое парный трейдинг, я рассказывал в одной из своих статей. Также рассматривал некоторые технические моменты при реализации данной стратегии.

Итак, что должен делать наш скрипт:

  1. Должен содержать блок инициализации или ввода исходных данных – в нем мы зададим по каким инструментам нужно посчитать коэффициент корреляции. Также в этом блоке укажем по какому тайм-фрейму нужно брать графики.
  2. Далее скрипт прочитает графики по указанным активам (за основу будет браться цена закрытия свечей).
  3. Потом нужно будет сопоставить эти графики и сделать массив в котором по каждому моменту времени будет указана цена обоих инструментов.
  4. После этого можно будет вычислить коэффициент корреляции. Он высчитывается по формуле:
Формула расчета коэффициента корреляции между графиком x и графиком y
Формула расчета коэффициента корреляции между графиком x и графиком y

При вычислении данной формулы мы создадим несколько отдельных, достаточно простых функций следующим образом:

-3

💾 Скачать код скрипта

🧐 Посмотреть код скрипта

Итак, давайте немного разберем получившийся код.

Функция, инициализирующая исходные данные выглядит так:

function init()
active1_name = "SRU3"
active1_code = "SPBFUT"
active2_name = "SPU3"
active2_code = "SPBFUT"
time_frame = 7 -- устанавливаем интервал времени, по которому будем работать.
--[[
1 - INTERVAL_M1
2 - INTERVAL_M5
3 - INTERVAL_M10
4 - INTERVAL_U30
5 - INTERVAL_H1
6 - INTERVAL_H4
7 - INTERVAL_D1
8 - INTERVAL_W1
]]
End

Надеюсь, что тут все ясно. Указываем два инструмента, в данном случае это фьючерсы, о чем указывает их код – SPBFUT.

И в целом, из-за того, что в парном трейдинге один из инструментов должен шортиться (продаваться), то удобнее работать с фьючерсами, нежели просто с акциями.

Основной блок программы выглядит так:

function main()
init()
svechi1 = give_svechi (active1_name, active1_code, time_frame);
svechi2 = give_svechi (active2_name, active2_code, time_frame);
table_for_analiz = addition_info_svechi(svechi1, svechi2);
--print_array(table_for_analiz); -- вывод итогового массива (для проверки работы скрипта)
x_ave = give_ave(table_for_analiz, 1);
y_ave = give_ave(table_for_analiz, 2);
up_part = give_up_part(table_for_analiz)
down_part = give_down_part(table_for_analiz)
message("Расчет корреляции: "..active1_name.." и "..active2_name)
message("В анализе задействовано"..#table_for_analiz.." свечей");
message("Kоэффициент корреляции равен:"..up_part/down_part)
end

Тут все как описано в списке выше: скачиваются графики обоих инструментов, потом они совмещаются. Затем вычисляются значения для коэффициента корреляции и происходит вывод данных.

Если Вы детально решите изучить данный скрипт, то обратите внимание на следующее:

В массивах svechi1 и svechi2 находятся свечи, которые из себя представляют таблицы или объекты. Для полного понимания как заполняются данные массивы лучше изучить статью об объектно-ориентированном программировании в LUA.

В нашем рассматриваемом скрипте создаются объекты типа Svecha для заполнения массивов svechi1 и svechi2. А также объекты типа position для заполнения массива table_for_analiz. Этот массив представляет из себя совмещенный график, где каждая запись соответствует определенному времени и содержит данные цены как одного, так и другого инструмента в этот момент времени.

Примерное содержимое таблиц svechi1 и svechi2. Каждая строка – объект, созданный на основе объекта Svecha
Примерное содержимое таблиц svechi1 и svechi2. Каждая строка – объект, созданный на основе объекта Svecha
Примерное содержимое таблицы table_for_analiz. Каждая строка – объект, созданый на основе объекта position.
Примерное содержимое таблицы table_for_analiz. Каждая строка – объект, созданый на основе объекта position.

Оба эти объекты (Svecha и position) содержат поле time. В свою очередь в этом поле содержится так называемая временная метка, которая рассчитывается так:

result[i].time = time_current_svechi['year']*100000000 + time_current_svechi['month'] * 1000000 + time_current_svechi['day'] * 10000 + time_current_svechi['hour'] * 100 + time_current_svechi['min'];

Зачем это нужно?

Дело в том, что время свечи в QUIK содержится в виде таблицы. В данной таблице в отдельных ячейках содержится год, месяц, день, час, минута. Работать с таком информацией не совсем удобно. Как сравнивать время свечи? Как проверять какая свеча более ранняя? (хотя данное сравнение в данном скрипте и не требуется).

Что бы было удобно я перевожу информацию о времени из таблицы в отдельное значение. Так, у свечи со временем 10:05 от 03.11.2022 года, например, данная метка будет выглядеть так:

202211031005. То есть в этой метке зашита вся информация о времени. При этом эти метки удобно складывать, сравнивать и осуществлять прочие операции.

Также хотел обратить внимание на функцию give_ave(). Она получает в качестве входных данных массив table_for_analiz и идентификатор – по какому полю находить среднее значение. Если это единица, то среднее будет находиться по первому графику, иначе – по второму.

Ну, что же. Давайте попробуем рассчитать коэффициенты корреляции для различных инструментов:

SRU3 и SPU3, дневной тайм-фрейм.

Это сравнение фьючерсов по обыкновенным и привилегированным акциям Сбера.

-6

Коэффициент корреляции близкий к единице.

Давайте попробуем запустить расчет на пятиминутном тайм-фрейме.

-7

Также близкий к единице коэффициент корреляции. Хочу сказать, что три года назад, когда я последний раз анализировал эти инструменты, то по нему коэффициент корреляции был в районе 0,86.

При корреляции близкой к единице сложно применять парный трейдинг.

Давайте попробуем провести расчет между золотом и серебром.

Инструменты: GDU3 и SVU3. Пятиминутный таймфрейм.

-8

Достаточно маленькое значение коэффициента корреляции.

Давайте попробуем эти же инструмента на дневном тайм-фрейме.

А здесь уже хорошая корреляция.

Пожалуй, закончим расчеты. Я надеюсь, что Вы поняли, что с помощью написанного скрипта можно проводить расчеты и искать подходящие инструменты для парного трейдинга. Можно сравнивать фьючерсы с акциями (не забудьте только для акции поставить код “ TQBR ”).

В дальнейшем, я планирую написать и выложить здесь скрипт, который будет вести торговлю по алгоритму парного трейдинга. Вы пока можете подготовиться к этому – найти подходящие инструменты.

Также, если пожелаете, то можете построить «шахматку» по доступным фьючерсам. На пересечении кодов фьючерсов будет стоять вычисленный коэффициент корреляции.

Я такую года три или четыре назад делал и давал на нее ссылку в статье по парному трейдингу. Ссылка на саму "шахматку".

Для построения автоматически такой шахматки нужно будет составить список всех фьючерсов. Как получать такой список я разбирал в теме по формированию «красивого» отчета. А результирующие строки записывать в файл с расширением «csv».

💥Если же данная статья наберет 20 лайков, то я сам реализую построение такой «шахматки».

На сегодня у меня все. Всем удачи – всем пока.🖐

Подписывайтесь на канал, ставьте лайки 👍, задавайте вопросы.

⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇

📃 Краткое содержание данного канала.

➖➖➖➖➖➖➖➖➖➖➖➖➖

Landingcentr.ru - разработка сайтов для малого и среднего бизнеса.

⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆