Статистический анализ рынка Форекс

Программирование прибыли: от азов к секретам мастерства. Читайте, спрашивайте, делитесь опытом.
Бонус за сообщение 0.5$
Ответственный Модератор - Haos

Статистический анализ рынка Форекс

Сообщение Рэндом » 22 ноя 2019, 04:43

Прежде всего об инструментах. Я использую Питон и код буду приводить на нем. Можно будет разобраться с тем, как всё работает, а можно будет запустить готовый код и получить результат.

Установка Python https://www.python.org/downloads/release/python-372/

Необходимо скачать эту версию. При установки выбрать добавить в Path. Это необходимо чтобы можно было запускать Питон и пакетный менеджер из командной строки.

Далее в Пауершел необходимо выполнить следующие команды:

pip install numpy
pip install matplotlib
pip install pandas
pip install statsmodels
pip install MetaTrader5
pip install pytz
pip install install jupyter

Это установит необходимые пакеты. Важный пакет jupyter он устанавливает Юпитер ноутбук. Это очень удобная среда программирования для Питона. Мы будем работать в ней. Эта среда отличается интерактивностью. Запускается она в пауэршел командой jupyter-notebook. Предварительно необходимо перейти в рабочую папку.

Так же обязательно установить терминал Метатрейдер 5 и открыть демо счет.

Весь код будет выложен здесь https://github.com/RandomKori/Forex_statistics

Кому не терпеться посмотреть могут его скачать и запустить в Юпитере.

Продолжение следует.
Аватар пользователя
Рэндом
Специалист MQL
 
Сообщений: 13700
Зарегистрирован: 18 июл 2013, 08:05
Средств на руках: 31.45 Доллар
Группа: Администраторы
Благодарил (а): 1131 раз.
Поблагодарили: 3174 раз.
Каждый заблуждается в меру своих возможностей.

Статистический анализ рынка Форекс

Сообщение Рэндом » 25 ноя 2019, 00:43

Приступаем к разбору кода. Прежде всего необходимо инициализировать терминал.
Код: выделить все
from datetime import datetime
from MetaTrader5 import *
MT5Initialize()
MT5WaitForTerminal()

print(MT5TerminalInfo())
print(MT5Version())

Первым делом импортируем необходимые функции.
Функция MT5Initialize запускает теминал и подключает его к среде Питон. Функция MT5WaitForTerminal ждет когда терминал запуститься и инициализация будет завешена. Эта функция обязательна так как терминалу требуется время на запуск и довольно много времени.
Далее идет загрузка данных.
Код: выделить все
rates = MT5CopyRatesRange("EURUSD", MT5_TIMEFRAME_D1, datetime(1971,1,1), datetime(2019,11,21))

Функция MT5CopyRatesRange загружает данные баров за указанный временной период. Сначала мы задаем символ, затем таймфрейм, после начальную и конечную даты. Эта функция возвращает список котировок.
Далее нам необходимо преобразовать их в таблицу Пандас. Это делается для удобства дальнейшей работы. Делает это следующий код.
Код: выделить все
import pandas as pd
d = pd.DataFrame(list(rates),
                           columns=['time', 'open', 'high', 'low', 'close', 'tick_volume', 'spread', 'real_volume'])

В функцию DataFrame передается список и задаются имена колонок.
Всё данные получены и подготовлены для дальнейшей работы.
Продолжение следует.

PS если на гитхаб вы откроете файл Euro 1.ipynb кликнув по нему, то увидите результаты его работы. Так можно следить за тем что получается не запуская код.
Аватар пользователя
Рэндом
Специалист MQL
 
Сообщений: 13700
Зарегистрирован: 18 июл 2013, 08:05
Средств на руках: 31.45 Доллар
Группа: Администраторы
Благодарил (а): 1131 раз.
Поблагодарили: 3174 раз.
Каждый заблуждается в меру своих возможностей.

Статистический анализ рынка Форекс

Сообщение Рэндом » 26 ноя 2019, 02:05

Прежде чем использовать статистику нам надо определиться какие данные бара мы будем использовать. Лучше всего использовать среднюю цену бара. Она учитывает как максимумы, так и минимумы бара. Вычисляется она так:
Код: выделить все
d['median']=(d['high']+d['low'])/2

