Машинное обучение в трейдинге: теория, модели, практика и алготорговля - страница 2973

 
mytarmailS #:
Да, нет..

Тогда к чему был этот пустой разговор?

 
Aleksey Vyazmikin #:

Тогда к чему был этот пустой разговор?

А он пустым будет в любом случаи
 
mytarmailS #:
А он пустым будет в любом случаи

В общем да, если нет желания.

 
mytarmailS #:
Грусно что машинное обучение с таргетами не работает и единоразовое обучение не работает... 

убери симметричные признаки, чтобы уменьшить bias

например, приращения замени абсолютными приращениями (волатильность)

иногда помогает

 
Maxim Dmitrievsky #:

убери симметричные признаки, чтобы уменьшить bias

например, приращения замени абсолютными приращениями (волатильность)

иногда помогает

Да нее, там у меня все намного сложнее. 
 
Aleksey Vyazmikin #:

Идея у меня в том, что бы получить модель, которая будет отбирать устойчивые квантовые отрезки по ряду статистических признаков. Всех желающих приглашаю в этот проект.

Что ж вы так залипли на эти кванты?...

В них вообще ничего интеллектуального нет. Просто делится например 10000 строк на 100 кусков, т.е. сортируем и идем снизу отсчитываем 100 строк, если последующие совпадают с сотой строкой (т.е. повторы), то то относим их все к первому куску. Дубли кончились начинаем набирать строки во второй квант - очередные 100 + дубли если есть. И.т. пока не кончатся строки.

Даже 1 дерево на порядки больше полезной информации содержит (т.к. обучено на данных), чем эти квантовые отрезки (просто 100 отсортированных строк с дублями).

 
Forester #:

Что ж вы так залипли на эти кванты?...

В них вообще ничего интеллектуального нет. Просто делится например 10000 строк на 100 кусков, т.е. сортируем и идем снизу отсчитываем 100 строк, если последующие совпадают с сотой строкой (т.е. повторы), то то относим их все к первому куску. Дубли кончились начинаем набирать строки во второй квант - очередные 100 + дубли если есть. И.т. пока не кончатся строки.

Даже 1 дерево на порядки больше полезной информации содержит (т.к. обучено на данных), чем эти квантовые отрезки (просто 100 отсортированных строк с дублями).

Квантовые отрезки - это кирпичики из которых строится модель CatBoost. Изначально, как я понял, таким способом решался вопрос экономии памяти и в целом ускорения вычислений. Побочным приобретением является сокращения вариантов комбинаций показателей предикторов, делается шаг в сторону снижения мультиколлинеарности, что в целом способствует скорости и качеству обучения. Плюс, отчасти, решается проблема дрейфа данных.

Я же вижу прок и в другом - исследование потенциала вероятностной оценки в данных квантового отрезка. Если взять предложенный Вами метод квантования (на самом деле лучше представить, что целью процесса - является отсеивание однородных групп - аналог - кластеризация), и разбить данные на 20 равномерных квантовых отрезка по числу примеров, то окажется, что в каждом квантовом отрезке осталось всего 5% данных. CatBoost по умолчанию создает 254 разделителя - 255 отрезков. Потом из этих отрезков строятся деревья. Предполагается, что все квантовые отрезки одинаково полезны, и их взаимоположение следует определить путем разбиение группы на подгруппы, методом построения дерева решения. Разбиение происходит как по корневому, так и по другим предикторам. Даже если берём одно дерево, то сколько из первоначальных примеров позитивного класса "1" останется в конечном листе через 6 сплитов? При этом надо учитывать, что отбор сплита происходит по метрикам совокупного числа квантовых отрезков. Учитывая сам метод построения дерева, становится очевидным, что чем качественнее будет сделано разбиение предиктора на квантовые отрезки, тем меньше потребуется сплитов для достижения той же точности в листе. Отмечу - что каждый сплит - гипотеза, а все гипотезы не могут быть верными. Так вот, если мы делаем разбиение с учетом потенциала квантового отрезка принадлежать в большей степени одному из классов, то мы сокращаем число сплитов для достижения схожей точности, а значит и снижаем число потенциально ложных гипотез (сплитов). Кроме того, если можно сразу разделить предиктор на глобальные 3 области - две по принадлежности к классу и одну к неопределенности, то модели в среднем будут меньше и с лучшими статистическими показателями - ожидаю, что и более устойчивыми.

К примеру, представим, что предиктором является осциллятор RSI - существенные действия участников происходят вокруг уровней 70, 50, 30 - всё что за пределами - допустим, не влияет на принятие решений участниками рынка. Тогда разумно построить квантовую таблицу таким образом, что бы отделить эти 3 значения от остальной совокупности. Иначе случайным образом на одном из сплитов окажется больше примеров в квантовом отрезке принадлежности к классу и получится ложное правило на ложной гипотезе.

