L'apprentissage automatique dans la négociation : théorie, modèles, pratique et algo-trading - page 212

 
Renat Fatkhullin:

R est un système étonnant, qui m'a personnellement ouvert les yeux sur la distance qui nous sépare, dans MetaTrader/MQL, des besoins réels de "rendre les calculs complexes simples et immédiats".

Nous (les développeurs C++) avons dans le sang l'approche "vous pouvez tout faire vous-même et nous vous donnons la base de bas niveau et la rapidité des calculs". Nous sommes fanatiques des performances et nous sommes bons dans ce domaine - MQL5 est excellent sur 64 bits.

Lorsque j'ai commencé à travailler moi-même sur R, j'ai réalisé que j'avais besoin d'un maximum de fonctions puissantes dans une seule ligne et de pouvoir faire des recherches en général.

Nous avons donc pris un tournant décisif et commencé à mettre à niveau MetaTrader 5 :

  • inclusion des bibliothèques mathématiques Alglib et Fuzzy précédemment réécrites dans la livraison standard, couvertes par des tests unitaires
  • développé un analogue de fonctions statistiques à partir de R, exécuté des tests et couvert par des tests. le travail est toujours en cours et la bibliothèque s'agrandit
  • développement de la première version bêta de la bibliothèque Graphics comme analogue de plot en R. ajout de fonctions à ligne unique pour une sortie rapide
  • ont commencé à modifier les interfaces dans les fenêtres de sortie du terminal, afin que nous puissions travailler avec des données tabulaires. Ils ont changé la direction de la sortie, ajouté la désactivation des colonnes inutiles, changé la police de caractères en monospace dans la fenêtre de sortie de l'Expert Advisor
  • une puissante fonction ArrayPrint pour l'impression automatique des tableaux, y compris les structures, a été ajoutée.
  • Ajout des fonctions FileLoad et FileSave pour un chargement/déchargement rapide des tableaux sur le disque.


Bien sûr, nous sommes au début du chemin, mais le bon vecteur d'efforts est déjà clair.

Votre motivation est grande ! Si c'est exactement comme vous le dites, vous allez rapidement mordre le ninja à l'os c multichart))))

Toutefois, IMHO, ici nous devons créer quelque chose de radicalement nouveau, c'est-à-dire, en plus de ce que vous avez écrit, M. Reshetov, vous avez besoin juste un studio de recherche, de travailler avec des ensembles de données arbitraires, pas seulement téléchargeable sur le marché, parce que beaucoup de choses ont besoin d'essayer très trivial, des exemples synthétiques pour comprendre ce qui se passe, ainsi, vous devez me comprendre comme un programmeur programmeur)). Je voudrais dessiner différents graphiques, des nuages de points, des hitmaps, des distributions, etc. En général, ce serait vraiment cool si un tel ensemble d'outils était disponible directement depuis MetaEditor, mais franchement, je n'ai aucun espoir...

Mais en général, bien sûr, j'aime la tendance de vos pensées ;))

 
Renat Fatkhullin:

C'était une réponse polie, sans détails ni vérification. Et la réponse ne correspondait pas à Wolfram Alpha et Matlab, ce qui est un problème.

Il n'est pas nécessaire d'esquiver - le problème de fond a été clairement exposé.

Comment ça, sa réponse ne correspondait pas à Wolfram ? Ne correspondait pas au fait que la réponse de la personne n'était pas "zéro" ? L'homme a répondu qu'il ne pensait pas qu'au point zéro, où l'intégrale = 0, la densité devait nécessairement être nulle (c'est ainsi que je lui ai posé la question). Il l'a dit explicitement. Et il a ajouté que la valeur de la densité en tout point n'est pas pertinente (j'ai lu "non pertinent" comme non pertinent pour la question à l'étude). Il s'agit d'une déclaration mathématique très claire.

Dans la question qui nous occupe, les mathématiques sont importantes.

Nous avons l'intégrale de la fonction de telle et telle (fonction de densité de probabilité de la distribution gamma). Tout le monde est habitué à ce que vous puissiez donner à Wolfram une équation avec des paramètres : spécifiez la zone d'intégration et les paramètres de la fonction, et il intégrera et donnera la réponse. Mais avez-vous déjà pensé que si vous vous asseyiez et calculiez vous-même cette intégrale sur un domaine donné, vous obtiendriez 0 à zéro et 1 sur tout le domaine, et une valeur [0,1] sur une certaine sous-région. Tout simplement en résolvant l'équation !