Как ведете это довольно просто. Эта формула обработает все строки таблицы и занесет результат в новый столбец.
Статистику можно применять только к стационарным рядам. Поэтому первое что необходимо сделать это проверить ряд на стационарность. Для этого сначала импортируем функции, созданные мной в отдельном файле. Это сделано, потому что они часто используются.
Код: выделить все
from incl import *

Проверим ряд на стационарность.
Код: выделить все
statc(d['median'].values)

Результат:
adf: -2.520483357770675
p-value: 0.11056971212659916
Critical values: {'1%': -3.43087017142352, '5%': -2.86176989000953, '10%': -2.566892365468227}
есть единичные корни, ряд не стационарен

Как видим ряд не стационарен. В статистике есть такое понятие как приведение к стационарности этим и будем заниматься дальше, но сначала сделаем ещё несколько расчетов.
Код: выделить все
dtl=d['median'].values
hurst(dtl)

Результат: 0.5391513426750832
Мы вычислили показатель Хёрста. Он показывает случаен ли рынок. Значение близкое к 0.5 говорит о случайности.
Далее построим график распределения вероятностей.
Код: выделить все
%matplotlib nbagg
import matplotlib.pyplot as plt


Код: выделить все
d['median'].plot.kde()

Результат:
in1.png


Распределение ни на что не похоже. Я затрудняюсь сказать к какому классу оно относиться. Но этого следовало ожидать.
На сегодня все. Продолжение следует.
Аватар пользователя
Рэндом
Специалист MQL
 
Сообщений: 13700
Зарегистрирован: 18 июл 2013, 08:05
Средств на руках: 31.45 Доллар
Группа: Администраторы
Благодарил (а): 1131 раз.
Поблагодарили: 3174 раз.
Каждый заблуждается в меру своих возможностей.

Статистический анализ рынка Форекс

Сообщение Рэндом » 27 ноя 2019, 01:57

Попытаемся привести ряд к стационарному виду. Для этого рассчитаем приращение цены. То есть разность между текущим и предыдущим барами.
Код: выделить все
d['delta'] = d['median'].diff(1).fillna(0)

Как видите делается это довольно просто функций diff. Аргумент функции указывает смещение. Функция fillna заполняет значение, которое неопределенно указанным значением. В нашем случае будет неопределённо значение первой строки.
Проверим ряд на стационарность.
Код: выделить все
statc(d['delta'].values)

Результат:
adf: -25.831260089702525
p-value: 0.0
Critical values: {'1%': -3.4308701300495503, '5%': -2.8617698717258855, '10%': -2.5668923557359618}
единичных корней нет, ряд стационарен
Как видим ряд стационарен. В ряде приращений есть вся информация о цене. А именно направление движения и изменение цены в пунктах.
Теперь наша задача разобраться с распределением. Построим график распределения.
Код: выделить все
d['delta'].plot.kde()

in2.png

Очень похоже на нормальное распределение. Нам важно знать является ли распределение нормальным или нет. От этого зависит какие методы статистики мы будем использовать. Есть параметрические и непараметрические методы. Для нормального распределения используются параметрические.
Всё-таки хочется быть уверенным нормальное ли это распределение. Поэтому проведем специальный тест на нормальность распределения.
Код: выделить все
df=d[8000:]
isnorm(df['delta'].values)

Прежде всего мы выделили около 5 000 строк, так как тест на нормальное распределение работает максимум с 5 000 значений.
Результат:
Statistics= 0.9746578335762024
p-value:= 8.119633978689089e-28
Распределение не соответствует нормальному
Как видим распределение не соответствует нормальному, но график распределения очень похож на нормальное. Чтобы убедиться проведем ещё один графический тест. Построим график q-квантилей.
Код: выделить все
qqgraf(d['delta'])

in3.png

Синея, линия — это график значений. Как видим, они сильно отклоняются от прямой. Наклон прямой линии значительно меньше 45 градусов. Всё это свидетельствует, что распределение не является нормальным. Поэтому необходимо использовать непараметрические статистические методы.
Интересен показатель Хёрста для ряда приращений. Он равен 0.0016815081616938215. Что значительно меньше 0.5, а это свидетельствует о не случайности данных. То, что он меньше 0.5 свидетельствует о том, что направление движения цены часто меняется.
Не смотрите на анализ скользящей средней в коде. Это тупиковый ход. Так как возрастает p-value что не есть хорошо.
Продолжение следует.
Аватар пользователя
Рэндом
Специалист MQL
 
