Автоматический расчет описательных статистик выборки на MQL5

 

Уважаемые участники форума!

Передо мной встала задача из области статистики и прогнозирования. Прошу помочь идеями и желательно кодом!

Итак задачка такая. Есть набор наблюдений со случайной частотой в выборке, однако частота эта имеет временную шкалу, и каждое наблюдение принимает значение 0 или 1.

Если посчитать в процентном соотношении, то вероятность получения единицы, допустим 40%, а нуля соответственно 60%.

Задача - определить, сохраниться эта пропорция дальше, или она существенно изменится. Или, допустим, может сильно колебаться на длительных интервалах.

Как я представляю сейчас себе решение:

1. Разбиваю все данные (выборку) на подвыборки с равным интервалом (по числу событий или времени - пока не важно).

2. Оцениваю процент единиц на каждом интервале. Сохраняю результаты в отдельный массив (arr_Chisla).

3. Рассчитываю статистические описательные метрики для полученной выборки.

4. На базе метрик из пункта 3 строю модель с помощью машинного обучения.

Так вот, хотелось бы больше идей по описательной статистике, нежели есть в стандартных библиотеках MQL5.

Что я отобрал, показываю в виде функции ниже

//+------------------------------------------------------------------+
//|Расчет метрик по числовому рядау
//+------------------------------------------------------------------+
void Calc_Metrics(double &arr_Chisla[], double &arr_Metrics[])
{
   ArrayResize(arr_Metrics,100);
   int Size_arr_Chisla=ArraySize(arr_Chisla);
   int N=0;
   arr_Metrics[N++]=MathMean(arr_Chisla);//Рассчитывает среднее значение (первый момент) элементов массива
   arr_Metrics[N++]=MathVariance(arr_Chisla);//Рассчитывает дисперсию (второй момент) элементов массива
   arr_Metrics[N++]=MathSkewness(arr_Chisla);//Рассчитывает коэффициент асимметрии (третий момент) элементов массива
   arr_Metrics[N++]=MathKurtosis(arr_Chisla);//Рассчитывает коэффициент эксцесса (четвертый момент) элементов массива
   arr_Metrics[N++]=MathMedian(arr_Chisla);//Рассчитывает  медианное значение элементов массива
   arr_Metrics[N++]=MathStandardDeviation(arr_Chisla);//Рассчитывает стандартное отклонение элементов массива
   arr_Metrics[N++]=MathAverageDeviation(arr_Chisla);//Рассчитывает среднее отклонение элементов массива

   double Tukey_minimum=0.0;// минимальное значение
   double Tukey_lower_hinge=0.0;// нижний квартиль
   double Tukey_median=0.0;// среднее значение
   double Tukey_upper_hinge=0.0;// верхний квартиль
   double Tukey_maximum=0.0;// максимальное значение
   MathTukeySummary(arr_Chisla,true,Tukey_minimum,Tukey_lower_hinge,Tukey_median,Tukey_upper_hinge,Tukey_maximum);//Рассчитывает пятичисловую сводку Тьюки (минимум, нижний квартиль, среднее, верхний квартиль, максимум) для элементов массива.
   arr_Metrics[N++]=Tukey_minimum;
   arr_Metrics[N++]=Tukey_lower_hinge;
   arr_Metrics[N++]=Tukey_median;
   arr_Metrics[N++]=Tukey_upper_hinge;
   arr_Metrics[N++]=Tukey_maximum;

   arr_Metrics[N++]=MathSum(arr_Chisla);//Возвращает сумму элементов массива.
   arr_Metrics[N++]=MathProduct(arr_Chisla);//Возвращает произведение элементов массива.

   ArrayResize(arr_Metrics,N);
}

Какие ещё есть идеи полезных метрик?

 

Как по мне - это "пальцем в небо"

Возьмите для примера среднюю вероятность за предыдущих 20 баров (этих 0 и 1) и сравните насколько отличается эта "средняя вероятность" с текущим баром по всей выборке


* и если честно мне пока не понятно где и для каких задач вы будете применять это? (это же всё равно что угадать орёл или решка, или что выпадет на кубике от 1 до 6 - в таких случаях очень трудно добиться положительного матожидания)

 
Aleksey Vyazmikin:

Итак задачка такая. Есть набор наблюдений со случайной частотой в выборке, однако частота эта имеет временную шкалу, и каждое наблюдение принимает значение 0 или 1.

