L'Apprentissage Automatique dans le trading : théorie, modèles, pratique et trading algo - page 3301

 
Andrey Dik #:

Oui, Sanych a écrit qu'il n'y avait pas d'extrema, et il avait tort, car toute fonction a des extrema.

L'extrema est le point où une fonction atteint la valeur la plus grande (maximum) ou la plus petite (minimum) sur un intervalle donné ou dans une zone donnée. Les extrêmes peuvent être locaux, lorsque la fonction n'atteint une valeur extrême que dans un certain voisinage d'un point, ou globaux, lorsque la fonction atteint une valeur extrême sur l'ensemble d'un intervalle donné ou dans une zone donnée.

Les extrêmes sont toujours présents, même si vous ne les recherchez pas intentionnellement (les algorithmes que vous utilisez effectuent cette recherche pour vous). L'apprentissage sans optimisation est impossible, et l'optimisation est impossible sans une affectation correcte des FF. Si la recherche d'extrema est faite pour vous et cachée (cousue dans l'algorithme), cela ne veut pas dire qu'ils n'existent pas (extrema et optimisation).

Il n'y a là aucune fonction.

S'il vous plaît, assez, passez l'info sur le box-office. Je sais ce qu'est l'optimisation.
 
mytarmailS #:

comme ça ?

et peut-il vraiment gérer un million de conditions ?

Je suis un peu perdu avec ces trucs de switch et de C++.

Les deux premières fonctions sont des implémentations R, la dernière est un switch en C++.

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

En fait, il n'y a pas de gain du tout, comment est-ce possible ?
 
mytarmailS #:

Je suis un peu perdu avec cette histoire de switch et de C++.

Les deux premières fonctions sont des implémentations R, la dernière est un switch en C++.

En fait, il n'y a pas de gain du tout, comment est-ce possible ?

Pouvez-vous me montrer le code ?

Vous gaspillez probablement une fonction alors que la réponse a déjà été reçue...

 
Aleksey Vyazmikin #:

Pouvez-vous me montrer le code ?

Il est probable que vous exécutiez la fonction en vain, alors que la réponse est déjà reçue...

Le code est le même que celui que j'ai posté, sauf que j'ai mis les règles à 300 au lieu de 5.

Quel est l'intérêt de poster le code ?
J'ai déjà décidé de l'architecture
 
mytarmailS #:
Le code est le même que celui que vous avez posté, sauf que j'ai mis les règles à 300 au lieu de 5

Quel est l'intérêt de poster le code R ?
J'ai déjà décidé de l'architecture

La question est dans le code de l'appel de fonction.

 
Aleksey Vyazmikin #:

La question se trouve dans le code d'appel de la fonction.

Je ne comprends pas
 
mytarmailS #:

En fait, il n'y a pas de gain du tout, comment est-ce possible ?

Il y a beaucoup de choses qui pourraient l'être. Le script est joint, ci-dessous la partie de la fonction.

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 = 1 e8; (bool)i--;) Tmp += rule(i % 100, x));
  BENCH(for (uint i = 1 e8; (bool)i--;) Tmp += rule2(i % 100, x));
  BENCH(for (uint i = 1 e8; (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);
}


Résultat.

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


Ce qui est mesuré ici n'est pas clair - voir les commentaires surlignés. Prétendument beaucoup plus rapide que la règle 2.

Dossiers :
 
fxsaber #:

Il est intéressant de noter qu'en termes de quantité de données (citations), le cerveau humain (en tant que réseau neuronal) comparé à la MO est comme une infusoire par rapport à un humain.

Cependant, les humains primitifs ont prouvé qu'ils pouvaient créer d'assez bons CT fonctionnels. Il s'avère qu'il n'est pas nécessaire de disposer d'une énorme quantité de données pour créer un CT opérationnel.

Je ne sais pas comment, par exemple, l'homme est parvenu à créer des modèles de scalper fonctionnels. Cela s'est fait presque entièrement sans calculateurs de chiffres.


Le scénario était apparemment à peu près le suivant :

  1. Je vois souvent une sorte d'aplatissement (j'ai bêtement broyé sur l'écran pendant quelques jours).
  2. Je vais essayer de gagner de l'argent dessus avec un TS primitif.
  3. Il ne draine pas grand-chose. Je devrais affiner un peu le TS. J'ai regardé l'historique des transactions - il semble que quelque chose puisse être amélioré.
  4. Il a commencé à augmenter un peu. Je répète le point 3.
Pas de calculateur. J'ai simplement regardé le point 1 et j'ai commencé à le faire. La probabilité de cette approche semble être à peu près nulle, mais d'une manière ou d'une autre, elle fonctionne. C'est une sorte de méthode qui fonctionne.


Apparemment, le cerveau humain est encore capable, de manière inconsciente, de trouver des "modèles" à partir d'un nombre extrêmement réduit de données. On ne peut pas parler de chance. C'est un mystère.

À mon avis, tout le secret réside dans le transfert d'expérience : tout ce qui est nouveau est construit sur la base des réalisations de la génération précédente. Prenez les processeurs modernes. Pour les gens du 19e siècle, c'est de la magie. Pour ceux du 20e siècle, il s'agira d'une technologie très complexe qui ne disposera pas des bons outils pour faire de la rétro-ingénierie. Ce n'est que par le transfert de connaissances et le développement progressif que nous pourrons atteindre le niveau technologique moderne. C'est pourquoi on dit que s'il y a une troisième guerre mondiale, on se battra avec des pierres lors de la quatrième guerre mondiale. Il existe des légendes sur le trading, selon lesquelles les marchés étaient beaucoup plus faciles auparavant, et les traders du zénith ont fait fortune avec l'aide des moyennes mobiles, ce qui n'est plus possible aujourd'hui.

 
fxsaber #:

Ce qui est mesuré ici n'est pas très clair - voir les commentaires surlignés. Prétendument beaucoup plus rapide que la règle 2.

Ici, la fonction et ses différentes implémentations (équivalents), y compris celles en C++, ont été mesurées.

Bon, j'ai déjà décidé de l'architecture pour l'instant, je vais m'asseoir sur du R-ke pur pour l'instant, j'ai trouvé un moyen d'accélérer de 25 fois + il y a encore des avantages/de fortes raisons de ne pas ajouter du C++ à mon code.

 

Vous pouvez relever un défi avec mon AMO.

"Résolvez le TS".


Vous me donnez un petit morceau de données que vous utilisez.

Vous décrivez les opérateurs, les fonctions et les variables que vous utilisez dans le code.

Et vous me donnez votre équité ou les signaux de l'algorithme.


Je crée une grammaire de recherche, et je prends le code comme un cryptogramme et je résous votre TS.