Freitag, 19. April 2024, 01:47 UTC+2

Sie sind nicht angemeldet.

  • Anmelden
  • Registrieren

Gerasan

unregistriert

1

Sonntag, 23. März 2008, 01:14

Indikator WekaFwdIndikator möglicher Bug

Hallo Martin,
ich möchte in diesem separaten thread nochmal auf die Funktionsweise des Indikators zurückkommen. Entweder stehe ich gewaltig auf dem Schlauch oder der Indikator funktioniert fehlerhaft beim Realtrading. Ich habe Debug-Dateien analysiert und ich sehe dort, sofern ich sie richtig interpretiere, das alle 10 Prognosewerte (testperioden = 10) sich von Periode zu Periode im Realtrading komplett ändern. Das führt dazu das im Realtrading die Signallinie sich beliebig ändert innderhalb der Testperiode bei jeder neuen Kerze.

Bitte schaue die drei angehängte debug-dateien an.

Hier zitiere ich deine Stellungsnahme aus dem anderen Thread:

Zitat


Wenn Ihr euch meine kurze Beschreibung in einem Wiki zu diesem Indikator ein wenig könnt ihr erkennen, dass sich die Perioden stets überlappen, jedoch eine Periode (Training und anschließende Prognose) stets fix sind. Und dieses gilt sowohl für den Backtest als auch für das reale Trading.

Es funktioniert einfach auf der Grundlage, dass es einen festen Starttermin gibt. Unter der Annahme dieses festen Starttermins teile ich die Perioden für das Training und für die Prognose auf die gesamte Laufzeit auf. Durch diese Aufteilung ist sichergestellt, dass auch beim realen Trading die eingestellte Angabe für Testperioden berücksichtigt wird. Rein technisch wird der Indikator während dieser Perioden zwar neue trainiert, faktisch sollten aber die Ergebnisse zu sein, als würden alle zusammengehörenden Prognosen aus dem gleichen SVM berechnet. Dies ist möglich, da der Algorithmus deterministisch arbeitet.

Ein Manko meiner Vorgehensweise liegt darin, dass ich die Maschine mehr als nötig rechnen lasse.

Wenn Ihr das ganze nachvollziehen möchte bitte ich euch im Debug-Modus die Eingabedaten für den Test und für die Prognose zu betrachten. Ihr könnt dann feststellen, dass im Falle des Parameters Testperioden > 1 auch im realen Trading immer wieder mehr als ein Prognose wird in den Datenreihen auftaucht.


Die fett markierte Passage ist für Realtrading nicht ganz klar. Du sagst es gibt einen festen Starttermin und das fixiert die Perioden. Beim Realtrading aber bewegen sich doch die Perioden. Rechts kommen neue dazu und links fallen alte raus. Im Debug-Datei sieht man auch, daß die Trainings und Testperioden immer um eins weitergeschoben werden, zwingend dazu führt, daß die Prognose jedesmal anders aussieht. Könntest Du das überprüfen.
»Gerasan« hat folgende Dateien angehängt:
  • debug11.txt (16,9 kB - 445 mal heruntergeladen - zuletzt: 9. April 2024, 03:47)
  • debug22.txt (16,89 kB - 451 mal heruntergeladen - zuletzt: 9. April 2024, 03:47)
  • debug33.txt (16,9 kB - 464 mal heruntergeladen - zuletzt: 9. April 2024, 03:47)

MartinP Männlich

Meister

Registrierungsdatum: 13. März 2007

Beiträge: 690

Wohnort: Köln

2

Sonntag, 23. März 2008, 14:08

Hallo Gerasan,

nachdem ich mir deine Debugdaten angesehen habe ein Hinweis zu den Indikatoren.

Du verwendest den WekaFwdIndikator. Du machst 10 "Prognosen", aber wiederholst nicht.

Deine Experimente laufen "unabhängig" voneinander.

Du startest jedesmal neu. Und da ist natürlich der Periodenversatz drin. Jetzt verstehe ich dein Problem vielleicht.

Probiere statt dessen mal ein anderes Experiment und schau dir die Daten an.

Gleiche Rahmenbedingungen aber:

trainPerioden 10 (fürs Fehlersuchen besser weniger, dann bleibt es übersichtlicher)
testPerioden 4 (s.o.)
wiederholungen 3 (dies ist der entscheidene Punkt!!!)

