Всем привет!
В прошлом выпуске мы рассматривали как можно определить среднюю цену по последним нескольким свечам. Но, это нам не даст ответа куда двигалась цена на этих интервалах времени. В этой статье мы определим это, пусть и очень приближенно. Тут хотел бы предупредить – будет математика.
Итак, поехали.
Давайте посмотрим на этот свечной график:
Думаю, что все видят, что цена снижается. Вопрос, конечно, насколько сильно. Но, снижение видно. А как это может понять скрипт? Он не понимает слов – ему цифры подавай. Например, 0 – цена не меняется, -1 – цена падает, 1 – цена растет. В общем, как-то так.
Давайте пока отойдем от свечей, и, как и в случае с определением средней цены, будем оперировать только ценами закрытия.
Если у нас есть некоторые значения цен закрытия, то мы можем выполнить линейную аппроксимацию (я предупреждал, что будет математика), которая показывает направление движения. Например, в экселе это называется «построить линию тренда». Вот пример:
На рисунке синим показаны значения, а черным – построенная по этим значениям линия тренда. Тут видно, что линия наклонена вниз.
Давайте теперь вспомним, что уравнение прямой выглядит так:
, где a и b – коэффициенты.
И по сути коэффициент a показывает в какую сторону наклонена прямая (если а положительное, то линия идет вверх, если а – отрицательное, то линия наклоняется вниз). Коэффициент b показывает как высоко проходит линия от оси x. В наших случаях b не будет отрицательным, так как это бы означало отрицательную цену акций.
Копнем глубже. Коэффициенты a и b определяются по формулам:
Как бы страшно это не выглядело – это вполне реализуемо. И мы это сделаем.
X – это будет номер свечи (от 1), а y – цена закрытия очередной свечи.
Ранее говорили, что за наклон отвечает коэффициент a. И вроде бы по логике, нам достаточно его определить. Но, он нам даст информацию на сколько меняется уровень цены. Не на сколько процентов, не во сколько раз – а на сколько. И тут вопрос: изменение цены за десять свечей на 1 копейку – это много или мало? Для Транснефти при цене акций более 100 тысяч за акцию – это ничто, для ВТБ при цене в районе 1,5 копейки за акцию – это катастрофа.
Поэтому вспоминаем, что уровень определяет коэффициент b. Он нам показывает насколько высока цена акций в принципе.
В общем, не буду вам морочить голову. Да и себе тоже в попытках воспроизвести все мои изыскания. Нам нужен коэффициент
Получается вот что: b – не может быть отрицательным, поэтому если К получится отрицательным, это означает, что отрицательный коэффициент a. А значит линия направлена вниз. Ну и наоборот. А если а близка к нулю, то и линия цены никуда не направлена. А деление на коэффициент b нам позволяет учитывать уровень цены. Если коэффициент а изменился на 1 рубль, а цена акции составляет 100 тысяч, то коэффициент К будет незначительным, что будет означать, что цена не меняется. Если же при изменении цены на 1 рубль цена акции составляет 10 рублей, то коэффициент К будет достаточно большим, что покажет нам, что изменения цены были значительными.
Дальше я построил несколько разных случайных значений, посчитал по ним коэффициенты а и b. И также по полученным уравнениям аппроксимации получил коэффициент изменения цены относительно начального значения. Вот такая таблица у меня получилась:
a/b – это коэффициент, который мы рассматривали выше. К изменения показывает на сколько меняется цена по 10 свечам. В первой строке она вырастает на 6,1%, в последней сроке – снижается на 6,1%.
Если теперь в Экселе построить эту зависимость, то получим такой график:
На рисунке показано уравнение аппроксимации этой зависимости, построенное методами Эксель.
Получается так:
Вот мы и пришли к тому что нам надо! Так мы получаем Кизм. И по его значению мы можем делать вывод растет цена и как сильно. К примеру, можем считать, что если цена изменилась на 1%, то это сильное изменение. Тут уже как мы примем.
Ну, что же давайте подведем промежуточный итог. Для реализации алгоритма и определения направления движения цены нам нужно выполнить следующие шаги:
- Скачать нужное количество свечей.
- Определить коэффициенты a и b.
- Зная коэффициенты a и b, вычислить значение Кизм. И сделать выводы об изменениях цен.
Давайте начнем реализовывать все это на QLUA.
Если мы посмотрим на формулу коэффициента а, то увидим, что там есть некоторые значения, расчет которых было бы удобно реализовать в виде функций: сумма элементов, сумма квадратов элементов, сумма произведений элементов двух массивов (x*y).
Реализация расчета этих значений будет такой:
function summ_quadro(mass) -- функция получает массив и возвращает сумму квадратов его элементов.
local res = 0; -- сюда положим результат
for key, val in pairs(mass) do -- проходимся по массиву.
res = res + val * val; -- добавляем к результату квадрат очередного значения.
end
return res;
end
function summ(mass) -- функция получает массив и возвращает сумму его элементов.
local res = 0; -- сюда положим результат
for key, val in pairs(mass) do -- проходимся по массиву.
res = res + val; -- добавляем к результату очередной элемент.
end
return res;
end
function summ2(mass1, mass2, num) -- функция получает два массива и возвращает сумму произведений поэлементно (x*y). Также функция получит количество элементов.
local res = 0; -- сюда положим результат
for i3 = 1, num, 1 do -- проходимся по порядку элементов.
res = res + mass1[i3] * mass2[i3]; -- добавляем к результату очередное произведение.
end
return res;
end
Если у нас значения x и y будут в отдельных массивах, который так и будут называться – x и y, то расчет коэффициента а будет производиться по формуле:
koef_a = (N * summ2(x,y,N) - summ(x) * summ(y)) / (N * summ_quadro(x) - summ(x)*summ(x));
после чего можно будет рассчитать коэффициент b
koef_b = (summ(y) - koef_a * summ(x)) / N;
Надеюсь, что все понятно.
Общий код реализованного скрипта можно посмотреть по этой ссылке: ссылка.
А скачать данный код можно по этой ссылке: ссылка.
Устанавливая переменные
gran_niz
gran_vverh
мы регулируем что мы считаем понижением цены, а что повышением. Соответственно gran_niz = 0.99 будет означать снижение цены на 1% на которое мы и будем реагировать. Более низкое снижение не будет считаться снижением.
gran_vverh=1.01 будет означать повышение цены на 1%. Меньшее повышение не будет считаться повышением. На него не реагируем.
На сегодня у меня все. Надеюсь, что голова у вас не закипела.
Пишите в комментариях – все ли вы поняли, получилось ли запустить данный скрипт и увидеть результат. Я пока экспериментировал, то не нашел графика, который показывал бы какое-то изменение – все показывает без изменений. А как у Вас?
Не забывайте подписываться на канал, если вы еще не подписались. Дальше будет её интереснее.
Всем пока.
=================================
Краткое содержание данного канала.
=================================