Сообщений: 13700
Зарегистрирован: 18 июл 2013, 08:05
Средств на руках: 31.45 Доллар
Группа: Администраторы
Благодарил (а): 1131 раз.
Поблагодарили: 3174 раз.
Каждый заблуждается в меру своих возможностей.

Статистический анализ рынка Форекс

Сообщение Haos » 27 ноя 2019, 08:27

Очень похоже на нормальное распределение.

Похожесть на нормальное распределение не означает что это нормальное. Если твой график верен, хотя не показывает левые и правые части кривой, если вырезал - то это нельзя делать и масштаб менять нельзя. Так вот, уже по внешнему виду, можно сказать, что это никакое не нормальное распределение, т.к. имеется высокий суженный пик и "тяжелые хвосты", т.е. дело пахнет распределением Коши.
Если это так, то
одна из проблем распределения Коши в том, что выборочное среднее не оценивает матожидание. Элементы выборки сильно выбрасываются в хвосты распределений (принимают большие по модулю значения), как и само выборочное среднее.

Поэтому результат, который ты получил, что распределение не является нормальным, совершенно верный. Очень хорошо, насколько я понял, что средства Питона позволяют это делать.
Аватар пользователя
Haos
Специалист MQL
 
Сообщений: 24699
Зарегистрирован: 29 мар 2014, 16:07
Средств на руках: 193.70 Доллар
Группа: Главные модераторы
Благодарил (а): 3379 раз.
Поблагодарили: 8200 раз.

Статистический анализ рынка Форекс

Сообщение Рэндом » 27 ноя 2019, 23:35

Сегодня сделаю небольшое отступление. Мы поменяем среду программирования. Нет у нас будет все тот же Питон. Только появиться новая возможность устанавливать пакеты. Это необходимо для двух сложных пакетов.
Вот эта среда программирования https://www.anaconda.com/distribution/
Скачайте версию 3.7 и установите. Настройки при установке не надо менять.
Запустите анаконда пауершел и выполните следующую команду:
conda update –all
Это обновит анаконду.
Далее установите пакет для связи с МТ5.
pip install MetaTrader5
У нас будет эксперимент с нейронными сетями. Если хотите его запустить выполните следующие команды:
conda install tensorflow-gpu
Pip install keras
Устанавливать нейронные сети имеет смысл если у вас видеокарта от Нвидиа с поддержкой CUDA.
А теперь ради чего все это затевалось. Модуль для Байесовской статистики.
conda install pymc3
Эта статистика обнадеживает. По мере её изучения я буду писать код и продолжать тему. Это непараметрическая статистика. Кому натерпеться могут почитать книгу «Вероятностное программирование на Python: байесовский вывод и алгоритмы».
Продолжение следует.
Аватар пользователя
Рэндом
Специалист MQL
 
Сообщений: 13700
Зарегистрирован: 18 июл 2013, 08:05
Средств на руках: 31.45 Доллар
Группа: Администраторы
Благодарил (а): 1131 раз.
Поблагодарили: 3174 раз.
Каждый заблуждается в меру своих возможностей.

Статистический анализ рынка Форекс

Сообщение Рэндом » 28 ноя 2019, 23:37

Первое что нам интересно посмотреть есть ли корреляция в данных. Нам нужна не всякая корреляция. Нам нужна непараметрическая корреляция. Подойдет корреляция Спирмена.
Сначала подготовим данные:
Код: выделить все
ln=d['delta'].values
ln
import numpy as np
as_strided = np.lib.stride_tricks.as_strided
win = 5
v = as_strided(ln, (len(d) - (win - 1), win), (ln.strides * 2))
v
wn=pd.DataFrame(v,columns=['d1','d2','d3','d4','d5'])
wn

Мы создали скользящие окно. Оно создает из одномерного массива двумерный, но особым образом. Каждая следующая колонка смещена на одно значение относительно предыдущей.
Теперь собственно расчет корреляции.
Код: выделить все
from scipy.stats import spearmanr
coef, p = spearmanr(wn['d1'], wn['d2'])
print('кореляция ',coef)
print('p-value ',p)