Если посчитать в процентном соотношении, то вероятность получения единицы, допустим 40%, а нуля соответственно 60%.

Задача - определить, сохраниться эта пропорция дальше, или она существенно изменится. Или, допустим, может сильно колебаться на длительных интервалах.

Для решения данной задачи можно использовать анализ временных рядов. Один из подходов заключается в использовании модели ARIMA (авторегрессия-скользящее среднее). ARIMA - это модель, которая используется для прогнозирования временных рядов, она основывается на предположении, что временной ряд является комбинацией тренда, цикла и случайной составляющей.

В вашем случае, можно рассматривать наблюдения как временной ряд, где каждое наблюдение принимает значение 0 или 1. С помощью ARIMA можно построить модель для прогнозирования значений в будущем и проверить, сохранится ли пропорция 0 и 1, или она изменится. ARIMA позволяет оценить как тренд, так и сезонность и учитывать корреляцию между соседними значениями ряда.

Пример кода для ARIMA:

import pandas as pd
import numpy as np
from statsmodels.tsa.arima_model import ARIMA

# Создаем временной ряд из наблюдений
obs = pd.Series(np.random.binomial(1, 0.4, size=1000))

# Разделяем выборку на обучающую и тестовую
train = obs[:800]
test = obs[800:]

# Определяем параметры модели ARIMA
model = ARIMA(train, order=(1, 0, 1)) # order=(p, d, q) - параметры модели ARIMA

# Обучаем модель на обучающей выборке
model_fit = model.fit(disp=0)

# Прогнозируем значения на тестовой выборке
y_pred = model_fit.forecast(len(test))[0]

# Считаем метрику качества
mse = np.mean((y_pred - test)**2)
print('MSE:', mse)

Если mse полученного прогноза большой, то это может указывать на то, что пропорция 0 и 1 может изменяться в будущем. Если же mse маленький, то можно сделать вывод, что пропорция 0 и 1 остается примерно одинаковой во времени.

Также можно использовать другие методы анализа временных рядов, например, моделирование волн с помощью вейвлет-анализа или моделирование с помощью рекуррентных нейронных сетей.

Ответ сгенерирован ChatGPT.

 
Lilita Bogachkova #:

Для решения данной задачи можно использовать анализ временных рядов. Один из подходов заключается в использовании модели ARIMA (авторегрессия-скользящее среднее). ARIMA - это модель, которая используется для прогнозирования временных рядов, она основывается на предположении, что временной ряд является комбинацией тренда, цикла и случайной составляющей.

В вашем случае, можно рассматривать наблюдения как временной ряд, где каждое наблюдение принимает значение 0 или 1. С помощью ARIMA можно построить модель для прогнозирования значений в будущем и проверить, сохранится ли пропорция 0 и 1, или она изменится. ARIMA позволяет оценить как тренд, так и сезонность и учитывать корреляцию между соседними значениями ряда.

Пример кода для ARIMA:

Если mse полученного прогноза большой, то это может указывать на то, что пропорция 0 и 1 может изменяться в будущем. Если же mse маленький, то можно сделать вывод, что пропорция 0 и 1 остается примерно одинаковой во времени.

Также можно использовать другие методы анализа временных рядов, например, моделирование волн с помощью вейвлет-анализа или моделирование с помощью рекуррентных нейронных сетей.

Ответ сгенерирован ChatGPT.

А каковы результаты предложенного вами метода?
 
Alexandr Sokolov #:
А каковы результаты предложенного вами метода?

Это пример использования MSE для решения задач прогнозирования временных рядов, анализа сигналов и других задач, где необходимо прогнозировать числовое значение

Figure_1

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Разговор с искусственным интеллектом (ИИ) о форексе.

Lilita Bogachkova, 2023.03.24 22:18

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


Модель представляет собой нейронную сеть, которая состоит из нескольких слоев и используется для решения задачи регрессии.

Алгоритм применения этой нейронной сети заключается в следующем:

  1. Задается структура модели, включающая в себя сверточные слои, слои пакетной нормализации, плотные слои, слои LSTM, регуляризацию и отсев нейронов.
  2. Модель компилируется с помощью функции потерь mean squared error (MSE), оптимизатора Adam и метрик MSE и mean absolute error (MAE).
  3. Модель готова к обучению на наборе данных, представленном в виде массивов numpy.

