if ((AroonDownClose_20_[Bar] >= 75.0)&&(AroonDownClose_20_[Bar] <= 100.0)) //
if ((StochD14_5_[Bar] >= 1.9416)&&(StochD14_5_[Bar] <= 10.3487)) //
Загоняем, считаем:
Названия строк | Коли | Profit % |
'Min10',
'Cl/High',
'Vol20',
'tLow%',
'Cl/Low',
'tHigh%-tLow%',
'ATRP(14)',
'DIMinus(14)',
'RSI(Close.20)',
'MomentumPct(Close.14)',
'MFI(20)',
'KST(Close.10.10.15.10.20.10.30.15)',
'TRIX(Close.10)',
'Cl/w_High',
'DSS(10. 20. 5)
Год | Колл | % сделка |
2011 | 611 | 0,1 |
2012 | 440 | 0,34 |
2013 | 305 | 0,42 |
2014 | 420 | 1,17 |
2015 | 263 | 0,85 |
2016 | 248 | 0,74 |
2017 | 261 | 0,41 |
2018 | 46 | 0,34 |
Mean: | 323 |
Из тестов которые я привел в прошлых постах, следует что для задач с ограниченной выборкой и моим виденьем рынка, следует использовать GB, как наиболее эффективный инструмент, далее близко идет RF, а а где то далеко позади, глотая пыль плетется нейросеть. Также следует необходимость чистки от левых фичей. В чем вообще вопрос?! Лишние фичи это возможность инструментам ML найти черную кошку даже если ее там нет, особенно феерически это показала нейросеть, которая при относительно небольшом числе примеров откровенно творит (от слова тварь). Давайте попробуем зациклить чистку фичей и сделаем это системно. Системно это в частности избежать заглядывание в будущее а танцев с бубнами. Мои данные это около 50 тысяч дневок для наиболее ликвидных российских фишек с 2010 по апрель 2018 года (2008 год безудержного падения, 2009 год безудержного роста, поэтому все что до 2010 года оставил за бортом, как заведомо простые для извлечения профита годы), заглянуть на них в будущее это в частности использовать для прогноза движения цен в 2011 году данные о ценности фичей за все года. Мы так делать не будем. Мы представим что переместились в начале 2011 года и имеем только данные за 2010 год. Для прогноза 2011 года используем данные о ценности фичей на тесте за 2010 год. Как используем? Да просто — из более чем трех десятков фичей используем только 5, 10, 20 наиболее информативных. Для прогноза 2012 года используем данные о ценности фичей на основе теста 2010-2011 годов итд. (Код разбухает, становится все менее читаемым, впору задумываться о ООП). После получения прогнозов, для удобство переведу их в столь любимое для трейдеров виде: профит на сделку, и сравню их с результатами если бы каждый раз использовались все доступные фичи. А их 34 штуки. Чистка фичей это будет во первых.
Во вторых попробую улучшить результат за счет скалерновской VotingClassifier, которая будет выводить нечто среднее из прогнозов RF и XGB.
Приступим с первого пункта.
model = Sequential()
model.add(Convolution1D(input_shape = (101, 1),
nb_filter=16,
filter_length=4,
border_mode='same'))
model.add(BatchNormalization())
model.add(LeakyReLU())
model.add(Dropout(0.5))
model.add(Convolution1D(nb_filter=8,
filter_length=4,
border_mode='same'))
model.add(BatchNormalization())
model.add(LeakyReLU())
model.add(Dropout(0.5))
model.add(Flatten())
model.add(Dense(64))
model.add(BatchNormalization())
model.add(LeakyReLU())
model.add(Dense(2))
model.add(Activation('softmax'))
Тут все как положено — сверточная нейросеть, модная функция активации ReLU, широкой рукой накиданные Dropoutы и BatchNormalization, несколько слоев чтобы похвастаться не просто об обучении, а о глубоком обучении. Обучал на 100, 500 и 1500 эпохах. При увеличении числа эпох росла accuracy на train и на test, далеко превосходя заложенную accuracy ряда. При попытках использовать обученную нейросетку для прогноз получался один большой пфук.
По табличке:
Названия строк |
Коли |
46 0.134 67 0.095 4 0.090 60 0.071 15 0.069 week 0.068 26 0.067 2 0.065 53 0.065 84 0.058Week у нас всего лишь на 6 месте с ничем не примечательными коеффами важности, а во главе фича «46», которая между нами говоря никакого смысла и не имеет, ибо случайно сгенерированный ряд. Обьяснить это можно только одним-фича week детерминирует наш таргет на 52%, что совсем не густо, а фича 46, была сгенерированна так что ее ценность случайно оказалась выше. Ну то есть мы все понимаем что если посадить макаку торговать, то будет она торговать в ноль, но если посадить 1 млн макак и каждой дать по терминалу, то наверняка среди 1 млн окажется парочку «макак-гуру», которые в силу случайности покажут длинную серию успешных трейдов (я кстати думаю что также обьясняется появление гуру среди людей), а если посадить за комп 1 млрд макак, то наверняка парочка вообще не совершит неправильных кликов, и это будет «макака-Баффет», все будут смотреть ей в рот, удивляться ее гениальности, а «макака Баффет» откроет блог и начнет давать советы как торговать правильно. Ну вот и в нашем пример, так получилось, что макака под номером «46» случайно понажимала кнопки правильней и RF назвал ее особо ценной.