Jetzt solltest du mit nur 3 Wiederholungen zusammen 3 * 4 = 12 Peridenen prognostizieren.
Und jetzt sollte ein neuer Effekt, nämlich eine Wiederholung auftreten. Zum Glück hast du den Filter auf Ohne gestellt, sonst würde der Normalisierungsalgorithmus zu unterschiedlichen Datenkonstellationen führen.

So wie du vorgehst wäre der WekaFwdIndikator komplett überflüssig. Denn er soll sich ja gerade um die Fortschreibung der Daten kümmern.

Viel Erfolg

Martin

Gerasan

unregistriert

3

Sonntag, 23. März 2008, 15:10

Sicher, für das "Experiment", sprich den Backtest, funktioniert die Reproduzierbarkeit wnderbar.
Für Datenfeed, sprich Realtrading, sind die Signale nur dann reproduzierbar, wenn Testperioden=1 ist.
Bei Testperioden > 1 springen die Signale.

Es wäre evt. möglich das zu ändern, wenn man einen Parameter dem Indikator mitgeben könnte, der den Starttermin der Datenreihe fixiert. Damit dann die Training und Testperioden sich nicht immer um eins weitershieben, sondern nur von Rechts angereichert werden.

Solnge das nicht geht, muß man beim Realtrading nur mit Testperioden = 1 arbeiten. Entsprechend auch das "Experiment"-Backtest müsste man sinnvollerweise auch mit der Einstellung Testperioden=1 machen.

Gerasan

unregistriert

4

Donnerstag, 27. März 2008, 22:44

wollte die Feststellung nochmal hervorheben:

Zitat

Solnge das nicht geht, muß man beim Realtrading nur mit Testperioden = 1 arbeiten. Entsprechend auch das "Experiment"-Backtest müsste man sinnvollerweise auch mit der Einstellung Testperioden=1 machen.

nach meinen Tests bestätigt sich die theoreretische Überlegung das alle Einstellungen außer der o.a. zur Diskrepanz zwischen Backtest und Trading führen. Einige hier im Forum haben doch mit dem Indikator experimentiert. Könnt ihr das bestätigen bzw. widerlegen?

Martin, kannst Du uns sagen, ob du erwägst einen weiteren Parameter zu implementieren, der auch für Trading den Anfang der Zeitreihe fixiert?

sven

unregistriert

5

Freitag, 28. März 2008, 08:14

Hallo Gerasan,

das Problem kannst du umgehen, wenn du den Indikator in eine Ref-Funktion packst.
Etwa so:
refvar( svm-indi , -mod( periodennr , tage_zu_handeln ) )

wobei ich nicht weiss, ob mal mit investoxboardmitteln an die periodennr kommt. Zur not mit eigenem VB-Indi.

Gruß
Sven

Gerasan

unregistriert

6

Freitag, 28. März 2008, 18:04

interessant! - ich versuche es mal. Danke für den Tipp. Werde das Ergebnis dann posten.

Gerasan

unregistriert

7

Samstag, 29. März 2008, 00:42

Hallo Sven,
mit deinem Vorschlag kann man das Signal die eingestellte Periodenanzahl halten, unabhängig von weiteren evt. entstandenen Signalen. Das geht mit dieser Funktion:

Quellcode