Le fait que la limite de la fonction de densité de probabilité de la distribution gamma se situe quelque part dans la région positive est une propriété de cette fonction. Cela n'a rien à voir avec ce que vous obtenez en intégrant cette fonction. C'est ce que l'homme a écrit.

Je n'esquive pas les problèmes de fond. Je répète que notre point a été confirmé par une personne hors de notre contrôle - dont la densité à zéro n'a pas d'importance (non pertinent).

 
Zhenya:

Votre motivation est grande ! Si tout est exactement comme vous le dites, vous allez rapidement mordre à l'os ninja c multichart))))

Toutefois, IMHO, ici nous devons créer quelque chose de radicalement nouveau, c'est-à-dire, en plus de ce que vous avez écrit M. Reshetov , vous avez besoin juste un studio de recherche, de travailler avec des ensembles de données arbitraires, pas seulement téléchargeable sur le marché, parce que beaucoup de choses ont besoin d'essayer très trivial, des exemples synthétiques pour comprendre ce qui se passe, ainsi, vous devez comprendre moi en tant que programmeur programmeur)). J'aurais besoin de dessiner différents graphiques, diagrammes de dispersion, hitmaps, distributions et ainsi de suite. En général, ce serait vraiment cool si un tel ensemble d'outils était disponible directement depuis MetaEditor, mais franchement, je n'ai aucun espoir...

Mais en général, bien sûr, j'aime la tendance de vos pensées ;)))

Faites-vous référence à ce "tir" de Reshetov ?

"Ce R est une sorte de vélo pourri avec des roues carrées. Que dire de certains de ses paquets, alors que la base, c'est-à-dire le noyau de R, est tordue et doit être sérieusement affinée avec une "lime à crayon" ? Quelle autorité peuvent avoir ceux qui n'ont même pas pris la peine de vérifier l'exactitude des fonctions de base en R depuis tant d'années ? Quelle peut être la "force" dans la faiblesse de R - l'incorrection des calculs à travers elle ?

Il est bon que MetaQuotes a ouvert les yeux de certains utilisateurs sur le fait et les tests avec l'open source, de sorte que tout le monde pourrait indépendamment double vérification et de s'assurer, plutôt que sans fondement. Pas tous les logiciels libres, bien sûr, car certains fanatiques religieux de la secte destructrice de R continueront à croire aveuglément à l'"infaillibilité" des calculs effectués dans leur langage et leurs paquets malhonnêtes, au lieu de se tourner vers les tests présentés et de les vérifier deux fois de manière indépendante, au lieu de défendre avec bigoterie la malhonnêteté de R comme "norme généralement acceptée".

Il est maintenant évident qu'il serait préférable d'utiliser la fonctionnalité MQL pour créer des stratégies de trading, car le résultat sera plus correct, plutôt que d'essayer de le faire via la courbe et la pente R.

Un grand merci aux développeurs de MetaQuotes pour l'approche constructive, les tests et leur code source, ainsi que pour avoir identifié le "roi nu - R" ! ".

 
Vladimir Perervenko:

Est-ce le "tir" auquel Reshetov fait référence ?

Non, c'est le message :

Yury Reshetov:

