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

 
Maxim Dmitrievsky #:

тем, что я не люблю общаться с безграмотными софистами и психологами )

такие люди не производят полезный контент

Ваша "любовь" влияет каким то магическим образом на данные?

 
Maxim Dmitrievsky #:

Это же не подсчет всех возможных коррелирующих паттернов, а сравнение исходника с другими данными. Здесь матрица и не нужна, достаточно вектор.

Это ядро построчного расчета матрицы.

 
fxsaber #:

Это ядро построчного расчета матрицы.

Интересно, а если матрицу посчитать и такую же быстрым алгибовским алгоритмом PearsonCorrM. Кто быстрее будет.
PearsonCorrM раз в 40-50 быстрее считал построчной алглибовской, наверное даже быстрая самоделка такой разрыв в скорости не преоделеет.
 
Forester #:
Интересно, а если матрицу посчитать и такую же быстрым алгибовским алгоритмом PearsonCorrM. Кто быстрее будет.
PearsonCorrM раз в 40-50 быстрее считал построчной алглибовской, наверное даже быстрая самоделка такой разрыв в скорости не преоделеет.

Здесь в два раза отставание самоделки от PearsonCorrM.

 

Сравнил скорость обучения CatBoost в питоне и через командную строку:

- На 20% быстрей от момента запуска и до сохранения моделей, с учётом чтения выборки

- На 12% быстрей сам процесс обучения

Проверка была на одной модели - результат обучения идентичный.

Быстрей, разумеется, командная строка.

 
Aleksey Vyazmikin #:

Сравнил скорость обучения CatBoost в питоне и через командную строку:

- На 20% быстрей от момента запуска и до сохранения моделей, с учётом чтения выборки

- На 12% быстрей сам процесс обучения

Проверка была на одной модели - результат обучения идентичный.

Быстрей, разумеется, командная строка.

Вы все еще командной строкой запускаете EXE-шники?
Можно же через WinExec и даже оптимизировать в тестере.

#import "kernel32.dll"
   int WinExec(uchar &Path[],int Flag);
   int SleepEx(int msec, bool Alertable=false);//SleepEx(1000,false); - для простого таймера
#import 
...
string CommonPath = TerminalInfoString(TERMINAL_COMMONDATA_PATH)+ "\\Files\\";
string RAM_dir="RAM\\";//использую диск в памяти для скорости
string agent_dir=RAM_dir+"0000";//при запуске в терминале
string p=MQLInfoString(MQL_PROGRAM_PATH);// C:\Users\User\AppData\Roaming\MetaQuotes\Tester\ххххххххххххххххххххххх\Agent-127.0.0.1-3000\MQL5\Experts\testEXE.ex5
int agent_pos=StringFind(p,"Agent-");// при оптимизации запустится в папке с номером агента
if(agent_pos!=-1){agent_pos=StringFind(p,"-",agent_pos+6);agent_dir = RAM_dir+StringSubstr(p,agent_pos+1,4);}//выдаст 3001, 3002... по номеру папки в котором тестер запустился
FolderCreate(agent_dir,FILE_COMMON);
...
sinput string PathExe="С:\\your.exe";//path to exe file
uchar ucha[];
StringToCharArray(PathExe_+" --dir "+CommonPath+agent_dir+"\\",ucha);//string to train
int visible=0;
FileDelete(agent_dir+"\\model.bin",FILE_COMMON); //сначала удалить старый
int x=WinExec(ucha,visible); //visible=0 - work in hidden window, 1 - work in opened exe window - can be closed by user. Better to use 0, to run proces up to finish.
while(true){if(FileIsExist(agent_dir+"\\model.bin",FILE_COMMON)){break;}SleepEx(1000);}// используем SleepEx из DLL (Sleep() от MQL не работает в оптимизаторе, будет грузить проц на 100% проверками файла. Через DLL 1%.). Файл с моделью появился - расчет закончен.
//модель обучена, читаем файл модели и используем

Catboost не пробовал, но думаю можно что-то придумать.
Самое сложное, определить момент окончания обучения. Я это делаю проверкой появления файла с моделью в папке agent_dir+"\\model.bin" 1 раз в секунду. Куда кладет файл модели Catboost - не знаю, возможно придется искать его в другом месте.

