Maschinelles Lernen im Handel: Theorie, Modelle, Praxis und Algo-Trading - Seite 3301

 
Andrey Dik #:

Ja, Sanych schrieb, dass es dort keine Extrema gibt, und er lag falsch, denn jede Funktion hat Extrema.

Ein Extremum ist der Punkt, an dem eine Funktion den größten (maximalen) oder kleinsten (minimalen) Wert in einem bestimmten Intervall oder in einem bestimmten Bereich erreicht. Extrema können lokal sein, wenn die Funktion einen Extremwert nur in der Nähe eines Punktes erreicht, oder global, wenn die Funktion einen Extremwert über das gesamte gegebene Intervall oder in einem gegebenen Gebiet erreicht.

Extrema gibt es immer, auch wenn man nicht absichtlich danach sucht (die verwendeten Algorithmen übernehmen diese Suche für einen). Lernen ohne Optimierung ist unmöglich, und Optimierung ist unmöglich ohne korrekte FF-Zuweisungen. Wenn die Suche nach Extremen für Sie erledigt und versteckt ist (in den Algorithmus eingenäht), bedeutet das nicht, dass es sie nicht gibt (sowohl Extrema als auch Optimierung).

Es gibt dort keine Funktion.

Bitte, genug, vorbei mit der Kasseninfo. Ich weiß, was Optimierung ist.
 
mytarmailS #:

wie das?

und kann es wirklich eine Million Bedingungen erfüllen?

Ich bin ein bisschen verloren mit diesem Schalter und C ++ Zeug.

Die ersten beiden Funktionen sind R-Implementierungen, die letzte ist switch in 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

In der Tat, es gibt keinen Gewinn überhaupt, wie kann das sein?
 
mytarmailS #:

Ich bin etwas ratlos, was diese Switch- und C++-Sache angeht.

Die ersten beiden Funktionen sind R-Implementierungen, die letzte ist switch in C++.

In der Tat gibt es überhaupt keinen Gewinn, wie kann das sein...?

Können Sie mir den Code zeigen?

Wahrscheinlich vergeuden Sie eine Funktion, wenn die Antwort bereits erhalten wurde...

 
Aleksey Vyazmikin #:

Können Sie mir den Code zeigen?

Wahrscheinlich führen Sie die Funktion vergeblich aus, wenn die Antwort bereits eingegangen ist...

Der Code ist derselbe wie der, den ich gepostet habe, nur dass ich die Regeln auf 300 statt auf 5 gesetzt habe.

Was bringt es, den Code zu posten?
Ich habe mich bereits für die Architektur entschieden
 
mytarmailS #:
Der Code ist derselbe wie der von Ihnen gepostete, nur dass ich die Regeln auf 300 statt auf 5 gesetzt habe

Was bringt es, den R-Code zu posten?
Ich habe mich bereits für die Architektur entschieden

Die Frage liegt im Code des Funktionsaufrufs.

 
Aleksey Vyazmikin #:

Die Frage liegt im Code des Funktionsaufrufs.

Ich verstehe es nicht
 
mytarmailS #:

Im Grunde genommen überhaupt kein Gewinn, wie kann das sein...

Es gibt eine Menge Dinge, die sein könnte. Das Skript ist beigefügt, unten ist der Funktionsteil.

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);
}


Ergebnis.

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


Es ist nicht klar, was hier gemessen wird - siehe die hervorgehobenen Kommentare. Angeblich viel schneller als Regel2.

Dateien:
 
fxsaber #:

Interessanterweise ist das menschliche Gehirn (als neuronales Netz) im Vergleich zu MO, was die Datenmenge (Zitate) angeht, wie eine Infusorie im Vergleich zu einem Menschen.

Allerdings haben primitive Menschen bewiesen, dass sie ziemlich gut funktionierende TCs erstellen können. Es hat sich herausgestellt, dass keine so große Menge an Daten erforderlich ist, um eine funktionierende TK zu erstellen.

Es ist mir ein Rätsel, wie der Mensch zum Beispiel zu funktionierenden Scalper-Modellen gekommen ist. Das geschah fast ganz ohne Zahlenjongleure.


Das Szenario dafür war offenbar in etwa so:

  1. Ich sehe oft irgendeine Art von Abflachung (ich habe ein paar Tage lang dumm am Bildschirm herumgeschliffen).
  2. Ich werde versuchen, Geld auf sie mit einem primitiven TS zu machen.
  3. Es läuft nicht viel ab. Ich sollte den TS ein wenig verfeinern. Ich habe mir die Trading-Historie angeschaut - es sieht so aus, als ob man da noch etwas verbessern könnte.
  4. Es fing an, ein wenig im Plus zu sein. Ich wiederhole Punkt 3.
Kein Zahlenjongleur. Ich habe mir nur Punkt 1 angesehen und angefangen, es zu tun. Die Wahrscheinlichkeit dieses Ansatzes scheint gleich Null zu sein, aber irgendwie funktioniert es. Eine Art funktionierende Wahnsinns-Methode.


Offenbar ist das menschliche Gehirn unterbewusst in der Lage, auch bei extrem kleinen Datenmengen "Muster" zu finden. Man kann es nicht Glück nennen. Es ist ein Rätsel.

Imho liegt das ganze Geheimnis in der Weitergabe von Erfahrungen, alles Neue baut auf den Errungenschaften der vorherigen Generation auf. Nehmen Sie moderne Prozessoren. Für Menschen aus dem 19. Jahrhundert wird es Magie sein. Für das 20. Jahrhundert wird es eine sehr komplexe Technologie sein, für die es nicht die richtigen Werkzeuge gibt, um sie zurückzuentwickeln. Nur durch Wissenstransfer und schrittweise Entwicklung können wir den modernen Stand der Technik erreichen. Deshalb heißt es, dass man im Falle eines Dritten Weltkriegs im Vierten Weltkrieg mit Steinen kämpfen wird. Es gibt Legenden über den Handel, die besagen, dass die Märkte früher viel einfacher waren und dass Zenith-Händler mit Hilfe von gleitenden Durchschnitten ein Vermögen gemacht haben, was heute nicht mehr möglich sein wird.

 
fxsaber #:

Es ist ziemlich unklar, was hier gemessen wird - siehe die hervorgehobenen Kommentare. Angeblich viel schneller als Regel2.

Hier wurden diese Funktion und ihre verschiedenen Implementierungen (Äquivalente), einschließlich derer in C++, gemessen.

Nun, ich habe mich bereits für die Architektur entschieden, ich bleibe vorerst auf reinem R-ke sitzen, ich habe einen Weg gefunden, um 25 mal schneller zu werden + es gibt immer noch Pluspunkte/starke Gründe, C++ nicht zu meinem Code hinzuzufügen.

 

Sie können eine Herausforderung mit meinem AMO haben.

"Lösen Sie den TS."


Sie geben mir einen kleinen Teil der Daten, die Sie verwenden.

Du beschreibst, welche Operatoren, Funktionen und Variablen du in deinem Code verwendest.

Und du gibst mir deine Gleichung oder Signale des Algorithmus.


Ich erstelle eine Suchgrammatik, nehme den Code als Chiffre auf und löse Ihren TS.