1
2
#_LoadGlobal signal#
RefVar(signal, -Mod(BarsSince(#_HS_Zeitraum KS#, 1), 5))

Das ist aber nicht das was ich meine. Ich möchte schon allen Signalen des WekaFwdIndikator's folgen. Der soll jedoch seine Trainigsperiode beim Realtrading nicht ständig um eine Periode vorschieben, sondern er soll genau wie im Backtest, die Trainingsperiode fix halten, bis die Testperiode die volle Anzahl Tage erreicht. Solange sie nicht erreicht ist, sollen die Signale basierend auf der in der fixen Tainingsperiode ermittelten Prognosefunktion für jede neu hinzukommende Periode berechnet werden. Ich versuche es mal anhand der Grafik darzustellen:
sei:
x=Periode
t=Trainingsperiode
p=prognoseperiode
Trainingsperioden seien auf 10 und testperioden auf 5 eingestellt.
jede Zeile kommit neue Periode im Realtrading hinzu
xxttttttttttp
xxttttttttttpp
xxttttttttttppp
xxttttttttttpppp
xxttttttttttppppp <= hier ist die volle Anzahl der Testperioden erreicht. Erst in der nächsten Zeile soll die Trainingsperiode weiterbewegt werden
xxxxxxxttttttttttp <= her wurden die Trainingsperioden witergeschoben und die Testperioden fangen von 1 neu an
xxxxxxxttttttttttpp
xxxxxxxttttttttttppp
xxxxxxxttttttttttpppp
xxxxxxxttttttttttppppp
xxxxxxxxxxxxxttttttttttp
xxxxxxxxxxxxxttttttttttpp
xxxxxxxxxxxxxttttttttttppp
xxxxxxxxxxxxxttttttttttpppp
xxxxxxxxxxxxxttttttttttppppp
m.E. nur in diesem Fall ist Backtest und Trading gleich bei der Einstellung Testperioden>1

MartinP Männlich

Meister

Registrierungsdatum: 13. März 2007

Beiträge: 690

Wohnort: Köln

8

Samstag, 29. März 2008, 13:38

Hallo Gerasan,

solange ich im Indi keinen festen Starttermin eingebaut habe fällt mir ein möglicher Workaround ein.

Das Problem ist, dass sich bei jeder neuen Periode das Traing um ein Periode versetzt beginnt. Dies hatte ich ursprünglich geplant, doch damals war die Parameterübergabe in Inv 5 nicht so flexibel wie jetzt (und in 4 würde es garnicht laufen).

Aber, was ist wenn du die Varibale Wiederholungen anpasst und in dieser einen Zähler einbaust.

Bsp. Du hast einen eigenen Indi der dir die Anzahl der seit einem Datum vergangenen Perioden ermittelt. Diesen Indi teilst du durch die Anzahl der Testperioden und nimmst den ganzzahligen Teil und verwendest diesen für den Parameter Wiederholungen. Dann sollte dein System dauerhaft bei genau dem gewünschten Tag losrechnen.

Viele Grüße

Martin

Gerasan

unregistriert

9

Sonntag, 30. März 2008, 01:22

Danke, ich werde es ausprobieren. :)

Gerasan

unregistriert

10

Sonntag, 30. März 2008, 13:04

Hallo Martin,
Variable Wiederholungen kann ich so berechnen:

Quellcode

1
global calc Wiederholungen: INT(BarsSince(#_HS_Zeitraum KS#, 1)/5);

Dadurch wird sie aber zu einer "Dateneihe". WekaFwdIndikator akzeptiert jedoch diese Variable nur als "Wert". Übergabe leider nicht möglich.

MartinP Männlich

Meister

Registrierungsdatum: 13. März 2007

Beiträge: 690

Wohnort: Köln

11

Sonntag, 30. März 2008, 13:29

Hallo Gerasan,

hast du vielleicht eine Idee wie denn in Investox ein Parameter für einen Indikator zu definieren ist damit er auch Varibalen akzeptiert? Der Aufruf des Indikators in Investox läßt sich ja leicht anpassen.

Viele Grüße

Martin

Gerasan

unregistriert

12

Sonntag, 30. März 2008, 21:15

Hallo Martin,
ich habe bereits versucht, den Parameter "Wiederholungen" in der Schnittstelle des Indkators WekaFwdIndikator auf Typ "Text" bzw. "Datenreihe" zu zu setzen. In beiden Fällen bekomme ich Fehler beim Aufruf des Indikators. Wenn Du eine Lösung kennst, sag sie soch einfach. Wozu in Rätzeln sprechen. Das Thema ist ohnehin komplex genug.

MartinP Männlich

Meister

Registrierungsdatum: 13. März 2007

Beiträge: 690

Wohnort: Köln

13

Montag, 31. März 2008, 15:02

Hallo Gerasan,

wenn ich die Lösung wüßte hätte ich sie bereits bekanntgegeben!

Da ich sie nicht weiß hatte ich bei dir nachgefragt, da du dich ja ebenfalls mit der Entwicklung von Indikatoren beschäftigst und so hatte ich die Hoffnung, dass du das Problem vielleicht an anderer Stelle gehabt hättest.

Ich weiß leider nicht wie ich in der DLL einen Parameter entgegennehmen muss damit dieser in Investox über eine Berechnung gesetzt werden kann.

Viele Grüße

Martin

Gerasan

unregistriert

14

Montag, 31. März 2008, 16:39

Ach so, sorry, das habe is missverstanden.
Klar ich kann dir heute abend hier das genaue Koding posten. Eine Berechnung kann sich ja im Gegensatz zu einem fixen Wert von Periode zu Periode ändern. Deswegen muß man so einen Parameter als Datenreihe im VB entgegennehmen. Die Datenreihen werden als single array's übergeben und über einen Zeiger referenziert. Etwa so: zum Beispiel dein dritter Parameter wäre eine Berechnung Wiederholungen in Investox:

Quellcode

1
global calc Wiederholungen: INT(BarsSince(#_HS_Zeitraum KS#, 1)/5);

In VB:

Quellcode

1
2
3
4
5
6
7
8
Dim Zeiger as String
Dim Wiederholungen( ) as Single
Zeiger = Parameter(3)
Wiederholungen = cDaten(Zeiger) 
...
'nun kannst Du auf die Werte des Array Wiederholungen zugreifen.
Dim Letzter_Wert_Wiederholungen as Integer
Letzter_Wert_Wiederholungen = Wiederholungen(1233) 'z.B.


außerdem muß man den Array um eine Periode verschieben wegen Unterschied VB6 und VB.NET
Heute abend poste ich hier details dazu.

Gerasan

unregistriert

15

Montag, 31. März 2008, 22:05

Hier ist ein Auszug aus dem Muster123.vb Quellcode:

- Zeiger und Array definieren

Quellcode

1
2
3
'Datenreihe die für Punkt P0 verwendet werden soll
Dim ZeigerAufP0Daten As String = Parameter(1)
Dim P0Daten(cDaten.UpperBound(ZeigerAufP0Daten) - 1) As Single


- Daten aus cDaten ins ZeigerAufP0Daten kopieren. Dabei Index um eins verschieben:

Quellcode

1
2
3
4
If cDaten.CopySingleFeldToAddress(ZeigerAufP0Daten, P0Daten(0), UBound(P0Daten) + 1) = False Then
            Calculate = ErrNoData
            Exit Function
        End If


Start und End-Index bestimmen. Hier wird er aus Closedaten bestimmt. Das setzt voraus das Closedaten zuvor impportiert wurden. Siehe dazu auch Beispiel-Indikator im Entwicklerkit. Theoretisch kann man Start und End-Index aus jeder importierten Datenreihe ermitteln, wenn man sicher ist, daß sie immer Werte für alle nötigen Perioden hat.
Mit den ermittelten Start und End-Index nun auch Grenzen für Deine Datenreihe setzen, hier P0Daten-Daten.

Quellcode

1
2
3
4
5
6
7
8
''''''' Den Start- und Endindex für die Berechnung suchen:
        StartI = LBound(CloseDaten)
        EndI = UBound(CloseDaten)

        If SetzeGrenzen(P0Daten, StartI, EndI) <> True Then
            Calculate = ErrNoData
            Exit Function
        End If


Kopiere einfach alle diese Funktionen in din Projekt und ersetze die Variablen sinngemäß. Anschließend, nach diesem Koding kann man die Importierte Datenreihe verwenden. In userem Fall wäre immer der aktuelle Wert der Datenreihe Wiederholungen (in diesem Beispiel P0Daten) interessant. Du kannst ihn in den Berechnungen als Wiederholungen(EndI) ansprechen.
Ich hoffe das hilft.

MartinP Männlich

Meister

Registrierungsdatum: 13. März 2007

Beiträge: 690

Wohnort: Köln

16

Donnerstag, 3. April 2008, 20:13

Hallo Gerasan,

danke für den Code.

Ich hab mal probiert bei mir etwas vergleichbares einzubauen. Es klappt, aber ich muss dann den Parameter wiederholungen auf den Typ "Datenreihe" setzen. Und damit ist die Vorbelegung futsch.

Aus Sicht der Entwicklung wäre es mir deutlich lieber weiterhin mit der bisherigen sauberen Typisierung zu arbeiten. Diese kann man z.B. beim Robustheitstest sauber auswerten. Und man macht bei der Verwendung weniger Fehler.

Hast du eine Idee?

Viele Grüße

Martin

Gerasan

unregistriert

17

Freitag, 4. April 2008, 09:29

ja. Du hast doch intern einen Startpunkt ausgerechnet. Man könnte eben intern diesen deinen Vorschlag mit Modulo

Quellcode

1
INT(Perioden seit Startpunkt)/Testperioden);

verwenden, und solange das Ergebnis < Testperioden ist, auf's Traning zu verzichten, sondern die alte Prognosefunktion verwenden.

Ich schreibe Dir was per Email.