Уж поскольку, начинают обычно с начала, и я с начала же и начну.
С самого моего первого знакомства с нейросетевыми технологиями, для меня очевидно было, что для любой НС будет трудно просто вот брать и апроксимировать временной ряд в голом виде, ибо уж очень он непредсказуем, даже с человеческой точки зрения.
Из чего я исходил - трудно сказать. Наверное, все-таки я проводил какие-то аналогии (может, быть, даже, на подсознательном уровне) между искусственной нейросетью и моей, родненькой... биологической нейросетью. Так вот, глядя на график любой валютной пары трудно бывает иногда удержаться от восклицания: ну, вот какого он здесь пошел в (такую-то) сторону??? ведь все было за то, чтобы он шел в противоположную...
А ведь и действительно: очень часто видно, что даже когда тренд в одну сторону в самом разгаре, внутри него бывают ТАКИИЕЕ свечи в обратную сторону, что подумаешь: "Не начало ли это противоположного тренда??".
Но рынок - он всегда прав, а мы не об этом сейчас.
Ну, почему-то, опять же, (наука умалчивает, почему) казалось очевидно, что если подавать на входы нейросети не только цену, но еще и ее производные - имеется ввиду, спользящие средние - то сети будет попроще. Конечно, я могу объяснить, что мне тогда казалось: мне казалось, что с помощью этих самых скользящих средних сеть будет понимать, какой сейчас тренд. И потом, основываясь на этих знаниях - проще было бы предсказывать цену... ан нет!
Зачем я привел тот рисунок? (см. выше) - как раз затем, чтобы показать, что, по моему предположению, с помощью набора скользящих средних можно определить не только направление тренда, но и фазу тренда: типа, если уже все скользяшки развернулись в сторону тренда, то тренд уже идет полным ходом! Если, например, "тяжелые" (т.е., имеется ввиду - с большим периодом усреднения) еще направлены в сторону тренда, а "легкие" уже развернулись в обратную сторону, значит, тренд уже может смениться в ближайшее время. гы!
Ну, и вот. А еще я слегка запутлася со степенями корреляции. Почему-то (быть может, я не правильно понял) из постов Вадима я сделал выводы, что высокая степень корреляции - это плохо. Однако, на деле оказалось, что для того, чтобы сеть могла предсказывать, ей нужна достаточно большая степень корреляции.
В инструкции по нейропакету для "Экселя", которым я, собственно, и пользуюсь пока что (пока ничего лучшего я не нашел... "Дедуктор", конечно, куда лучше, но 150 строк меня вовсе не устраивает, а покупать я пока что не согласен)... ну, так вот, в этой самой инструкции написано, что при помощи анализа Boxcounting можно делать определенные предположения о прогностических способностях нейросети еще до того, как она обучится.
Для этого надо оценивать степени корреляции. И чем они меньше - тем хуже сеть будет предсказывать!
=====================================================================================================
Теперь - вкратце (т.к. эксперимент не удался) - описание. Строго говоря, было поставлено несколько однотипных экспериментов.
Основой данных (во всех случаях) были часовые бары GBPUSD (OHLC) за период с начала 2001 года (примерно 34 тыс). На основе этих данных в Экселе рассчитывались скользящие средние с разными периодами... (обчно, по числам Фибоначчи: 2, 3, 5, 8, 13, 21 (дальше редко шел)). Иногда я рассчитывал сначала типичную цену (Typical = (High + Low + Close) / 3), потом от нее брал скользящее среднее, а уж потом - от этого скользящего - все остальное (т.е., сглаживал поток, как мог: извращался по-всякому).
Т.н. "скользящее окно" приходилось самому формировать: но дело это, хоть и муторное, а не хитрое: бери, просто, да и сдвигай данные на одну клетку вниз: вот тебе и будет "прошлое" значение этого же показателя.
С "глубиной погружения" скользящего окна тоже извращался по-разному, но вцелом - без фанатизма: от -3 до -10... Ну, а прогнозировал во всех случаях только один единственный следующий шаг. Исходил я из того, что зная следующий шаг, всегда можно применить ту же самую сеть для прогнозирования шага +1, +2, +3 и т.д. (до тех пор, пока ошибка не покажется уж слишком неприемлемой).
Хм, да, ну, и вот еще что, конечно, для подачи на входы, я готовил не сами значения всего того, что я перечислил, а приращения (с плюсом или с минусом).
Иногда я сортировал данные. Когда уже все подготовлено, когда удалены строки, содержащие пустые клетки (после "скользящего окна" таковые остаются, да и при расчетах скользящих средних - тоже ведь не с первой ячейки начинаешь, а с ячейки, чей номер равен периоду усреднения), я еще и сортировал данные, например, по среднему приращению скользящей средней за последние n периодов. Таким образом, у меня получались отдельные фрагменты исходной выборки, содержащие сходные по некоторому показателю примеры.
Ну, скажем, я сортирую данные по признаку среднего приращения скользящей средней с периодом 8 за последние 6 часов. У меня получается, что есть участки, например, где таковое равно нулю (скользящая средняя не растет - не падает): выходит, флэт на рынке галимый. И до максимума. Ну, и я разбивал все множество на части. И отдельно учил одну нейросеть, например, прогнозировать во время флэта, другую - во время слабого тренда, третью - во время умеренного тренда, четвертую - во время сильного тренда и т.д....
Еще я иногда добавлял индикатор эффективности рынка (т.н. Effectivity Ratio - за точность написания не ручаюсь: с английским у меня туго, но это - Коэффициент Эффективности в переводе).
ER рассчитывается как отношение общего приращения цены за n периодов (по модулю) к сумме всех приращений цены в кажом из баров взятого периода (по модулю, опять же). "Физический смысл" этого индикатора таков: что если, к примеру, цена за 10 часов сдвинулась на 100 пунктов и каждый час она сдвигалась на 10 пунктов (значение индикатора при этом должно быть равно 1: ER = 100 / (10+10+10+10+10+10+10+10+10+10) = 1), то это - эффективный рынок (целенаправленно двигался в одном направлении). Ну, а если же рынок за 10 часов сдвинулся на 10 пунктов... а за первый час он сходил на 50 вверх, за второй - на 50 вниз, и т.д., - то это - низкоэффективный рынок (значение ER будет близко к нулю).
Чаще всего, я не старался апроксимировать сам по себе этот ER, но использовал его в качестве критерия для сортировки данных: типа, если рынок эффективный - это одно, если нет - это совсем другое.
Ну, а теперь - итоги моих опытов (в общем виде).
Хочу сказать, что я не вдавался в подробности, что там делает этот boxcounting... но результаты этого анализа часто оказывались неудовлетворительными. В некоторых случаях я несмотря на это учил сеть (и получал такие же неудовлетоврительные итоги). В некоторых - вообще отказывался от обучения НС.
Итак: итоги (выводы).
1) возможно, есть смысл в том, чтобы каким-то образом сортировать данные, и формировать отдельные нейросети для каждого из фрагментов данных, но пока что я не могу точно сформулировать условия, когда это - разумно или необходимо. В моих экспериментах, это, как правило, приводило к тому, что и без того малая "предиктивность" исходных данных снижалась практически до нуля (а в некоторых случаях - именно до нуля).
На "диаграмме распределения" это выглядело так, что облако ответов НС становилось очень плоским и растянутым вдоль некоторого горизонтального уровня (в противоположность тому, что если нейросеть все-таки хоть чему-то да учится, то облачко получается растянутым вдоль диагонали "правильных" ответов: иногда - в виде прямой, а иногда - в виде s-образной "галактической спирали" ))
На диаграмме ответов нейросети это выглядело так, что ответы нейросети слабо колебались вблизи "нулевого" значения, в то время, как реальные данные весьма существенно от него отличались.
Это - итог.
А вывод из этого - такой: что если "предсказуемость" данных изначально низкая, то, классифицировав их по какому-то признаку, и выделив схожие (по этому признаку) данные - получаешь еще меньшую степень предсказуемости (вплоть до нуля) для каждого из фрагментов.
Подобные "махинации" с исходными данными, вероятно, могут принести положительные результаты, но только в том случае, если "предсказуемость" всей выборки в целом достаточно велика.
2) движение скользящей средней в следующий период времени мало зависит от движения этой же скользящей средней 5, 7, 10 периодов назад. Результаты анализа boxcouning прямо показывают неэффективность формирования "скользящего окна" с глубиной погружения более 4. На диаграмме это выглядит так, что "важность" (я пока что ее так назову) данных падает по геометрической прогрессии, по мере отдаления от текущего момента в глубь истории.
Т.е. самое последнее движение цены имеет для прогноза наибольшую важность, предпоследнее - тоже важно, но меньше. Движение 3 периода назад - значительно менее важно, а движение 4 и более периодов назад - вообще практически не важно для прогнозирования будущего движения.
Следовательно, можно сделать вывод, что зависимость следующего хода от хода, сделанного n периодов назад падает, видимо, квадратнопропорционально n. А ведь мне казалось, что такого явления наблюдаться не должно... Мне вообще казалось, что чем глубже "погрузиться" в исторю - тем точнее будет прогноз.
Это - итоги.
А вот мои выводы: прогнозирование отдельновзятой скользящей средней, конечно же, вполне вероятно при помощи НС. Нейросети куда проще апроксимировать сглаженный временной ряд, нежели "сырой". Однако, прогнозирование это больше похоже на дорисовывание очередного данного приблизительно в том же направлении, что и последнее движение. И в этой связи весьма сомнительной представляется возможность предсказывания смены тренда, например.
Я что хотел? я хотел, чтобы из информации о том, как развивался тренд за n периодов, НС сделала выводы о его силе, о его вероятной продолжительности и т.д. гы! наивный чукотский юноша!!! Нейросети прогнозируют только то, что ты их научил. И если ты подаешь на входы приращения в каждый период, то она тебе на выходе следующее приразщение (вероятнее всего, в ту же сторону, ибо, объективно, это более вероятно) и даст!..
3) Очередное движение цены весьма мало коррелирует (а, возможно, я просто не правильно употребляю слово корреляция в данном контексте, ну, да простят меня гуру от статистики и от нейросетевого строительства... я употребляю его, скорее на интуитивном уровне) с очередным или предшествовашвими движениями скользящей средней с большим периодом усреднения. И, опять же, "предиктность" падает не линейно, а, вероятно, квадратично.
Проще говоря: если ты даже имеешь на 100% точный прогноз следующего приращения скользящей средней с периодом 21, то это ровным счетом (ну, для строгости, скажу, что "ровного счета" тут нет, но у этой цифири столько много нулей после запятой перед значащими цифрами, что можно считать, что это - полный ноль) ни на йоту не повышает точность прогноза следующего приращения цены.
Отсюда, мораль (т.е. мои выводы): прогнозировать скользящую среднююю следовало бы саму по себе (ну, или в паре с другой скользящей средней, с близким периодом усреднения). Однако, не следует рассчитывать на то, что это каким-то образом повысит точность прогноза следующей цены.
Поэкпериментировать тут хотелось бы вот в каком направлении: допустим, входные дынне - это три скользящих средних с периодами 20, 25 и 30. Мы предсказали движение скользящей средней с периодом 30 с достаточно высокой точностью, - переходим к предсказыванию (уже на основе этих данных) "меньшей" скользяшки... ну, и т.д. Потом - 15, 20, 25... потом - 10, 15, 20... ну, и т.д. ... что из этого получится - еще не знаю: не пробовал. Но собираюсь попробовать.
4) скользящие средние от цены, но не цена от скользящих средних.
Я получил результаты, которые прямо указывают на то, что даже точный прогноз будущего движения скользящих средних с большим периодом усреднения не дает увеличения точности прогноза будущей цены. Однако, может быть, есть смысл поэкспериментировать со скользящими средними с меньшим периодом усреднения. - это еще предстоит.
Однако, пока что я могу сказать, что добавление к исходному набору данных всевозможных математических извращений (как то - сглаживания) не прибавляет (или прибавляет незначительно) прогнозируемость исходного ряда.
Возможно, я не корректно формирую данные для НС. Хотя, скорее мне напрашивается то, что я, видимо, просто подавая вот эти вот самые бесконечне дельты хочу от сети слишком многого: чтобы она понимала силу тренда, его продолжительность и всякое такое...
Общие итоги: задачу нужно ставить более тонко. Решение "в лоб" здесь невозможно.