Можете построить столбиковую диаграмму с отквантованными показателями предикторов и провести кривую вероятностей принадлежности к классу "1" для каждого столбца. Если кривая будет скорей прямой, то такой предиктор я бы отправил на скамейку запасных. У хорошего, по моему мнению, предиктора будет или наклонная линия или же всплески на некоторых столбцах.

Можно говорить, что через квантование я ищу дискретные события, влияющие на вероятность движения цены.

 
Правило как раз и разделит 
rsi>69 & rsi<71....
Вот и все квантование.. 
Берете деревянный АМО разбиваете на деревья и вытаскиваете нужные.. 

Какое квантование? Вы такой ерундой маетесь что аж жалко.. 

Это все в три строки кода решается... 
А вы уже годы с этим квантование носитель, как чккнутый професор 
 
mytarmailS #:
Правило как раз и разделит 
rsi>69 & rsi<71....
Вот и все квантование.. 
Берете деревянный АМО разбиваете на деревья и вытаскиваете нужные.. 

Какое квантование? Вы такой ерундой маетесь что аж жалко.. 

Это все в три строки кода решается... 
А вы уже годы с этим квантование носитель, как чккнутый професор 

Есть разные способы создания квантовой таблицы. Думаю, действительно, можно и через готовый пакет, который строит деревья на одном предикторе с заданными ограничениями в листе по проценту примеров. Что это за пакет и как получить данные в нужном мне формате - я не знаю.

Важным является не просто разбиение, а поиск критериев оценки этого квантового отрезка, которые повысят вероятность того, что принадлежность к классу сохраниться на новых данных.

Почему этим занимаюсь - потому что в этом ключ к построению качественной модели.

Почему долго - много экспериментов, тестовых скриптов. Вот немного разобрался с OpenCL и код теперь частично на видеокарте считается - для этого требуется время - многое приходится изучать.

 
Aleksey Vyazmikin #:

Важным является не просто разбиение, а поиск критериев оценки этого квантового отрезка, которые повысят вероятность того, что принадлежность к классу сохраниться на новых данных.

Вы хоть раз на код в том же катбусте смотрели? Вы же им пользуетесь. Он не пользуется сторонними пакетами. А вот такой маленькой функцией (она даже проще того что я описал, не смещает точку разделения на количество дубликатов).
Написал комментарии того, что приосходит. На вход подается отсортированный столбец.

static THashSet<float> GenerateMedianBorders(
    const TVector<float>& featureValues, const TMaybe<TVector<float>>& initialBorders, int maxBordersCount) {
    THashSet<float> result;
    ui64 total = featureValues.size(); //число строк в столбце
    if (total == 0 || featureValues.front() == featureValues.back()) { // проверки
        return result;
    }

    for (int i = 0; i < maxBordersCount; ++i) { // цикл по числу квантов
        ui64 i1 = (i + 1) * total / (maxBordersCount + 1); // номер строки начала кванта номер i
        i1 = Min(i1, total - 1); // не больше числа строк 
        float val1 = featureValues[i1]; // значение в строке i1
        if (val1 != featureValues[0]) { // если != значению в 0-й строке, чтобы не было дубля с 0-й строкой
            result.insert(RegularBorder(val1, featureValues, initialBorders)); // сохранить значение в массив границ разделяющих кванты (не смотрел, но очевидно, что дубликаты пропустит и не создаст им квант)
        }
    }
    return result;
}

Как видите все очень просто и ничего интеллектуального тут нет - просто отсчитываем например 100 строк и всё.
Чуть более сложные варианты могут смещать на число дубликатов, еще можно оптимизировать размер квантов (например если из 10000 строк 9000 дубликаты, то по простой функции будет 11 квантов: 10 от первой 1000 строк и в 11-м остальные 9000 дублей, а можно первые 1000 строк разделить на 99 квантов + 1 квант с 9000 дубликатами).
Но и у них ничего интеллектуального - в основе тот же простой отсчёт нужного числа строк.

Оригинал (там же есть варианты посложнее) https://github.com/catboost/catboost/blob/3cde523d326e08b32caf1b8b138c2c5303dc52e5/library/cpp/grid_creator/binarization.cpp
Поизучайте недельку функции с этой страницы и сэкономите несколько лет.

П.с. Основная причина, почему в очередном кванте не ровно 100 строк, а 315 или 88 или 4121 - не в какой то супер хитрой формуле (где строки объединяются по предсказательной способности, которой вы хотите делать  поиск критериев оценки этого квантового отрезка ), а просто в числе дубликатов.
catboost/binarization.cpp at 3cde523d326e08b32caf1b8b138c2c5303dc52e5 · catboost/catboost
catboost/binarization.cpp at 3cde523d326e08b32caf1b8b138c2c5303dc52e5 · catboost/catboost
  • catboost
  • github.com
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters
Причина обращения: