Блог им. afecn19 |Чем проще тем лучше.

Прошлый пост был на модную тему, но с пфуком на выходе, для баланса запостю результаты использование старого доброго градиентного бустинга, с не пфуком на выходе. Использовал 6 наиболее ликвидных фишек, что не просто, фишки маловолатильные.  Период с 2006 по 2020 год, по схеме: прогноз 2010 года на основе данных 2006-2009, прогноз 2011 год на основе 2006-2010, 2012 на основе 2006-2011… итд. 
Так как показатели roc_auc_score, confusion_matrix, accuracy_score нас как трейдеров мало интересует, нас интересует потенйциальный гешефт, переводим сразу все в финансовые результаты, а именно профитность сделки. 
Получилось что то вроде этого:

Чем проще тем лучше.
Это все сделки, но их надо почистить, убрать сдвоенности. Допустим у вас за день 10 сделок выскочило, в разное время, но находясь в момент срабатывания первой сделки вы не в зная будут ли сегодня еще сигналы, совершаете сделку сразу на все. Или например на 2 фишки сработал сигнал одновременно. Но реально то сделка будет одна, так к чему нам вместо 1 реальной сделки рисовать две? Поэтому в следующей таблице уже представлены не сделки, а средняя профитность дней и их количество. 

( Читать дальше )

Торговые сигналы! |ML для поиска закономерностей по Atamanу.

Жил был такой трейдер Ataman и были у него критерии робастности системы: фичей не больше трех и параметры фича не должна выглядеть «тут читаю, тут не читаю, тут рыбу заворачиваю». В чем проблема когда мы используем нейросети, или там случайный лес или градиентый бустинг? В том это условие внутрь не засунуть, нейросеть (случайный лес) будет использовать все фичи, и нарежет их, как захочет, хоть в мелкую стружку. Что делать и как с этим бороться?
Я сделал три цикла с GradientBoosting, и ограничил глубину деревьев 3. Вуаля!
Здесь  можно посмотреть как это выглядит на питоне + база данных+ код WealthLab.
Результаты?
Ну вот например на тренировочной выборке 2010-04.2018 нашлось такое:

if ((AroonDownClose_20_[Bar] >= 75.0)&&(AroonDownClose_20_[Bar] <= 100.0)) //
if ((StochD14_5_[Bar] >= 1.9416)&&(StochD14_5_[Bar] <= 10.3487)) //
Загоняем, считаем:

Названия строк Коли    Profit %


( Читать дальше )

Блог им. afecn19 |Фичи решают.

  Берем RF загоняем в нее фичи:

'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


( Читать дальше )

Блог им. afecn19 |Парочка способов улучшить прогноз

  Из тестов которые я привел в прошлых постах, следует что для задач с ограниченной выборкой и моим виденьем рынка, следует использовать GB, как наиболее эффективный инструмент, далее близко идет RF, а а где то далеко позади, глотая пыль плетется нейросеть. Также следует необходимость чистки от левых фичей. В чем вообще вопрос?! Лишние фичи это возможность инструментам ML найти черную кошку даже если ее там нет, особенно феерически это показала нейросеть, которая при относительно небольшом числе примеров откровенно творит (от слова тварь). Давайте попробуем зациклить чистку фичей и сделаем это системно. Системно это в частности избежать заглядывание в будущее а танцев с бубнами. Мои данные это около 50 тысяч дневок для наиболее ликвидных российских фишек с 2010 по апрель 2018 года (2008 год безудержного падения, 2009 год безудержного роста, поэтому все что до 2010 года оставил за бортом, как заведомо простые для извлечения профита годы), заглянуть на них в будущее это в частности использовать для прогноза движения цен в 2011 году данные о ценности фичей за все года. Мы так делать не будем. Мы представим что переместились в начале 2011 года и имеем только данные за 2010 год.  Для прогноза 2011 года используем данные о ценности фичей на тесте за 2010 год. Как используем? Да просто — из более чем трех десятков фичей используем только 5, 10, 20 наиболее информативных. Для прогноза 2012 года используем данные о ценности фичей на основе теста 2010-2011 годов итд. (Код разбухает, становится все менее читаемым, впору задумываться о ООП). После получения прогнозов, для удобство переведу их в столь любимое для трейдеров виде: профит на сделку, и сравню их с результатами если бы каждый раз использовались все доступные фичи. А их 34 штуки. Чистка фичей это будет во первых.
  Во вторых попробую улучшить результат за счет скалерновской VotingClassifier, которая будет выводить нечто среднее из прогнозов RF и XGB.
  Приступим с первого пункта. 



