Первая часть. Лирика (можно не читать) C# я начал изучать год назад, просмотрев курсы S#. До этого программированием не занимался вовсе. Поэтому за код прошу не пинать, лучше подскажите как правильно делать. С удовольствием выслушаю все вопросы, предложения и пожелания! А также выражаю искреннюю благодарность команде S# за их проект!
Вторая часть (Для тех, кто в теме). Многослойный персептрон (как я его реализовал) Моя нейросеть состоит из 1) Первый слой (или входной слой) — это набор признаков(входной вектор) которых мы подаем на вход нейросети. 2) Второй слой нейронов. Каждый нейрон второго слоя связан со всеми нейронами первого(входного) слоя и всеми нейронами третьего слоя нейронов связями(синапсами). 3) Третий слой тоже само что и второй, только связан со вторым слоем и четвертым. 4) Четвертый слой состоит из одного нейрона, выход которого и будет нам нужен. Рис.1.
Особенности нейросети которые стоит упомянуть. Функция активации гиперболический тангенс
private const double AlfaSigmoid = 0.66666d;
public static double ThFunc(double y)
{
return (1.7159 * Math.Tanh(AlfaSigmoid * y));
}
Производная активационной функции, для обратного распространения ошибки
public static double ThDerivative(double _out)
{
return (AlfaSigmoid * (1.7159d * 1.7159d - _out * _out) / 1.7159d);
}
На каждый нейрон подан дополнительный синапс с постоянным входным значением (-1). При обучении нейросети в качестве обучающего значения используется значения double (но как правило -1, 0 и 1), в качестве входного набора признаков использую List<double> inputSignals (хоть и double, но как правило (-1, 0 и 1). Все остальное можно найти в интернете, вот сайт, с которого я взял рисунок http://www.aiportal.ru/articles/neural-networks/multi-perceptron.html там же можно найти информацию про персептрон и обратное распространение ошибки.
Третья часть. Сама программа Чтобы обучить нейросеть, нужно создать обучающую последовательность. Из всех разных способов который пробовал, при том что обучающую последовательность постоянно меняю. Я остановился на следующем. В гидре создаю свечи, в примере это пятиминутки. Сохраняю их в Excel, открываю сохраненный файл. В столбике H создаю необходимую логику, в примере это бычья или медвежья свеча. Сохраняем файл в формате CSV. Рис 2 Теперь необходимо прописать путь до папки со свечами, и пут к файлу обучающей последовательности.
private const string PathStorage = @"C:\History";
private const string PathLessons = @"..\\..\\..\\candles_SPFB.RTS@FORTS_TimeFrameCandle_00_05_00.csv";
private const string PathNeuroNet = @"..\\..\\..\\NeuroNet.dat";
private const string PathLog = @"..\\..\\..\\log.txt";
Я как правило сохраняю в файл в ту же папку где лежит NeuroRobot.sln. Туда же сохраняется нейросеть, и лог. В таком случае нужно только папку со свечами прописать. Файл обучающей последовательности(candles_SPFB.RTS@FORTS_TimeFrameCandle_00_05_00.csv) содержит знания с 1.1.2013 по 1.10.2013. Файл нейросети (NeuroNet.dat) обучен на данных с 1 по 15 января 2013г. Запускаем программу, переходим на вкладку Lesson. Если активна кнопка «Удалить файл знаний» значить существует обученная сеть, ее можно удалить или доучить. Если кнопка неактивна и на ней написано файл знаний отсутствует, то можно задать период обучения, я задал первые 15 дней года, всего 809 образов получилось. Также задается таймфрайм, количество нейронов на втором и третьем слое. При этом если в третьем слое поставить 0, то сеть будет двухслойная. В ходе обучения, можно изменять, шаг обучения, момент, порядок предоставления образов. На графике видна среднеквадратичная ошибка сети. Также видна статистика обучения сети. При обновлении минимума ошибки, класс сети сохраняется. Рис 3.Когда дальнейшее обучение сети бесполезно, останавливаем обучение. Переходим на вкладку Stratagy testing.Рис 4.
Задаем период тестирования, я поставил весь январь, жмем StratagyHistoryTesting. Рис 5. На рисунке видно, что сеть запомнила первые 15 дней года, но уже с 16-го января начала сливать. С нажатием StratagyHistoryTesting, становится активной вкладка График. В этой вкладке можно смотреть тестирование стратегии.Рис 6. На втором окне графика черными точками обозначена текущая позиция. Зеленым обозначена желаемое значение из обучающей последовательности. Красным то что выдала нейросеть. В третьем окне прибыль на текущий момент. Стратегия простая если следующая свеча бычья покупаем, медвежья продаем.
Ну и самый интересный вопрос. Что подавать на вход? Для стратегии я использовал OXLC последних 4 свечей, переведенных в двоичный формат, получилось 240 единиц и минус единиц.
Всем спасибо за внимание! Жду отзывов, и лайков!😀 А кстати робот лежит в TFS NeuroRobot Public называется.
Комментарии (9)
Вход или Создать аккаунт, Войдите или зарегистрируйтесь, чтобы оставить комментарий
Ребята, советую, статья тащит 👍
Стратегия с каждым новым днем истории делала свое переобучение?
Дело в общем-то известное. Называется curve fitting, нейросеть для этой цели - отличный инструмент. Может интерполировать практически любые данные. Но предсказательная функция у нее ничем не лучше чем у простого "вчера рос-покупай, вчера падал - продавай".
ИМХО при построении моделей надо изначально ставить вопрос "а в чем собственно РАЦИОНАЛЬНОЕ ЗЕРНО модели".
Предвидя вопросы приведу пример рационального зерна. Я работал в фонде где продавали переоцененную волатильность за 3 дня до экспирации. Нормально все было, в профите. Пока в августе 2008го не начался кавардак и фонд не потерял половину денег. Ну это просто хеджироваться надо было лучше.
А чему она учится? Что на вход, как формируются обучающие паттерны?
Автор, поставьте себя на место тех кто вздумает попытается разобрать Ваш код, наверняка Вы сами его не поймёте через год, сделайте пожалуйста какую ту майнд карту, по основным достопримечательностям Вашего творения.
Нейросетей в виде C# библиотек пруд пруди в открытом доступе(наприер на хабрахаре), есть смысл вникать в конкретно Вашу реализацию только если есть изюминка, либо процесс вникания будет доставлять.
[USERLINK]Mikhail Sukhov[/USERLINK]
[USERLINK]Mikhail Sukhov[/USERLINK]
Так ведь рынок то не стационарен. Значит его структура изменчина. Значит сеть нужно постоянно переобучать. Переобучение на реале - это как раз не зло. Зло - переобучение на истории, так как это подгонка под среднее-статистическое положение рынка. А если переобучение идет за последние время, то это подгонка под последнее движение. Что есть не плохо.
Вообще наверное нужно иметь как у с обычными ТА стратегиями так же 2 сети, одна на краткосроке, другая на большем ТФ. Первая смотрит за микроструктурой рынка. Другая более глобально. Если стратегия позиционная, меньший ТФ может нас в черный лебедь завести своими сделками. Помог резкий переход на новый уровень - и мы в минусах.
[USERLINK]loop[/USERLINK]> А чему она учится? Что на вход, как формируются обучающие паттерны?
Но мы его пока трогать не будем. Для примера берем Максимум свечи например 163360 в делим на шаг это 10. получили 16336
и там же с помощью следующего метода, переводим 16336 в двоичный формат длинной 12 символов, получаем 11111111010000. Так как у нас гиперболический тангенс, то вместо нулей ставим минус единицу.
Все это повторяем для Открытия и Закрытия Минимума свечи. И каждый отдельный символ двоичной последовательность заносим в List<double>()
Таким образом мы получили одну свечу. А нам надо 5, (только сейчас понял что в примере беру 5 свечей). Для этого нам нужно
а так же метод который будет наполнять свечи, удалять лишние свечи и находить последнее значение
Ну и сам метод который я показывал в начале, когда List<Candle> Candles заполнится, IsFormed станет true. Этот метод объединит все наши 5 свечей в последовательность из 240 единиц и минус единиц.
здесь не обязательно inputSignals.AddRange(CandleLevelRi(candles[0]));, можно inputSignals.Add(Если мувинг 30>мувинга 20 то 1 иначе -1)); зависит от вашей фантазии. Важно добавить в inputSignals значение от -1 до 1, можно -0,345 или 0,53 но чтоб в диапазоне от -1 до 1. В общем вся логика в этом методе. В итоге у нас получилось 240 входных сигналов (признаков). Программа обучения сети сама определит количество этих признаков.(Я это сейчас объяснять не буду) Вам их рассчитывать и куда то забивать не надо. Вся ваша задача для тестирования правильно описать входной сигнал(признаки) на котором будет обучаться сеть. Если вы решите взять не 5 свечей а 10. То Сделайте так
И больше ничего нигде менять не надо!!! Не забывайте изменять CandlesCount по количеству свечей используемых в обучении. Установите период обучения какой пожелаете, количество нейронов все это устанавливается в окне. И обучайте! Как задавать эталонную последовательность я уже описывал. Надеюсь помогло мое пояснение. И вы найдете РАЦИОНАЛЬНОЕ ЗЕРНО! 😀
[USERLINK]Mikhail Sukhov[/USERLINK]
[USERLINK]Mikhail Sukhov[/USERLINK]
В признаках и обучающем множестве и есть Грааль. По идее нейросеть сама должна формировать признаки в скрытых слоях, но на деле это очень маловероятно, если обучается вся сеть сразу, чем то банальным, вроде обратного распространения, точнее формироваться то они формируются, но это просто довольно коряво смешанные фотографии шума, общие для обучающей выборки. Так просто не получится выделить существенные признаки.