Еще возможная проблема, если файл модели огромный, то он может долго записываться, т.е. Файл уже существует, но не записан до конца. Возможно надо будет сделать доп паузу или проверять, что файл не закрыт от чтения процессом записи...
 
Forester #:

Вы все еще командной строкой запускаете EXE-шники?
Можно же через WinExec и даже оптимизировать в тестере.

Я запускаю bat файлы - пока это самый удобный вариант для текущих задач.

Пока только одна задачка есть для автоматического запуска обучения после получения выборки - разведывательный поиск. Планирую чуть позже под неё сделать запуск автоматом bat файла.

Forester #:

Catboost не пробовал, но думаю можно что-то придумать.

Самое сложное, определить момент окончания обучения. Я это делаю проверкой появления файла с моделью в папке agent_dir+"\\model.bin" 1 раз в секунду. Куда кладет файл модели Catboost - не знаю, возможно придется искать его в другом месте.

Еще возможная проблема, если файл модели огромный, то он может долго записываться, т.е. Файл уже существует, но не записан до конца. Возможно надо будет сделать доп паузу или проверять, что файл не закрыт от чтения процессом записи...

Решение интересное у Вас - посмотрю, может и его возьму для применения.

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

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

 
Aleksey Vyazmikin #:

Может относительная успешность варианта -1 и 0 в размере выборки train, и следует её уменьшить? Вообще, похоже что Recall на это реагирует.

Как считаете, должен ли результат быть при таких комбинациях сопоставим друг с другом в нашем случае? Или данные безвозвратно устаревают?

Разбил выборку train на 3 части, обучил 3 набора для варианта -1 и варианта 0, а так же обучил в качестве трёх выборок только изначальную train.

Вот что получилось.

Сделал такой обобщающий показатель PR=(Precision-0.5)*Recall

Похоже, что обучение происходит за счет 2 и 3 части выборки train - сейчас объединил их и запустил обучение - посмотрим, что получится.

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

 
Aleksey Vyazmikin #:

Похоже, что обучение происходит за счет 2 и 3 части выборки train - сейчас объединил их и запустил обучение - посмотрим, что получится.

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

А вот и результат - два последних столбца

Действительно, результаты улучшились. Можно сделать предположение, что чем больше выборка, тем лучше будет результат обучения.

Надо попробовать обучиться на 1 и 2 части выборки train - и если результаты будут не сильно хуже, чем на 2 и 3 части, то фактор свежести выборки можно считать менее значимым, чем объём.

 

Много раз писал о "предсказательной способности предикторов". которая вычисляется как расстояние между двумя векторами.

Попался список инструментов для вычисления расстояния:

library(proxy)
pr_DB$get_entry_names()
##  [1] "Jaccard"         "Kulczynski1"    
##  [3] "Kulczynski2"     "Mountford"      
##  [5] "Fager"           "Russel"         
##  [7] "simple matching" "Hamman"         
##  [9] "Faith"           "Tanimoto"       
## [11] "Dice"            "Phi"            
## [13] "Stiles"          "Michael"        
## [15] "Mozley"          "Yule"           
## [17] "Yule2"           "Ochiai"         
## [19] "Simpson"         "Braun-Blanquet" 
## [21] "cosine"          "angular"        
## [23] "eJaccard"        "eDice"          
## [25] "correlation"     "Chi-squared"    
## [27] "Phi-squared"     "Tschuprow"      
## [29] "Cramer"          "Pearson"        
## [31] "Gower"           "Euclidean"      
## [33] "Mahalanobis"     "Bhjattacharyya" 
## [35] "Manhattan"       "supremum"       
## [37] "Minkowski"       "Canberra"       
## [39] "Wave"            "divergence"     
## [41] "Kullback"        "Bray"           
## [43] "Soergel"         "Levenshtein"    
## [45] "Podani"          "Chord"          
## [47] "Geodesic"        "Whittaker"      
## [49] "Hellinger"       "fJaccard"

Это кроме стандартного, в котором свой набор расстояний

stats::dist()