MetaTrader 5 Python User Group - как использовать Python в Метатрейдере - страница 83

 

Правильно - не правильно подготовлены....

Где об этом почитать? Я готовлю данные для НС по своему представлению, что важно, что нет.

Одно для меня загадка: однотипные данные нужно собирать "в кучку" или добавлять их по мере поступления?

С какой стороны собирать данные: от более "старых" или от "новых"?

 
Сергей Таболин:

Правильно - не правильно подготовлены....

Где об этом почитать? Я готовлю данные для НС по своему представлению, что важно, что нет.

Одно для меня загадка: однотипные данные нужно собирать "в кучку" или добавлять их по мере поступления?

С какой стороны собирать данные: от более "старых" или от "новых"?

в теме МО спросите, кто-нибудь ответит. Это тема про коннектор

 
Сергей Таболин:

Беда ещё и в том, что нормализация - вооще гиблое дело!

Поясню. Есть некоторые данные А, Б, В...

Они разные в плане значимости и прочее. Все (в гугле) пишут, что нормализовать надо не по строкам, а по столбцам (А-А-А, Б-Б-Б, В-В-В). Это логически понятно.

Но при появлении новых данных для "предсказания" КАК их нормализовать, если это только ОДНА строка? И любой член в этой строке может выходить за рамки нормализации на тренировочных и тестовых данных?

А нормализация по строкам никакого эффекта не даёт!

Собственно, уже после проверки этих ньюансов, у меня и родился этот "крик души" )))

при нормализации сохраняются коффициенты. Чтобы не было выхода за диапазон, надо брать большой кусок истории и нормализовать, потом применять эти коэфф. к новым данным

на ненормализованных данных сетка не обучится, или плохо обучится. Такие у них особенности
 
Maxim Dmitrievsky:

при нормализации сохраняются коффициенты. Чтобы не было выхода за диапазон, надо брать большой кусок истории и нормализовать, потом применять эти коэфф. к новым данным

на ненормализованных данных сетка не обучится, или плохо обучится. Такие у них особенности

Всё логично и понятно, но! Сетка то обучается! К тому же есть информация, что при использовании ненормализованных данных обучение проходит сложнее, но это не критично.

А как не выскочить за диапазоны? К примеру, есть цена. Есть диапазон цены на обучающих и тестовых данных - возьмём 123-324. А вот сегодня цена выросла до 421. Как она попадёт в этот самый диапазон?

Но мы отошли от сути вопроса - почему, при нормальном обучении и тестировании предсказание вооще ни о чём?

 

Уважаемые, у меня опять лыжи не едут... Прошу помощи.

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

# Загрузка данных
df_full = pd.read_csv(flname_csv, header=None)
r, c = df_full.shape
border = c - row_signal
test_data = np.array(df_full.values[:, :border])
test_verification = np.array(df_full.values[:, border:])
print(test_data[2], 'len =', len(test_data[2]))
print(test_verification[2], 'len =', len(test_verification[2]))

Здесь всё нормально

[3.00000e+00 7.00000e+00 1.14656e+00 1.14758e+00 1.14656e+00 1.14758e+00
 3.00000e+00 7.00000e+00 1.27800e+03 1.27800e+03 3.00000e+00 7.00000e+00
 1.14758e+00 1.14857e+00 1.14758e+00 1.14857e+00 3.00000e+00 8.00000e+00
 2.93000e+02 6.20000e+02 3.00000e+00 8.00000e+00 1.14857e+00 1.14960e+00
 1.14821e+00 1.14960e+00 3.00000e+00 8.00000e+00 4.78000e+02 7.23000e+02
 3.00000e+00 8.00000e+00 1.14960e+00 1.14966e+00 1.14860e+00 1.14860e+00
 3.00000e+00 8.00000e+00 2.32100e+03 2.41100e+03] len = 40
[1. 0.] len = 2

А дальше трындец...

if num_check_rows > r or num_check_rows == 0:
    num_check_rows = r

model = tf.keras.models.Sequential()
model = tf.keras.models.load_model(flname)
model.summary()

for i in range(num_check_rows):
    b = model.predict(test_data[i])
    a = b[0]
    x = a[0]
    y = a[1]
    x = format(x, '.5f')
    y = format(y, '.5f')
    print(f'ожидалось {test_verification[i]} >>> получили [{x} {y}]')

материться

Model: "sequential_16"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
dense (Dense)                (None, 20)                820       
_________________________________________________________________
dropout (Dropout)            (None, 20)                0         
_________________________________________________________________
dense_1 (Dense)              (None, 10)                210       
_________________________________________________________________
dense_2 (Dense)              (None, 2)                 22        
=================================================================
Total params: 1,052
Trainable params: 1,052
Non-trainable params: 0
_________________________________________________________________

Traceback (most recent call last):
  File "M:/PythonProgs/PycharmProjects/NNets/ТестерНС.py", line 79, in <module>
    b = model.predict(test_data[i])
.....
ValueError: Error when checking input: expected dense_input to have shape (40,) but got array with shape (1,)

Что не так?

 

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