R, ainsi que de nombreux autres langages, est bien plus pratique pour l'apprentissage automatique que MQL car il possède une fonctionnalité inhérente permettant de traiter les données dans des tableaux. Le fait est qu'un échantillon pour l'apprentissage automatique est le plus souvent un tableau de données à deux dimensions, et qu'il faut donc une fonction pour travailler avec des tableaux :

  1. Insertion de lignes et de colonnes sous forme de tableaux de plus petite dimension dans un autre tableau
  2. Remplacer les lignes et les colonnes d'un tableau par des tableaux de plus petite taille
  3. Suppression de lignes et de colonnes d'un tableau (par exemple, pour éliminer d'une sélection des prédicteurs sans importance ou des exemples présentant des "aberrations" évidentes).
  4. Diviser des tableaux en parties, pour obtenir deux ou plusieurs tableaux qui sont des parties du tableau original (nécessaire pour diviser un échantillon en parties de formation et de test, ou en plusieurs parties, par exemple pour Walling Forward).
  5. Mélange aléatoire de lignes et de colonnes dans un tableau avec une distribution uniforme (il est nécessaire que certains exemples d'un échantillon tombent dans différentes parties, de préférence réparties uniformément sur ces parties).
  6. Diverses fonctions pour le traitement des données par ligne ou par colonne (par exemple, le calcul de la moyenne arithmétique par ligne ou par colonne, la variance, ou la recherche de la valeur maximale ou minimale dans une ligne pour une normalisation ultérieure).
  7. Et ainsi de suite.

Tant que MQL n'aura pas implémenté les fonctions susmentionnées nécessaires à la manipulation des échantillons dans les tableaux, la plupart des développeurs d'algorithmes d'apprentissage automatique préféreront d'autres langages qui disposent déjà de tout cela. Ou bien ils utiliseront le MLP sans prétention (algorithme des années 1960) de la bibliothèque AlgLib où, si je me souviens bien, pour des raisons de commodité, les tableaux bidimensionnels sont représentés comme unidimensionnels.

Bien entendu, les fonctions pour les densités des distributions aléatoires sont également des fonctionnalités nécessaires. Mais ces fonctions ne sont pas toujours nécessaires dans les tâches d'apprentissage automatique, et dans certaines tâches, elles ne sont pas utilisées du tout. Mais les opérations avec des échantillons sous forme de tableaux multidimensionnels sont ce dont l'implémentation des algorithmes d'apprentissage automatique a toujours besoin pour n'importe quelle tâche, à moins bien sûr qu'il ne s'agisse d'une tâche consistant à apprendre à une grille à apprendre des données manifestement normalisées à partir de CWR triviaux.

 
Vladimir Perervenko:

Est-ce le "tir" auquel Reshetov fait référence ?

"Ce R est pourri - un vélo aux roues carrées. Que dire de certains de ses paquets, alors que la base, c'est-à-dire le noyau de R, est tordue et nécessite une révision sérieuse avec une "lime à crayon" ? Quelle autorité peuvent avoir ceux qui n'ont même pas pris la peine de vérifier l'exactitude des fonctions de base en R depuis tant d'années ? Quelle peut être la "force" dans la faiblesse de R - l'incorrection des calculs à travers elle ?

Il est bon que MetaQuotes a ouvert les yeux de certains utilisateurs sur le fait et les tests avec l'open source, de sorte que tout le monde pourrait indépendamment double vérification et de s'assurer, plutôt que sans fondement. Pas tous les logiciels libres, bien sûr, parce que certains fanatiques religieux de la secte destructrice de R continueront à croire aveuglément à l'"infaillibilité" des calculs dans leur langage et leurs paquets malhonnêtes, au lieu de se tourner vers les tests présentés et de les vérifier deux fois de manière indépendante, au lieu de faire fanatiquement des conneries, en défendant la malhonnêteté de R comme "norme généralement acceptée".

Il est maintenant évident qu'il serait préférable d'utiliser la fonctionnalité MQL pour créer des stratégies de trading, car le résultat sera plus correct, plutôt que d'essayer de le faire via la courbe et la pente R.

Un grand merci aux développeurs de MetaQuotes pour leur approche constructive, leurs tests et leurs sources, ainsi que pour l'identification du "Roi nu - R" ! ".

Avez-vous déjà supprimé votre message sur le "minky MQL" ? Vous vous frottez à vos posts de la même manière que les personnalités radoviennes se frottent à leurs Facebooks après l'élection de Trump.

 

Voici un exemple de distribution gamma dans Wolfram Alpha pour le plaisir.

On lui donne une fonction, une fonction de densité de distribution gamma légèrement simplifiée.

Le point est dans le dénominateur x. La limite à droite, comme vous pouvez le voir, à x->0 Wolfram estime correctement : inf.

C'est-à-dire que dans la limite de droite, la densité au point zéro est à l'infini (c'est exactement la réponse à dgamma).

Intégrons cette fonction sur le grand saport :

L'intégrale est de 1 (arrondie, bien sûr, car on ne prend pas tout le support).

Conclusion, malgré le fait que la fonction va à l'infini au point extrême, l'intégrale de cette fonction compte bien comme il se doit.

 
Alexey Burnakov:

Voici un exemple de la distribution gamma dans Wolfram Alpha, juste pour le plaisir.

La conclusion est que même si la fonction va à l'infini au point extrême, l'intégrale de cette fonction compte bien comme il se doit.

Merci pour l'exemple, vous avez raison. Cette intégrale est convergente.

L'extremum au point x=0 peut également être utilisé pour déterminer la densité et il n'entraînera pas de divergence.

 
Quantum:

Merci pour l'exemple, vous avez raison. Cette intégrale est convergente.

Les valeurs limites à x=0 peuvent également être utilisées pour déterminer la densité et cela n'entraînera pas de divergence.


Merci ! Respect.

 

Exemple par R avec des paquets de traitement rapide.

library(data.table)

library(ggplot2)


start <- Sys.time()


set.seed(1)

dummy_coef <- 1:9


x <- as.data.table(matrix(rnorm(9000000, 0, 1), ncol = 9))

x[, (paste0('coef', c(1:9))):= lapply(1:9, function(x) rnorm(.N, x, 1))]


print(colMeans(x[, c(10:18), with = F]))


x[, output:= Reduce(`+`, Map(function(x, y) (x * y), .SD[, (1:9), with = FALSE], .SD[, (10:18), with = FALSE])), .SDcols = c(1:18)]


x[, sampling:= sample(1000, nrow(x), replace = T)]


lm_models <- x[, 

{

lm(data = .SD[, c(1:9, 19), with = F], formula = output ~ . -1)$coefficients

}, 

by = sampling]


lm_models[, coefs:= rep(1:9, times = 1000)]


avg_coefs <- lm_models[, mean(V1), by = coefs]

plot(dummy_coef, avg_coefs$V1)


lm_models[, 

  print(shapiro.test(V1)$p.value)

  , by = coefs]


ggplot(data = lm_models, aes(x = V1)) +

geom_histogram(binwidth = 0.05) +

facet_wrap(~ coefs, ncol = 3)


Sys.time() - start

Durée : 5 secondes. 1 000 modèles linéaires ont été construits. Chacun sur 1000 observations.

[1] 0.8908975

[1] 0.9146406

[1] 0.3111422

[1] 0.02741917

[1] 0.9824953

[1] 0.3194611

[1] 0.606778

[1] 0.08360257

[1] 0.4843107

Tous les coefficients sont normalement distribués.

Et ggplot-ic pour la visualisation.

 

Et un autre exemple. Concerne également la rotation des grands échantillons pour la simulation statistique.

########## simulate diffference between mean density with different sample size


library(data.table)

library(ggplot2)


rm(list=ls());gc()


start <- Sys.time()


x <- rnorm(10000000, 0, 1)

y <- rnorm(10000000, 0, 1)


dat <- as.data.table(cbind(x, y))

dat[, (paste0('sampling_', c(100, 1000, 10000))):= lapply(c(100, 1000, 10000), function(x) sample(x, nrow(dat), replace = T))]


dat_melted <- melt(dat, measure.vars = paste0('sampling_', c(100, 1000, 10000)))


critical_t <- dat_melted[, 

   {

    mean(x) - mean(y)

   }

   , by = .(variable, value)]


ggplot(critical_t, aes(x = V1, group = variable, fill = variable)) + 

stat_density(alpha = 0.5)


Sys.time() - start


gc()

Durée de fonctionnement : 3,4 secondes.

Des échantillons normalement distribués et centrés sur zéro sont créés :

1 000 par 10 000 paires de valeurs

10 000 sur 1 000 paires de valeurs

100 000 de 100 paires de valeurs

On compte la différence entre les moyennes (MO == 0) pour chaque échantillon.

Les densités des distributions des moyennes d'échantillonnage pour des échantillons de différentes tailles sont dérivées.

Seulement ici, sampling_100 signifie que vous avez besoin de 10 000 000 / 100 pour obtenir la taille de l'échantillon. C'est-à-dire que pour les petits échantillons, l'erreur standard est plus grande...