Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
ну вот на 80 сигналов около 160 реально значимых точек(которые влияют на все Ваши критерии оценки) все остальные точки могут быть где угодно, главное чтоб они на позиции не влияли... Я веду к тому что реальная выборка около 160 примеров а не 4000...
Если сеть оптимизируется на более чем 1 критерий, то как Вы эту задачу решили? - просто интересен метод.
что-то я запутался...
на 4.000 баров 3.920 раз "побеждает" один выходной сигнал, 80 раз другой. Про числоо 160 я не совсем понял, откуда берется.
Если считать по формуле, приведенной Нейтроном, то количество синапсов в сети с входом 17, скрытым 34 и выходом в получается (17*34) + (34*2) = 646. Popt=k*w*w/d при k=1 получается 646 * 646 / 17 = 24.548. Можно попробовать, хотя придется гонять комп недели две, пока получится что-то вразумительное...
Методология оптимизации на настоящий момент такая (правда, боюсь вызвать бурную дискуссию по поводу ). Сначала идет оптимизация только по прибыли (чтоб весь мусор отсеять). А потом уже "по полной программе". Моментом для "переключения" служит "расстояние" между лучшим результатом и границей для размножения.:
public static BigDecimal getBenchmark(GenInfo gi) {
BigDecimal e = gi.performance.result;
if(Main.getPhase() == Main.PHASE_RESULT) {
//В фазе 1 оптимизация только по результату
return e;
}
java.util.Vector <BigDecimal> v = new java.util.Vector();
//Доля прибыльных позиций в общем количеству позиций
v.add(new BigDecimal((double)gi.performance.profitableTrades/(double)gi.performance.totalTrades).setScale(5, BigDecimal.ROUND_HALF_UP));
//Доля прибыли в "обороте" (turnover = прибыль + проигрыш.abs())
v.add(gi.performance.totalProfit.divide(gi.performance.turnover, BigDecimal.ROUND_HALF_UP));
//Средняя просадка по позиции (чем меньше, тем лучше)
double d = gi.performance.avgOrderDrawdown.doubleValue() + 1;
if(d == 1) {
v.add(new BigDecimal(1));
} else {
v.add(BigDecimal.ONE.setScale(5).divide(new BigDecimal(Math.log(d)), BigDecimal.ROUND_HALF_UP));
}
//Максимальная просадка по позиции (чем меньше, тем лучше)
d = gi.performance.maxOrderDrawdown.doubleValue() + 1;
if(d == 1) {
v.add(new BigDecimal(1));
} else {
v.add(BigDecimal.ONE.setScale(5).divide(new BigDecimal(Math.log(d)), BigDecimal.ROUND_HALF_UP));
}
//Максимальная продолжительность позиции (чем меньше, тем лучше)
v.add(BigDecimal.ONE.setScale(5).divide(new BigDecimal(Math.log(1 + gi.performance.maxTradeDuration)), BigDecimal.ROUND_HALF_UP));
//Количество прибыльных позиций
v.add(new BigDecimal(Math.log(1 + gi.performance.profitableTrades)));
for(int i = 0; i < v.size(); i++) {
if(gi.performance.result.signum() == 1) {
e = e.multiply(v.elementAt(i));
} else {
e = e.divide(v.elementAt(i), BigDecimal.ROUND_HALF_UP);
}
}
return e;
}
...количество синапсов в сети с входом 17, скрытым 34 и выходом в получается (17*34) + (34*2) = 646. Popt=k*w*w/d при k=1 получается 646 * 646 / 17 = 24.548. Можно попробовать, хотя придется гонять комп недели две, пока получится что-то вразумительное...
Да, уж... а, вы попробуйте уменьшить число нейронов в скрытом слое - глядишь и результат станет более вразумительным. Не понадобится выборка длиной 25000 отсчётов, тем более, что если учитывать возможную изменчивость рынка и на более короткой истории. Становится понятно, откуда растут ноги у проблемы несостоятельности сети в данном случае, да и время обучения сократится до приемлемого. Коэффициент k, как правило, выбирается равным 2-4.
Вобще, человеку, похоже свойственно так усложнять проблему, что бы потом не было стыдно перед самим собой за неспособность её решить.
P.S. У меня приемлемые результаты для двуслойной нелинейной сети получались при размерности входа d=100-200, число нейронов в скрытом слое 2, и одним на выходе. Покупка, если выход положителен и больше порога, продажа - отрицателен и меньше порога, вне рынка - в пределах порога. Такая НС оперативно реагирует на смену настроений на рынке. Действительно, P=2*2d*2d/d+2=8d=1000, т.е. достаточно короткая выборка.
что-то я запутался...
на 4.000 баров 3.920 раз "побеждает" один выходной сигнал, 80 раз другой. Про числоо 160 я не совсем понял, откуда берется.
Я говорю за те точки которые оказывают влияние на функцию приспособленности! их как я понял ровно 160 именно 160 раз происходит переключение между Buy/Sell - правильно? А оставшиеся 3840 значений гуляют(по числовой оси выхода) где захочеться никаким образом не отвечая за итоговый рез-ат! Да и к тому же налицо - несиметричность целевой функции...
По оптимизации не понял... Но всё равно все параметры должны оптимизироваться единовременно(Задача - "Как выбрать лучшего трейдера по многим показателям?")
Да, уж... а, вы попробуйте уменьшить число нейронов в скрытом слое - глядишь и результат станет более вразумительным. Не понадобится выборка длиной 25000 отсчётов, тем более, что если учитывать возможную изменчивость рынка и на более короткой истории. Становится понятно, откуда растут ноги у проблемы несостоятельности сети в данном случае, да и время обучения сократится до приемлемого. Коэффициент k, как правило, выбирается равным 2-4.
Вобще, человеку, похоже свойственно так усложнять проблему, что бы потом не было стыдно перед самим собой за неспособность её решить.
P.S. У меня приемлемые результаты для двуслойной нелинейной сети получались при размерности входа d=100-200, число нейронов в скрытом слое 2, и одним на выходе. Покупка, если выход положителен и больше порога, продажа - отрицателен и меньше порога, вне рынка - в пределах порога. Такая НС оперативно реагирует на смену настроений на рынке. Действительно, P=2*2d*2d/d+2=8d=1000, т.е. достаточно короткая выборка.
Ну положим, между одним и двумя нейронами на выходе большой разницы я не вижу. Мне просто чем-то нравится модель winner takes all, потому нейронов на выходе два :) Я просто как-то прочитал на одном сайте, связанном с Encog, следующее: дескать каким должен/должны быть размер/ы скрытого слоя/слоев, сказать сложно. Есть некие ориентиры:
Потому решил сделать скрытый слой 2 х входного. Лишние нейроны во время эволюции могут "отмереть" - т.е. обнулиться. Да и все нейронные сетки, которые видел до сих пор (не бог весть, правда, сколько я их видел %) обычно имеют скрытые слои больше входного.
Можно будет попробовать - в принципе-то стараемся обобщить входную информацию до двух сигналов... Да и перспектива увеличения количества входных нейронов манит :)
Да, уж... а, вы попробуйте уменьшить число нейронов в скрытом слое...
Вот, вспомнил, пробовал некоторое время назад разные ванианты: кратность скрытого слоя от 1 до 3, один скрытый слой, два... С двумя скрытыми слоями сетка врала, с фактором 1 тоже... Хотя алгоритмы тренировки были тогда другими...
Понятно.
Тоже перебрал многие алгоритмы тренировок сети - наигрался в усмерть! пока не остановился на самом простом и действенном -ОРО. Сейчас подаю на вход только знак интересующих величин, это позволило сократить число эпох обучения с нескольких сотен до нескольких десятков без потери точности прогноза НС, что в свою оередь, позволило практически решать проблему прогноза приращений котира на имеющихся мощностях.
Понятно.
Тоже перебрал многие алгоритмы тренировок сети - наигрался в усмерть! пока не остановился на самом простом и действенном -ОРО. Сейчас подаю на вход только знак интересующих величин, это позволило сократить число эпох обучения с нескольких сотен до нескольких десятков без потери точности прогноза НС, что в свою оередь, позволило практически решать проблему прогноза приращений котира на имеющихся мощностях.
Для back propagation нужен ряд идеальных данных. В joone есть даже специальный класс, который занимается выделением этих данных. Но что-то не нравится мне...
Идея насчет знака, конечно, свежая... а какая точность прогноза, если не секрет? ;)
Хотелось бы услышать мнение знающих "матчасть" о размере скрытого слоя... Я даже где-то видел математические выкладки о его оптимальных размерах, но застрял в обилии формул и, если честно, ни черта не понял
Конструктивный синтез многослойных сетей...
Особого значения в том сколько нейронов в скрытом слое нет, в архитектуре(за исключением некоторых задач или типов) тоже нет - если используется метод скользящего контроля(CV).
Естественно не следует бросаться в крайности, просто не делать "узкого горла" внутри сети...
Для back propagation нужен ряд идеальных данных. В joone есть даже специальный класс, который занимается выделением этих данных. Но что-то не нравится мне...
Идея насчет знака, конечно, свежая... а какая точность прогноза, если не секрет? ;)