( Читать дальше )

Блог им. afecn19 |Чувствительность методов ML к размеру обучающей выборки. Part 6.

В прошлом тексте я пробовал «помочь», нейросете уменьшив число рандомных фичей. Сейчас попробую помочь увеличив число примеров. Может наша сверточная сеть покажет что то вменяемое если увеличить число примеров до миллиона? Это задача на моем компьютере требует совершенно других затрат времени, так что я вчера запустил машинку обучаться, а сам пошел спать. Обучался на 50 эпохах, увеличивая данные от 10 тысяч до 50 тысяч (увеличивая обьем на 10 тысяч), и от 100 тысяч до 900 тысяч (с шагом +100 тысяч).
  Результаты порадовали. Я не буду в 5 раз пересказывать логику «исследования», но убрав week=5 мы должны (ну как должны!? вообще то нам никто ничего не должен) получить равновероятный прогноз события 1 и события 0. Ниже на графике эту норму в 50% изображает серая линия. Красная это прогноз события=1, синяя событие=0, ось Х число примеров на обучающей выборке в тысячах. 

  Чувствительность методов ML к размеру обучающей выборки. Part 6.
  И пусть девочка кинет в меня камне если тут нет сходимости. 

( Читать дальше )

Блог им. afecn19 |Блеск и нищета нейросети. Part 5.

Продолжу изучение нейросетей. Для тех кто случайно наткнулся на этот пост, но не хочет ковырять предшествующие поясняю.
  Был сгенерирована табличка в 50 тысяч строк и 103 столбцов. Один столбец это даты, еще один — таргет, который мы пытаемся предсказать (событие 1 и событие 0). 101 столбец изображают фичи, из которых 100 случайные величины от 1 до 10, а одна осмысленная (Week) принимает значение от 1 до 5. Для week от 1 до 4 равновероятно событие 1 и 2, для Week = 5 вероятность события 1 = 60%, 2 = 40%.
 «Шо за фигня аффтор?!». Фигня не фигня, а я моделирую свое виденье рынка и своего подхода к поиску рабочих стратегий. Виденье рынка предполагает что рынок рандомно блуждает значительную часть времени (в моему случаи 80% времени), а оставшееся его можно описать несколькими хорошими фичами. Ну как описать? Не на 100%, ну а где то процентов на 60. Сравните с детерминированным подходом ученых столетней давности — «если нам дать все фичи и много много вычислительных мощностей мы вам все посчитаем, с точностью в 100% и для любого мгновения времени!». Понятно что после этого появилось много других идей, нелинейная динамика к примеру, которая именно предполагает принципиальную невозможность прогнозирования, а не потому что нам чего то в данных недодали. Ну и наконец постановка задачи: у нас есть 101 фича, и нам с помощью инструментов ML надо получить такой прогноз события 1, который бы бился с заложенной нами неэффектиностью. И тут не помогут завывания нейросетей-что мы «фичи кривые заложили, на которых совершенно невозможно работать!», что «просто рынок изменился!, не имезнился мы бы огого!». Нам совершенно плевать на accuracy на трейне и даже на тесте. Мы как тот глупый учитель, который может не очень то и соображает зато у которого на клочке  бумажки записан правильный ответ, а напротив него ученик, в очечках, но у которого почему то при всех сплетнях что он в уме может перемножить трехзначные цифры, при сложения 1+1, получается то 5, то 6 то -32. Не, конечно вариант что мальчик в очечках не так уж и не прав возможен, может он считал в невклидовых метриках к примеру, или перемножать он умеет а вот что такое складывание ему просто не сказали.

( Читать дальше )

Блог им. afecn19 |Нейросети. Part 4.

Напомню был сгенерирован DateFrame со 100 бессмысленными фичами и одной осмысленной, для проверки могет ML или не могет. Как оказалось GradientalBoosting могет и еще как, RF могет, но хуже. Что покажут нейросети? Нейросетей много, архитектур много, настраивать их не просто, я предложил решить задачу нейросети со следующей архитектурой:

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 ряда. При попытках использовать обученную нейросетку для прогноз получался один большой пфук.
По табличке:



