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

 
Maxim Dmitrievsky #:

Саныч сказал, что там нет никаких экстремумов, и был прав.

Да, Саныч написал, что там нет экстремумов, и был неправ, потому что экстремумы есть у любой функции.

Экстремум - это точка, в которой функция достигает наибольшего (максимума) или наименьшего (минимума) значения на заданном интервале или в заданной области. Экстремумы могут быть локальными, когда функция достигает экстремального значения только в некоторой окрестности точки, или глобальными, когда функция достигает экстремального значения на всем заданном интервале или в заданной области.

Экстремумы есть всегда, даже если ты их не ищешь намеренно (за тебя эту операцию поиска делают алгоритмы, которые используешь). Обучение без оптимизации невозможно, а оптимизация невозможна без правильных заданий ФФ. Если за тебя сделали и скрыли (зашили в алгоритм) поиск экстремумов, то это не значит что их нет (и экстремумов и оптимизации).
 
Aleksey Nikolayev #:
Если все функции линейны, как в примере, то можно просто через обычную двумерную матрицу коэффициентов. Ещё можно сделать сжатие объёма, если матрица разреженная.

Нет , не линейны , предполагаеться запихивать в каждую функцию код намного более сложный..

В Р-ке проблем с этим нету, делай что хош , но скорость((

Ищу способ делать это на с++

 
Andrey Dik #:

Да, Саныч написал, что там нет экстремумов, и был неправ, потому что экстремумы есть у любой функции.

Экстремум - это точка, в которой функция достигает наибольшего (максимума) или наименьшего (минимума) значения на заданном интервале или в заданной области. Экстремумы могут быть локальными, когда функция достигает экстремального значения только в некоторой окрестности точки, или глобальными, когда функция достигает экстремального значения на всем заданном интервале или в заданной области.

Экстремумы есть всегда, даже если ты их не ищешь намеренно (за тебя эту операцию поиска делают алгоритмы, которые используешь). Обучение без оптимизации невозможно, а оптимизация невозможна без правильных заданий ФФ. Если за тебя сделали и скрыли (зашили в алгоритм) поиск экстремумов, то это не значит что их нет (и экстремумов и оптимизации).

там нет функции

пожалуйста, хватит, мимо кассы инфа. Я знаю, что такое оптимизация.
 
mytarmailS #:

типа как то так?

и он реально сможет нормально переваривать милион условий?

Что то я немножко в растераности с этим switch и С++

первые две функции это реализация на Р-ке , последняя  switch на С++

Unit: microseconds
                              expr    min     lq      mean median     uq       max neval
     rule(n = sample(1:200, 1), x) 40.482 44.473  57.18044 46.754 51.886  2688.931  1000
    rule2(n = sample(1:200, 1), x) 29.079 35.351 567.03671 38.202 43.904 86712.314  1000
 rule_cpp(n = sample(1:200, 1), x) 31.360 34.781  53.26793 36.491 40.482  4924.005  1000

По сути прироста вообще никакого, как такое может быть..
 
mytarmailS #:

Что то я немножко в растераности с этим switch и С++

первые две функции это реализация на Р-ке , последняя  switch на С++

По сути прироста вообще никакого, как такое может быть..

Код может покажите?

Вероятно функцию гоняете впустую, когда ответ уже получен...

 
Aleksey Vyazmikin #:

Код может покажите?

Вероятно функцию гоняете впустую, когда ответ уже получен...

Код тот же что и выкладывал, только правил сделал 300 а не 5

А Код на Р какой смысл выкладывать? 
С архитектурой я уже определился
 
mytarmailS #:
Код тот же что и выкладывал, только правил сделал 300 а не 5

А Код на Р какой смысл выкладывать? 
С архитектурой я уже определился

Вопрос в коде вызова функции.

 
Aleksey Vyazmikin #:

Вопрос в коде вызова функции.

Не понял
 
mytarmailS #:

По сути прироста вообще никакого, как такое может быть..

Там много, что может быть. Скрипт приложен, ниже его часть с функциями.

bool Rule0( const vector<double> &x ) { return(x[3] > x[4]); }
bool Rule1( const vector<double> &x ) { return(x[0] < x[4]); }
bool Rule2( const vector<double> &x ) { return(x[1] >= x[0]); }
bool Rule3( const vector<double> &x ) { return(x[3] == x[4]); }
bool Rule4( const vector<double> &x ) { return(x[0] != x[4]); }
bool Rule5( const vector<double> &x ) { return(x[1] >= x[0]); }
bool Rule6( const vector<double> &x ) { return(x[3] <= x[4]); }
bool Rule7( const vector<double> &x ) { return(x[0] < x[4]); }
bool Rule8( const vector<double> &x ) { return(x[1] >= x[0]); }
bool Rule9( const vector<double> &x ) { return(x[3] <= x[4]); }

bool rule3( const int n, const vector<double> &x )
{
  typedef bool (*RULE)( const vector<double>& );
  static const RULE Rules[] = {Rule0, Rule1, Rule2, Rule3, Rule4, Rule5, Rule6, Rule7, Rule8, Rule9,
                               Rule0, Rule1, Rule2, Rule3, Rule4, Rule5, Rule6, Rule7, Rule8, Rule9,
                               Rule0, Rule1, Rule2, Rule3, Rule4, Rule5, Rule6, Rule7, Rule8, Rule9,
                               Rule0, Rule1, Rule2, Rule3, Rule4, Rule5, Rule6, Rule7, Rule8, Rule9,
                               Rule0, Rule1, Rule2, Rule3, Rule4, Rule5, Rule6, Rule7, Rule8, Rule9,
                               Rule0, Rule1, Rule2, Rule3, Rule4, Rule5, Rule6, Rule7, Rule8, Rule9,
                               Rule0, Rule1, Rule2, Rule3, Rule4, Rule5, Rule6, Rule7, Rule8, Rule9,
                               Rule0, Rule1, Rule2, Rule3, Rule4, Rule5, Rule6, Rule7, Rule8, Rule9,
                               Rule0, Rule1, Rule2, Rule3, Rule4, Rule5, Rule6, Rule7, Rule8, Rule9,
                               Rule0, Rule1, Rule2, Rule3, Rule4, Rule5, Rule6, Rule7, Rule8, Rule9};

  return(Rules[n](x));
}

#define BENCH(A)                                                              \
  StartTime = GetMicrosecondCount();                                          \
  A;                                                                          \
  Print(#A + " - " + (string)(GetMicrosecondCount() - StartTime) + " mcs");

void OnStart()
{
  const vector<double> x = {1, 2, 3, 4, 5};
  int Tmp = 0;

  ulong StartTime;

  BENCH(for (uint i = 1e8; (bool)i--;) Tmp += rule(i % 100, x));
  BENCH(for (uint i = 1e8; (bool)i--;) Tmp += rule2(i % 100, x));
  BENCH(for (uint i = 1e8; (bool)i--;) Tmp += rule3(i % 100, x));
//  BENCH(for (uint i = 1e8; (bool)i--;) Tmp += rule(i % 100, x));  // Если добавить эту строку, то выше rule замедлится.
//  BENCH(for (uint i = 1e8; (bool)i--;) Tmp += rule2(i % 100, x)); // Если добавить эту строку, то выше rule2 замедлится.
//  BENCH(for (uint i = 1e8; (bool)i--;) Tmp += rule3(i % 100, x)); // Если добавить эту строку, то выше rule3 замедлится.

  Print(Tmp);
}


Результат.

for (uint i = 1e8; (bool)i--;) Tmp += rule(i % 100, x) - 505436 mcs
for (uint i = 1e8; (bool)i--;) Tmp += rule2(i % 100, x) - 261261 mcs
for (uint i = 1e8; (bool)i--;) Tmp += rule3(i % 100, x) - 709846 mcs


Тут совершенно непонятно, что замеряется - см. выделенные комментарии. Якобы сильно быстрее rule2.

Файлы:
 
fxsaber #:

Интересно, что с точки зрения обладания количеством данных (котировки), головной мозг человека (как нейросеть) по сравнению с МО, это как инфузория по сравнению с человеком.

Однако, настолько примитивный человек доказал, что может создать неплохие рабочие ТС. Получается, что для создания рабочей ТС не требуется столь огромное количество данных.

Для меня загадка, как, например, человек дошел до рабочих моделей скальперов. Это было сделано практически полностью без числодробилок.


Сценарий этого, видимо, был примерно таким:

  1. Что-то часто вижу какой-то флет (тупо на экране помотал несколько дней).
  2. Попробую-ка на нем заработать примитивной ТС.
  3. Не сливает сильно. Надо бы немного доработать ТС. Посмотрел на историю торговли - похоже, что-то можно улучшить.
  4. Стала плюсовать немного. Повторяю п.3.
Никакой числодробилки. Тупо посмотрел в п.1. и начал делать. Вероятность такого подхода видится около нулевой, но почему-то работает. Какой-то рабочий безумный метод тыка.


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

Имхо, весь секрет в передаче опыта, все новое строится на достижениях предыдущего поколения. Взять современные процессоры. Для людей из 19 века это будет магия. Для 20 века - очень сложная технология, на реверсинжиниринг которой не будет нужного инструментария. Только благодаря передаче знаний и постепенному развитию можно достигнуть современного уровня технологий. Поэтому и говорят, если будет 3 мировая, то в 4 мировой будут драться камнями. Про трейдинг ходят легенды, что раньше рынки были на много легче, и зенитчики с помощью скользящих средних делали состояния, сейчас так не получится.

Причина обращения: