Данная публикация посвящена тому, как можно спрогнозировать, в какой интервал попадёт цена, на следующем периоде. Для этого возьмём дневные данные (Low) котировок форекс (forex) EURUSD (для фондового рынка процедура будет аналогична). Теперь рассмотрим по пунктам, как сделать прогноз интервала.
1) Необходимо определить количество начальных данных. Вопрос о количестве, которое необходимо рассматривать, является достаточно актуальным. Чтобы не забивать публикацию математикой и теорией хаоса — пусть это каждый решает для себя. В некоторых методах, принято брать либо 250 значений (год) либо 60 (квартал). Возьмём 251.
2) Теперь определим приросты — отнимем от текущих значений предыдущие. То есть Low_New=Low[j+1]-Low[j]; j=1..250. Получили новый ряд.
3) Считаем среднее значение: суммируем всё, а потом делим на количество (в нашем случае количество — 250). Для EURUSD (из примера) имеем -0,000679.
4) Считаем дисперсию. Для EURUSD дисперсия равна 0,010225.
5) Определим нижнюю и верхнюю границу интервала. Формула следующая (для нашего примера):
[-0,000679-k*0,010225;-0,000679+k*0,010225]
Что такое k? Это такое число, которое выбирают в зависимости от необходимой вероятности попадания в интервал. Ниже приведено значение вероятности и соответствующие значения k.
Вероятность
68,3%
86,6%
95,0%
95,4%
98,8%
99,0%
99,7%
99,9%
k
1
1,5
1,96
2
2,5
2,58
3
3,5
Если k=1, то вероятность попадания цены в интервал будет 68,3%, ну и т.д..
Пускай нам необходимо определить интервал попадания значения с вероятностью 68,3%, тогда подставим в интервал k=1. Имеем интервал: [-0.010904;0.009546].
6) В предыдущем пункте получен интервал для приростов! Не для самих значений Low! Теперь получим для самих значений Low. Как мы помним Low_New=Low[j+1]-Low[j] с одной стороны, и
-0.010904
-0.010904+Low[j]
Low[j] — мы знаем (это последнее значение выборки — 251-е), а Low[j+1] — полученный прогноз. В нашем случае прогноз на следующий шаг таков — с вероятностью 68,3% можно утверждать, что значение минимума цены (Low) завтра будет находиться в промежутке:
[-0.010904+1.2549;0.009546+1.2549]=[1.243996;1.264446]
Ниже приведён часовой график. Слово «Прогноз» написано между 2мя красными горизонтальными линиями, которые являются нижней и верхней границей вышеописанного интервала.

Следует отметить, что интервал достаточно широкий. Но иногда это можно использовать для торговли. Если посмотреть на график, то еще ночью цена оттолкнулась от уровня сопротивления 1.2736 и находилась утром еще находилась выше его. С одной стороны мы не знали, куда пойдет цена в дальнейшем (днем). Но с другой (с математической), мы знали, что Low будет лежать ниже 1.2640 с вероятностью 68,3% (согласитесь, что для форекса (да и акций) неплохая вероятность;)).
Таким образом, необходимо было определить точку входа на продажу (1.2736 — неплохой вариант) и тейк профит ставить (при консервативной торговле на 1.2640).
И это ещё не все! Если бы мы определили интервал, в который попадёт цена закрытия, и его нижняя граница была бы где-то в районе 1.2720, то можно было бы рассматривать сигналы на покупку после того, как цена дошла до прогнозируемого интервала своей нижней границы.
Ещё пару слов о фондовом рынке. Как вариант использования — прогноз интервала хая [20;25] с определенной вероятностью, а акция открывается с гэпом вниз (вчера на закрытии стоила 19$, сегодня открылась по 16$). Что с ней делать — думаю описывать не стоит).
P.S. Пункт 2 во многих случаях можно пропустить (по моему опыту в 80%), тогда соответственно и пункт 6 выполнять не нужно. Но дабы не попасть в те 20% лучше проделать всю процедуру, как она описана.
Archive for the ‘Матчасть’ Category
Статистический метод прогнозирования цен на форекс
Декабрь 6th, 2008Прогнозирование финансовых рынков. Нейросети. Однослойный персептрон.
Ноябрь 19th, 2008В данной публикации «Прогнозирование финансовых рынков. Нейросети. Однослойный персептрон.» хочу продемонстрировать работу самой простой нейронной сети — однослойный персептрон к прогнозирование финансовых рынков. Что такое однослойный персептрон (есть мнение, что правильнее перцептрон)?
Автор персептрона (F.Rosenblatt, 1957) рассматривал своё изобретение, как некоторую модель работы мозга. Но не будем останавливаться на биологических особенностях нейросетей.
Итак, однослойный персептрон. Схема персептрона представлена ниже.

x[k] — входные элементы (если говорить о теме прогнозирование финансовых рынков ими могут выступать цены, значения индикаторов, макроэкономические показатели и т.д.);
w[k] — веса (это те элементы, которые необходимо определить);
S=x[1]*w[1]+x[2]*w[2]+…+x[n]*w[n];
f — это функция активации (видов функций активации очень много, самый простой пример: если z>0, то f(z)=1, если z<0, то f(z)=0);
Y=f(S), это выход сети (если говорить о теме прогнозирование финансовых рынков, то выходами могут выступать как и в случае входов — цены, значения индикаторов, макроэкономические показатели и т.д.);
b — это сдвиг (во многих случаях его принимают равным 0, сделаем так и мы).
Теперь о том, как использовать эту схему для прогнозирование финансовых рынков. Замечу, что это не совсем статистическое прогнозирование цен. В данной публикации рассматриваются котировки форекс (forex) — дневные цены закрытия EURUSD.
1. Берем данные и нормируем. В нашем случае (с EURUSD) цены закрытия обрабатывались функцией g(Close[j])=1/(1+e^(-Close[j]))=x[j]. Это нужно для того, чтобы данные были в интервале [-1;1].
2. Разбиваем полученные значения на 2 части — обучающую выборку и проверочную (в случае с EURUSD обучающая выборка составила 29 значений). Определяемся с количеством элементов, подаваемых на вход сети, то есть с количеством иксов (в примере выбрано 10 иксов). Количество весов равно количеству иксов.
3. Присваиваем весам случайные значения (по своему скромному опыту — лучше брать сначала 0).
4. Считаем S.
5. Считаем Y. Как писалось выше Y=f(S). Для EURUSD в качестве f выступала уже известная функция g(S)=1/(1+e^(-S)). Получили некоторое значение Y. Так как нас интересует значение Y, которое является нормированной ценой закрытия, на 11-м шаге (наш прогноз), то мы сравниваем полученное Y на 11-м шаге с реальной (известной нам) нормированной ценой закрытия на 11-м шаге. Безусловно, что вначале они не совпадают. Поэтому мы берём и считаем ошибку путём вычитания из реального значения полученного. Дальше с теми же весами «смещаемся вправо» на один шаг и рассчитываем S=x[2]*w[1]+x[3]*w[2]+…+x[11]*w[10], дальше Y. Потом снова считаем ошибку прогноза на 12 шаге. И так продолжаем до конца обучающей выборки (то есть до 30 элемента). Получили 19 ошибок, которые необходимо просуммировать и поделить на 19 (эта «конечная» ошибка запоминается).
6. Дальше, по формуле w[p+1]=w[p]+h*e(p)*x(p) происходит коррекция весов.
e(p) — нам известно (это «конечная» ошибка, посчитанная на предыдущем шаге), w — это веса (нужно отметить, что порядковые номера остаются неизменными, то есть от 1 до 10, тут показано, что p+1 — это значит все 10 значений изменились, то есть p — это счётчик итераций), x[p] — это те же иксы с порядковыми номерами от 1 до 10 в случае если прогноз на 11-м шаге не совпал с реальным значением (если произошло совпадение, то иксы сдвигаются «вправо» на один шаг), h — число, которое влияет на скорость обучения (выбирается произвольно в зависимости от ситуации — в случае с EURUSD h=0,4). Итерация завершена.
7. Переходим на шаг 4. Если на шаге 5, полученная «конечная» ошибка больше чем ошибка на предыдущей итерации, то процесс обучения заканчивается и искомыми весами будут веса, полученные на предыдущей итерации. Таким образом получаем 10 весов и нам известно 10 иксов, считаем S, а потом считаем Y — это и будет наш прогноз на один шаг.
Вернёмся к нашему конкретному примеру прогнозирование финансовых рынков, а в частности — EURUSD. Была написана программка, которая реализует вышеописанное и ниже представлен график из программки с двумя кривыми — красной (прогноз на один шаг) и зелёной (реальные значения).