( Читать дальше )

Блог им. afecn19 |ML - to be or not to be. Part 3.

Оценки для RF получили, под капот заглянули, хотелось бы теперь и ручками все проверить-посмотреть. Тем более что косяк у RF есть, он единственную смысловую фичу ставил не в вершине дерева, а только второй а порой и третьей после случайно сгенерированной. То есть примерно половина событий сразу криво отсекалось.
  Выгрузил в excell  сгруппировал и получил примерно такое:

Названия строк

 Коли



( Читать дальше )

Блог им. afecn19 |ML - to be or not to be. Part 2.

Ну вот значит мы получили, что если переусложнить модель, то можем найти черную кошку в черной комнате, даже если ее там нет. Но RF позволяет еще и оценить значимость той или иной фичи, и даже получить пороговые значения, по которым RF и принимает решения. Напомню что в качестве смысловой фичи у нас выступает Week. Когда Week от 1 до 4 (что символизирует дни от понедельника до четверга), то вероятность события 1 и 2 50/50. То есть белый шум. А вот когда 5 (пятница), то с вероятностью 60% наступит событие 1, то есть вот та самая неэффективность которую мы и ищем на рынке.  
 С помощью команды feat_importances = round(feat_importances.nlargest(10), 3) выводим самые важные по мнению RF фичи. Сначала выводим по итогам трейни на первых 10 тысяч данных и… о ужас:
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.058
  Week у нас всего лишь на 6 месте с ничем не примечательными коеффами важности, а во главе фича «46», которая между нами говоря никакого смысла и не имеет, ибо случайно сгенерированный ряд. Обьяснить это можно только одним-фича week детерминирует наш таргет на 52%, что совсем не густо, а фича 46, была сгенерированна так что ее ценность случайно оказалась выше. Ну то есть мы все понимаем что если посадить макаку торговать, то будет она торговать в ноль, но если посадить 1 млн макак и каждой дать по терминалу, то наверняка среди 1 млн окажется парочку «макак-гуру», которые в силу случайности покажут длинную серию успешных трейдов (я кстати думаю что также обьясняется появление гуру среди людей), а если посадить за комп 1 млрд макак, то наверняка парочка вообще не совершит неправильных кликов, и это будет «макака-Баффет», все будут смотреть ей в рот, удивляться ее гениальности, а «макака Баффет» откроет блог и начнет давать советы как торговать правильно. Ну вот и в нашем пример, так получилось, что макака под номером «46» случайно понажимала кнопки правильней и RF назвал ее особо ценной.

( Читать дальше )

Блог им. afecn19 |ML - to be or not to be

Когда мы используем методы ML, получая унылые результаты при прогнозе, мы точно не знаем кто в этом виноват и что делать. Ведь вариантов может быть несколько:
1. ML говно
2. Данные говно
3. Рынок говно
4. Все вместе или попарно говно
5. Ты говно
6. Весь мир говно
  Последние варианты рассматривать не будет, конструктивно остановимся на первых. «Данные не те». Ну правда, метод может быть хорошим, рынок может по устойчиво демонстрировать прежние тенденции, но так как мы модель скормили мусором, то ничего кроме мусора не могли получить при прогнозе. Под мусором я понимаю размер данных и бессмысленные фичи. «Рынок не тот». Не в том смысле, что я весь такой Д`Артаньян, а вот рынок подкачал, а в том что тенденции сменились, ну вот 10 лет была одна манера поведения рынка, а потом в силу геополитики или макроэкономике или каких то институциональных изменений рынок изменился, и то что раньше было вкусно, питательно и сытно, нынче конкурирует с подбрасыванием монетки. «Метод не тот». А тут у нас типа руки растут из жопы и мы не понимаем как вообще все это работает, что такое валидация, тесты, подгонки, метрики качества. Где надо нейросети мы использует бустинг, где надо бустинг используем нейросети. Меня интересует больше ответ на вопрос «а этот ML вообще что то на фондовом рынке может?!» и чтобы ответить на него я сделаю так, чтобы не было никаких проблем ни с данными ни с рынком, то есть чтобы виновник сразу был очевиден.

( Читать дальше )

....все тэги
UPDONW
Новый дизайн