Стоит отметить, что данная модель была реализована с использованием фреймворка TensorFlow и библиотеки Keras. Она может быть использована для решения задач прогнозирования временных рядов, анализа сигналов и других задач, где необходимо предсказать числовую величину.


Первые три слоя - это сверточные слои (Conv1D) с функцией активации ReLU. Они обрабатывают входные данные с размерностью (window_size_value, 1) и извлекают признаки из исходных данных. После каждого сверточного слоя применяется слой нормализации данных (BatchNormalization).

Следующие три слоя - это полносвязные слои (Dense), которые применяются для обработки выходных данных сверточных слоев. После первого полносвязного слоя применяется слой отсева (Dropout) с коэффициентом 0.2, который случайным образом выключает некоторые нейроны для предотвращения переобучения. Последний полносвязный слой имеет один нейрон и использует линейную функцию активации.

Следующие два слоя - это рекуррентные слои LSTM. Они предназначены для обработки последовательных данных и позволяют учитывать контекст из прошлых временных шагов. После каждого LSTM слоя также применяется слой нормализации данных (BatchNormalization) и слой отсева (Dropout) с коэффициентом 0.2.

Последние два слоя - это полносвязные слои с регуляризацией (kernel_regularizer и bias_regularizer) и случайной инициализацией весов (kernel_initializer). Первый полносвязный слой имеет размерность filters_min_value и использует функцию активации ReLU. После него применяется слой отсева (Dropout) с коэффициентом 0.5. Последний полносвязный слой имеет один нейрон и использует линейную функцию активации.

Код использует два callback-объекта в обучении модели:

  1. LearningRateScheduler - позволяет динамически изменять скорость обучения модели в зависимости от номера эпохи. В данном случае скорость обучения определяется лямбда-функцией, которая увеличивает скорость обучения в 10 раз каждые 50 эпох. Это помогает ускорить обучение в начале процесса и уменьшить скорость в конце, чтобы достичь более точных результатов.

  2. EarlyStopping - позволяет остановить обучение модели раньше, если модель перестает улучшаться на проверочных данных. Это помогает предотвратить переобучение и ускорить процесс обучения. Монитором, на основе которого будет приниматься решение о прекращении обучения, является val_loss , который отслеживает значение функции потерь на проверочных данных. patience_value определяет количество эпох, которые необходимо дождаться, чтобы убедиться в том, что модель не улучшается, прежде чем остановить обучение. Параметр restore_best_weights=True позволяет сохранить веса модели, которые достигли наилучших результатов на проверочных данных, чтобы использовать их в дальнейшем.

Figure_1

Figure_2

Модель обучалась на 31680 свечей RSI, таймфрейм H1 AUDUSD.


Результаты теста:

Верхний график — фактические данные, нижний график — прогнозные данные AUDCAD
Pearson Correlation coefficient: 0.95, Average correlation, window size 24: 0.74



Верхний график — фактические данные, нижний график — прогнозные данные  AUDNZD
Pearson Correlation coefficient: 0.95, Average correlation, window size 24: 0.73


Верхний график — фактические данные, нижний график — прогнозные данные  AUDCHF
Pearson Correlation coefficient: 0.95, Average correlation, window size 24: 0.74



Верхний график — фактические данные, нижний график — прогнозные данные  AUDJPY
Pearson Correlation coefficient: 0.95, Average correlation, window size 24: 0.75


Верхний график — фактические данные, нижний график — прогнозные данные  AUDUSD
Pearson Correlation coefficient: 0.95, Average correlation, window size 24: 0.75


Верхний график — фактические данные, нижний график — прогнозные данные  CHFJPY
Pearson Correlation coefficient: 0.95, Average correlation, window size 24: 0.76


Верхний график — фактические данные, нижний график — прогнозные данные  EURAUD
Pearson Correlation coefficient: 0.94, Average correlation, window size 24: 0.73



Верхний график — фактические данные, нижний график — прогнозные данные  EURCAD
Pearson Correlation coefficient: 0.94, Average correlation, window size 24: 0.70


Верхний график — фактические данные, нижний график — прогнозные данные  EURCHF
Pearson Correlation coefficient: 0.94, Average correlation, window size 24: 0.68


Верхний график — фактические данные, нижний график — прогнозные данные  EURGBP
Pearson Correlation coefficient: 0.95, Average correlation, window size 24: 0.71