Сразу скажу, что корреляция есть только между двумя смежными днями и то незначительная.
Результат:
корреляция 0.2065344675393691
p-value 2.488194147171797e-121
p-value меньше 0.05 это значит корреляция есть. 0.2 коэффициент корреляции. Он очень мал. Значимым был бы больше 0.7.
Хотелось бы попробовать предсказать следующий день. Корреляция показала маленькое значение. Это значит линейной зависимости нет. Надо попробовать нелинейную. А это нейронные сети. Что ж попробуем их применить.
Код: выделить все
from Regresion import *
regresion(wn1)

Я не привожу код для создания скользящего окна. Если интересно смотрите на Гитхаб. Кстати не забудьте обновить код с Гитхаб. Он там обновляется ежедневно.
Результат:
Testing ------------
2572/2572 [==============================] - 0s 89us/step
test cost: 0.005390378524886783
Для функции потерь я использовал среднюю абсолютную ошибку. На тестовом наборе данных (test cost: 0.005390378524886783) она составляет 50 пунктов. Это очень много для дневных данных. Лучшего нейронными сетями не достичь. Поэтому переходим к Байесовской статистике.
Продолжение следует.
PS Есть более современная книга которая описывает использование установленной версии библиотеки pymc «Байесовский анализ на Python».
Аватар пользователя
Рэндом
Специалист MQL
 
Сообщений: 13700
Зарегистрирован: 18 июл 2013, 08:05
Средств на руках: 31.45 Доллар
Группа: Администраторы
Благодарил (а): 1131 раз.
Поблагодарили: 3174 раз.
Каждый заблуждается в меру своих возможностей.

Статистический анализ рынка Форекс

Сообщение Рэндом » 01 дек 2019, 01:02

Я столкнулся с тем, что нужны гипотезы о рынке которые я бы мог проверить методами статистики. Одну две гипотезы уже проверены. Об этом далее. Но у меня сложности с генерацией гипотез. Просьба написать утверждения о рынке, о характере движения в этой теме. Желательно такие, чтобы на них можно было построить систему. О том что уже проверил напишу далее. Продолжаю изучать Баесовскую статистику.
Аватар пользователя
Рэндом
Специалист MQL
 
Сообщений: 13700
Зарегистрирован: 18 июл 2013, 08:05
Средств на руках: 31.45 Доллар
Группа: Администраторы
Благодарил (а): 1131 раз.
Поблагодарили: 3174 раз.
Каждый заблуждается в меру своих возможностей.

Статистический анализ рынка Форекс

Сообщение Nord » 01 дек 2019, 08:15

А можно проверить степень случайности изменений цены в барах в зависимости от ТФ? И выдать в порядке возрастания степени случайности, скажем, 5 мин, час, день и недельные бары. Для точности эксперимента использовать данные по трем парам: EURUSD, GBPJPY, EURAUD.
Аватар пользователя
Nord
Администратор
 
Сообщений: 8112
Зарегистрирован: 17 июл 2013, 15:55
Средств на руках: 193.10 Доллар
Откуда: Украина
Группа: Администраторы
Благодарил (а): 3187 раз.
Поблагодарили: 6752 раз.
Правила форума - залог долгой жизни на форуме!

Статистический анализ рынка Форекс

Сообщение Tit4 » 01 дек 2019, 08:38

Nord писал(а):А можно проверить степень случайности изменений цены в барах в зависимости от ТФ? И выдать в порядке возрастания степени случайности, скажем, 5 мин, час, день и недельные бары. Для точности эксперимента использовать данные по трем парам: EURUSD, GBPJPY, EURAUD.

А что это даст? Точнее, можно уточнить, для какой цели поставлен данный вопрос и каким образом полученный результат возможно применить на практике в торговле? Если принять за данность хаотичное движение цены, то возрастающая степенеь случайности не столь серьезно отразится на итоговом значении. Или я чего то недопонял.
Аватар пользователя
Tit4
Главный модератор
 
Сообщений: 19386
Зарегистрирован: 02 фев 2015, 17:39
Средств на руках: 3,790.10 Доллар
Группа: Главные модераторы
Благодарил (а): 5887 раз.
Поблагодарили: 5379 раз.


Вернуться в MQL – теория и практика

Кто сейчас на форуме?

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 48

Права доступа к форуму

Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

cron