Вот и тут - оказалось, что при обучении сети используется StandardScaler. А в статье ни гу-гу про то что это и нафига нужно.

Более того, StandardScaler - это стандартизация. А как я смогу провернуть такую же стандартизацию для единичного входного вектора - тем более ни слова. 

Ещё хуже, что "стандартизация" проводится по колонкам из датасета! Не, ну для просто статистики - это нормально. А для прогнозов - это "***полная"! Это что, мне, при появлении новых данных нужно по-новой обучать сеть, только для того, что бы новые данные попали в диапазон "стандартизации"???

Бред!

Пока эта "новая сеть" обучится ситуация уже в корне может поменяться. Ну и наХфиг это нужно?

Вот вам и Питон с кучей "заточенных" библиотек....

Буду весьма признателен, если меня переубедят.


П.С. просто хочется верить, что потратил своё время на Питон не зря.
 
Сергей Таболин:

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

Вот и тут - оказалось, что при обучении сети используется StandardScaler. А в статье ни гу-гу про то что это и нафига нужно.

Более того, StandardScaler - это стандартизация. А как я смогу провернуть такую же стандартизацию для единичного входного вектора - тем более ни слова. 

Ещё хуже, что "стандартизация" проводится по колонкам из датасета! Не, ну для просто статистики - это нормально. А для прогнозов - это "***полная"! Это что, мне, при появлении новых данных нужно по-новой обучать сеть, только для того, что бы новые данные попали в диапазон "стандартизации"???

Бред!

Пока эта "новая сеть" обучится ситуация уже в корне может поменяться. Ну и наХфиг это нужно?

Вот вам и Питон с кучей "заточенных" библиотек....

Буду весьма признателен, если меня переубедят.


П.С. просто хочется верить, что потратил своё время на Питон не зря.
Может потому что, это только начало. 
Но я не давно заинтересовался возможностями питона для mt. А о том, можно ли так сделать, никто не ответил. Добавил к этому что, в mql4 не будет работать. Решил не тратить время( возможно через какое то время ситуация изменится в лучшую сторону. 
 

С горем пополам разобрался. )))

Но теперь возник другой вопрос (ради которого всё это и затеял):

При обучении сети получил такие результаты

Score on train data     Score on test data      Test loss       Test acc
0.970960                0.968266                0.199544        0.981424

Другими словами - результат барский!

Запустил свой тестер. Получил вот такой результат

Model: "sequential_16"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
dense (Dense)                (None, 15)                465       
_________________________________________________________________
dropout (Dropout)            (None, 15)                0         
_________________________________________________________________
dense_1 (Dense)              (None, 7)                 112       
_________________________________________________________________
dense_2 (Dense)              (None, 2)                 16        
=================================================================
Total params: 593
Trainable params: 593
Non-trainable params: 0
_________________________________________________________________
2021-01-18 17:59:04.495645: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library cublas64_10.dll
ожидалось [0. 1.] >>> получили [0.08348 0.08859]
ожидалось [0. 1.] >>> получили [0.08324 0.08838]
ожидалось [0. 0.] >>> получили [0.08667 0.09141]
ожидалось [0. 0.] >>> получили [0.08263 0.08784]
ожидалось [0. 0.] >>> получили [0.09200 0.09218]
ожидалось [0. 0.] >>> получили [0.08351 0.08861]
ожидалось [0. 0.] >>> получили [0.08944 0.09384]
ожидалось [1. 0.] >>> получили [0.08313 0.08828]
ожидалось [1. 0.] >>> получили [0.08432 0.08933]

Process finished with exit code 0

Ну и скажите, в каком именно месте видна обученность сети на 98% правильных результатов????

 

Hello, reading a few pages from the discussion didn't found anything concrete about the following question :


- Is there anything currently working like MetaTraderR or MetaTrader5 packages for MT and R integration ?


Cheers 

 

Уж извините, продолжу свою эпопею... )))

Поднабравшись ещё маленько знаний из того же гугла, пришёл к выводам:

  1. Данные нужно "балансировать". К примеру, если из 1000 входных данных сигналы появляются только на 100, то нужно, как минимум, 1000 - ((1000 - 100) /3) = 700 "пустых" данных (не образующих сигналы) удалить.
  2. Оставшееся желательно "нормализовать". Привести в диапазон 0-1. Но тут возникает очевидная трудность выбора "диапазона" нормализации. Что считать минимумом, а что максимумом? Я, пока, не знаю. Нормализую каждый входной массив только по его диапазону...

Выполнив эти два условия, получил заметное снижение обученности сети. К тому же обнаружил, что 

  1. Некоторые функции потерь, отброшенные ранее, работают лучше.
  2. Результаты с меньшим количеством скрытых слоёв стали доминировать.
  3. Осталось проверить количество эпох обучения.

Плюс к этому возник ещё вопрос: каким должен быть ответ сети?

  1. Один нейрон (0-1-2) (нет сигнала-покупка-продажа)
  2. Два нейрона [0-0],[1-0],[0-1]
  3. Три нейрона [0-0-1],[1-0-0],[0-1-0]
???

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