Как видно из графика, нейросеть на основе однослойного персептрона, мягко говоря, не очень хорошо делает прогнозирование финансовых рынков.
Вывод: модель в рассмотренном формате (когда брались только цены закрытия и вышеизложенный метод коррекции весов) непригодна для прогнозирование финансовых рынков.
От себя добавлю. Как вариант, для обучения (подбора весов) однослойного персептрона скорее всего лучше использовать генетические алгоритмы.
Что такое корреляция, коэффициент корреляции и корреляционная матрица?
Ноябрь 17th, 2008Во многих публикациях аналитики финансовых рынков пишут что-то типа: «…доллар коррелирует с ценами на нефть…». Что же значит слово «коррелирует»? Это слово является производным от слова корреляция. Если говорить по простому, то корреляция — это взаимосвязь между двумя величинами. То есть можно перефразировать фразу выше: «…доллар взаимосвязан с ценами на нефть…».
По определению, корреляция — это статистическая или вероятностная взаимосвязь двух и более величин. Корреляция имеет некоторую меру, которой служит коэффициент корреляции. Коэффициент корреляции может принимать значения от -1 до 1. Если значение, которое принимает коэффициент корреляции около +1, то говорят, о сильной положительной корреляции между двумя величинами (то есть два графика цен очень похожи и цена на одном движется почти синхронно с ценой на другом). Если значение, которое принимает коэффициент корреляции около -1, то говорят, что корреляция отрицательная между двумя величинами (то есть два графика цен почти полностью противоположны и цены на графиках движутся в противоположных направлениях: на одном — вверх, а на другом — вниз). Если значение, которое принимает коэффициент корреляции около 0, то в таком случае корреляция между двумя величинами отсутствует (то есть заметить хоть какую нибудь взаимосвязь между графиками невозможно). Каким образом рассчитывается коэффициент корреляции?
Коэффициент корреляции получаем следующим образом:

где
X, Y — собственно ряды;
то, что в знаменателе — произведение корней дисперсий рядов;

n — длина ряда;
то, что отнимается от X (читается «мю») — среднее значение ряда Х;
то, что отнимается от Y — среднее значение ряда Y.
Так рассчитывается коэффициент корреляции для двух рядов. Что же делать если рядов больше? Каким образом использовать коэффициент корреляции в этом случае? Для этого существует корреляционная матрица, элементами которой являются взаимные корреляции между переменными (т.е. масив, каждый элемент которого — коэффициент корреляции). Для трёх рядов (например X, Y и Z) корреляционная матрица вычисляется следующим образом:

где

Так как под рукой были только котировки с форекса, то приведу пример корреляционной матрицы, в расчет которой брались дневные значения цен закрытия (каждый ряд — 2059 значений).

По данной корреляционной матрице видно, что, например, между AUDCHF и AUDCAD корреляция практически нулевая (коэффициент корреляции = -0.08), то есть взаимосвязи между дневными графиками нет, несмотря на присутствие австралийского доллара в обоих парах. Между EURCHF и CHFJPY довольно большая отрицательная корреляция (коэффициент корреляции = -0.84), то есть когда EURCHF идёт вверх, CHFJPY — вниз (можно сказать, что с вероятностью 84%). Между AUDUSD и CHFJPY довольно большая положительная корреляция (коэффициент корреляции = 0.76), то есть когда AUDUSD идёт вверх, CHFJPY также идёт вверх (можно сказать, что с вероятностью 76%).
P.S. Корреляция лишь показывает взаимосвязь, а не прогнозирует финансовые рынки.
Что такое Тренд?
Ноябрь 9th, 2008По определению, тренд — это направленное движение цен в определённом направлении. В техническом анализе (согласно теории Доу) выделяют три типа тренда: бычий, медвежий и флэт. Более подробно про это можно прочитать в любой книге по техническому анализу. Целью данной публикации является ознакомление с «математической стороной» определения тренда.
Начнём с самого простого — это линейный тренд.
Линейный тренд — это тренд (точнее прямая) вида y=a+bx. В качестве y служит цена, а в качестве x — порядковый номер элемента ряда («время»). Остановимся на этом более подробнее. Предположим у нас есть 500 значений временного ряда (например цен закрытия EURGBP). Тогда в качестве y будут служить именно эти значения. А в качестве x — числа 1, 2, 3, … 499, 500. Таким образом имеем одно уравнение и две неизвестных — a и b. Оценить эти неизвестные можно, используя метод наименьших квадратов (МНК). Что касается МНК, нужно отметить, что он реализован во многих статистических программах, потому останавливаться на его описании и особенностях использования нет смысла.
Ниже приведён дневной график цен закрытия EURGBP (форекс) и линия тренда, которая имеет вид:
y=0.642642+0.000344*x

Рассмотрим теперь квадратичный тренд. Это некоторая кривая вида:
y=a+bx+cx^2. Тут 3 неизвестных параметра — это a, b и c. Оцениваются они также МНК. В кубичном тренде (вида y=a+bx+cx^2+dx^3) уже будет 4 неизвестных.
Ниже приведён все тот же график цен закрытия EURGBP (форекс) и линия тренда, которая имеет вид: y=0.6871927905-0.0006034359928*x+0.000004386*x^2-0.00000000554*x^3

Если продолжить, то получим длинное полиномиальное уравнение для оценки тренда. Нужно отметить, что чем больше степень полинома, тем кривая больше «приклеивается» к графику.
К слову — линию тренда также можно получить наложив на график простое скользящее среднее , но тогда будет задержка.
Ниже приведён все тот же график цен закрытия EURGBP (форекс) и линия тренда в виде полинома 10-й степени (уравнение слишком длинное, поэтому отсутствует).

P.S. Если кому нужна помощь в определении уравнения тренда — пишите, помогу;)