Верхний график — фактические данные, нижний график — прогнозные данные  EURJPY
Pearson Correlation coefficient: 0.94, Average correlation, window size 24: 0.76


Верхний график — фактические данные, нижний график — прогнозные данные  EURUSD
Pearson Correlation coefficient: 0.95, Average correlation, window size 24: 0.73



Верхний график — фактические данные, нижний график — прогнозные данные  GBPAUD
Pearson Correlation coefficient: 0.94, Average correlation, window size 24: 0.76



Верхний график — фактические данные, нижний график — прогнозные данные  GBPCHF
Pearson Correlation coefficient: 0.95, Average correlation, window size 24: 0.71



Верхний график — фактические данные, нижний график — прогнозные данные  GBPJPY
Pearson Correlation coefficient: 0.95, Average correlation, window size 24: 0.75



Верхний график — фактические данные, нижний график — прогнозные данные  GBPUSD
Pearson Correlation coefficient: 0.95, Average correlation, window size 24: 0.74



Верхний график — фактические данные, нижний график — прогнозные данные  NZDUSD
Pearson Correlation coefficient: 0.94, Average correlation, window size 24: 0.74



Верхний график — фактические данные, нижний график — прогнозные данные  USDCAD
Pearson Correlation coefficient: 0.94, Average correlation, window size 24: 0.72



Верхний график — фактические данные, нижний график — прогнозные данные  USDCHF
Pearson Correlation coefficient: 0.95, Average correlation, window size 24: 0.72



Верхний график — фактические данные, нижний график — прогнозные данные  USDJPY
Pearson Correlation coefficient: 0.95, Average correlation, window size 24: 0.76



 
Alexandr Sokolov #:

Как по мне - это "пальцем в небо"

Возьмите для примера среднюю вероятность за предыдущих 20 баров (этих 0 и 1) и сравните насколько отличается эта "средняя вероятность" с текущим баром по всей выборке


* и если честно мне пока не понятно где и для каких задач вы будете применять это? (это же всё равно что угадать орёл или решка, или что выпадет на кубике от 1 до 6 - в таких случаях очень трудно добиться положительного матожидания)

Понятно, что задача не понятна :) Не нужно сравнивать среднее значение с элементом, а нужно сравнивать набор средних значений с одним набором. По сути нужно определить, похожи ли в целом средние значения событий. Если они похожи, то и дальше могут быть похожи, а если это единоразовые явления, скопившиеся в паре измерений - выбросы, то дальше их может не быть.

Представьте задачу так - есть Т-образный перекресток, к которому подъезжают водители и они поворачивают то направо (1), то налево (0). Вот мы каждый день считаем в течении месяца среднее значение. Показания каждый день колеблются, но не существенно, есть факторы которые не известны, но они цикличные - допустим в пятницу больше поворачивают налево - это дорого из города, но не зимой, а в среду проходит товарный поезд через весь город прям на завод, поэтому люди едут в объезд и поворачивают направо. Причина для наблюдателя не понятна, но будет некая закономерность. И вдруг ремонт дороги, что пересекает дорога направо и весь месяц увеличивается поток машин налево. Ремонт дорог - дело редкое в регионах и длился процесс два месяца - после ремонта решили по плану трубы поменять, что шли как раз вдоль полотна или даже под ним. За весь период наблюдения поворот направо был осуществлен в 65%, а налево 35%, при этом в месяцы ремонта дороги - налево свернуло 10%, а направо 90%.

Так вот, нужно понять, видимо, были ли выбросы - сверх редкие события, или это не выбросы, а периодически сильные отклонения, как часто они происходят, что бы попасться на следующем временном интервале (или на 3х - чем дольше стабильность - тем лучше), а может и другие умозаключения, которые помогут определить вероятность сильного изменения пропорции.

Сразу не написал в задаче, но надо найти отрицательную величину изменения, что это - есть эталон и мы определяем дельту, так вот эта дельта не должна стать отрицательной на новых данных. К примеру единиц 36% в выборке, а эталон 30%, значит положительное значение дельты 6%, если значение дельты будет ниже нуля, то это негативная ситуация, которую надо идентифицировать.

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

Если что не понятно с примером - спрашиваете - к сожалению, я часто недостаточно детально объясняю.

 
Lilita Bogachkova #:

Это пример использования MSE для решения задач прогнозирования временных рядов, анализа сигналов и других задач, где необходимо прогнозировать числовое значение


