Генетический алгоритм. Шаг 11. Самообучающийся советник для MT. |
Автор megabax | |
01.04.2011 г. | |
Генетический алгоритм. Шаг 11. Самообучающийся советник для MT.Прежде чем писать самообучающегося советника, надо составить матмодель. И так, у нас есть две кривые, в общем виде которые можно выразить так: y1=f1(t) и y2=f2(t), где y1 - это fastMA, y2 - slowMA, f1 и f2 - некая функция. Что есть пересечение этих кривых? Математически пересечение, являющееся сигналом на покупку, является условие: y2last>y1last и y2cur<y1cur: на продажу: y1last>y2last и y1cur<y2cur:
Каждая убыточная сделка, это своеобразный урок для робота - так торговать нельзя, надо менять свои весовые коэффициенты. Раз так торговать нельзя, значит, робот должен сделать вывод, что сигнала быть не должно. И изменить свои весовые коэффициенты так, как будь-то сигнала не было. Что надо сделать, что бы с новыми весовыми коэффициентами сигнала не было? Нарушить выше названное условие. Для сигнала на покупку нужно опустить y1cur и приподнять y2cur. Для продажи, естественно, наоборот. Будет достаточно, если y1cur и y2cur изменить до величины y1last и y2last соответственно. И так, для убыточной покупки нам надо уменьшить y1cur на y1cur-y1last, а y2cur уменьшить на y2last-y2cur. Для продажи наоборот. Каким образом произвести коррекцию весовых коэффициентов? Нужно разделить эту разницу на количество членов (весовых коэффициентов). Пусть корректировка на один член равна d, цена (котировка) p, старый весовой коэффициент w0. Тогда pw=pw0+d где w - новый весовой коэффициент. Тогда w=(pw0+d)/p И так нужно пересчитать каждый из весовых коэффициентов. Мат модель готова. Теперь можно писать советника и тестировать его. Что я и сделал. И, угадайте с трех раз, что в итоге получилось.... Если скажете - большой убыток - не угадали. Огромная прибыль - тоже холодно. Правильно, робот перестал торговать. Он совершил несколько сделок и все. Что бы разобраться почему так получилось, я решил построить индикаторы по коэффициентам, которые получились на последней сделке. Он превратился в две никогда не пересекающиеся линии: В общем, мы "наказывали" нашу нейросеть каждый раз, когда она совершала неправильные сделки. И она совсем перестала торговать. Видимо, подумала: "А зачем мне это нужно, зря рисковать? Лучше не высовываться, и не нарываться на наказания. Это можно сравнить, если мы будем с определенной вероятностью бить током обезьяну, когда она хватается за красную ручку. Обезьяна быстро смекнет, что за эту саму красную ручку лучше вообще не хвататься, даже если током бьет "через раз". Ладно, а если будем помимо наказания за убытки, поощрять за прибыльные сделки? Что бы это проверить, я ввел в исходный код следующее условие - если сделка положительная, то нейросеть обучать, но с обратным эффектом, пересчитывать весовые коэффициенты, что бы наоборот, индикаторы еще сильнее стремились пересечься. Результат тот же самый, хотя на последней сделке весовые коэффициенты стали несколько другими. Тогда я решил не сильно "наказывать" робота за ошибки: в случае убыточной сделки пересчитывать веса с понижающим коэффициентом. Сделок стало чуть больше, результат - небольшой убыток. А что, если попытаться оптимизировать коэффициенты "поощрения" и "наказания"? Попытался. К сожалению, результаты оптимизации получились с очень маленьким числом сделок от 3 до 7, за период более около 6-ти месяцев на часовиках. Это не статистически значимый результат. После этого я уменьшил шаг оптимизации. Среди оптимизированных комбинаций нашлась одна, на 13 сделок. Вот ее график доходности: А если еще сильнее уменьшить шаг? Вот тут результат получился более менее статистически значимым. На тот же период (6 мес.) 94 сделки, прибыль 68%. Вот график доходности:
А если без обучения нейросети, то 47%(192 сделки) и вот такой график доходности: Теперь осталось проверить работоспособность алгоритма, проверяя на двух месяца прошлого периода тестируя на третьем, как я делал это тут. |
|
Последнее обновление ( 01.06.2011 г. ) |
« След. | Пред. » |
---|