Нужно научить модель работать с непохожими наблюдениями, т.е. разными времянными рядами.

Поэтому и стоит вопрос в описательных метриках для аккумуляции знания о тенденциях и их характеристиках.

К тому же, прогноз нам потребуеся за сто баров вперед - тут простые модельки не справятся, думаю. А для сложных нет факторов\предикторов.

 
Aleksey Vyazmikin:

Уважаемые участники форума!

Передо мной встала задача из области статистики и прогнозирования. Прошу помочь идеями и желательно кодом!

Итак задачка такая. Есть набор наблюдений со случайной частотой в выборке, однако частота эта имеет временную шкалу, и каждое наблюдение принимает значение 0 или 1.

Если посчитать в процентном соотношении, то вероятность получения единицы, допустим 40%, а нуля соответственно 60%.

Задача - определить, сохраниться эта пропорция дальше, или она существенно изменится. Или, допустим, может сильно колебаться на длительных интервалах.

Как я представляю сейчас себе решение:

1. Разбиваю все данные (выборку) на подвыборки с равным интервалом (по числу событий или времени - пока не важно).

2. Оцениваю процент единиц на каждом интервале. Сохраняю результаты в отдельный массив (arr_Chisla).

3. Рассчитываю статистические описательные метрики для полученной выборки.

4. На базе метрик из пункта 3 строю модель с помощью машинного обучения.

Так вот, хотелось бы больше идей по описательной статистике, нежели есть в стандартных библиотеках MQL5.

Что я отобрал, показываю в виде функции ниже

Какие ещё есть идеи полезных метрик?

Доброе время суток!

А можно пример конкретной выборки с 0 и 1 ? Длина выборки не менее 10000 шагов только должна быть.

С уважением, RomFil!
 
RomFil #:
Доброе время суток!

А можно пример конкретной выборки с 0 и 1 ? Длина выборки не менее 10000 шагов только должна быть.

С уважением, RomFil!

Здравствуйте.

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

Смысл в том, что бы работать с разными подобными выборками, поэтому выборка сворачивается до процентного представления.

Но даже выборку в процентах я подавать не хочу на вход, так как в других выборках это будут совсем другие - не сопоставимые данные.
 
Aleksey Vyazmikin:

Уважаемые участники форума!

Передо мной встала задача из области статистики и прогнозирования. Прошу помочь идеями и желательно кодом!

Итак задачка такая. Есть набор наблюдений со случайной частотой в выборке, однако частота эта имеет временную шкалу, и каждое наблюдение принимает значение 0 или 1.

Если посчитать в процентном соотношении, то вероятность получения единицы, допустим 40%, а нуля соответственно 60%.

Задача - определить, сохраниться эта пропорция дальше, или она существенно изменится. Или, допустим, может сильно колебаться на длительных интервалах.

Как я представляю сейчас себе решение:

1. Разбиваю все данные (выборку) на подвыборки с равным интервалом (по числу событий или времени - пока не важно).

2. Оцениваю процент единиц на каждом интервале. Сохраняю результаты в отдельный массив (arr_Chisla).

3. Рассчитываю статистические описательные метрики для полученной выборки.

4. На базе метрик из пункта 3 строю модель с помощью машинного обучения.

Так вот, хотелось бы больше идей по описательной статистике, нежели есть в стандартных библиотеках MQL5.

Что я отобрал, показываю в виде функции ниже

Какие ещё есть идеи полезных метрик?

Почитайте про точный тест Фишера. Для его расчёта нужна функция CDF гипергеометрического распределения. Она есть в стат. библиотеке MQL5, но иногда считает с ошибками (если не исправили). 

 
Aleksey Vyazmikin #:

Здравствуйте.

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

Смысл в том, что бы работать с разными подобными выборками, поэтому выборка сворачивается до процентного представления.

Но даже выборку в процентах я подавать не хочу на вход, так как в других выборках это будут совсем другие - не сопоставимые данные.

Я даже начинаю догадываться зачем Вам "это" ... :) Но без выборки трудно предложить конкретное решение. Решений может быть 100500 и предлагаете их здесь все предлагать чтобы потом был сделан соответствующий выбор? 

В качестве альтернативы можно взять тот же столбец 5584 из выборки train.csv. Если принимается, то попробую на ней что-нибудь поколдовать.

Причина обращения: