Filtersystem

Inhaltsverzeichnis:

Zielsetzung

Der Filter in SHAREholder ist ein Filtersystem, dass die Eingrenzung von Werten auf Basis von Kriterien erlaubt. Als Kriterien sind alle Stammdaten & Technische-Indikatoren in beliebigen Kombinationen umsetzbar. Die Ergebnisliste wird in speziellen Beobachtungslisten zur weiteren Bearbeitung gespeichert. Die Filter sollen somit die Screening und das Scannen von interessanten Titeln am Markt unterstützen. Eine Kauf/Verkaufsentscheidung muss aber vom Anleger selbst getroffen werden.

Zusammenspiel mit Handelssystem

Der Filter wird dabei bewertet anhand eines Handelssystems, was eine Beurteilung eines Filtersystems ja erst zulässt. Ein definierter Filterbaum wird dabei im historischen Kurskontext auf seine Zuverlässigkeit und seine Performance geprüft. Die Kriterien des Handelssystem z.B. wann Titel der Ergebnisliste eines Filter tatsächlich gekauft werden und wieder verkauft werden, werden zusammen mit einem Filter definiert.Durch die Bewertung eines Filtersystems ist auch deren zukünftige Optimierung mittels Genetischen Algorithmen möglich. Die notwendige Vorraussetzung der Bewertbarkeit einer "Population/Individium" ist durch die Verwendung des Handelssystems gegeben.

Aufbereitung und Nutzung


Die Darstellung und Nutzung der eingerichteten Filter findet sich unter dem Hauptreiter "Filter". Um einen Filter zu starten müssen folgende Schritte gemacht werden:

  1. Selektion des gewünschten Filters in der Toolbar oben
  2. Entscheidung ob die Ergebnisse des Filters als gleichnamige *Watchliste abgespeichert werden sollen. Ein Häkchen in der Toolbar hierfür ist ausreichend
  3. Start mit Button "Starten"

Nach Auswahl erfolgt die Berechnung und Darstellung der gefundenen Werte im unteren Bereich. Zur Verbesserung der Übersicht wird auch immer der zugehörige Funktionsbaum dargestellt. Änderungen am Filter können jederzeit über Aufruf der Filter-Einstellungs-Masken mit der Funktionstaste <F12> oder übers Hauptmenü Analyse/Filter-System aufgerufen werden.

Nach der Berechnung der Signale/Filter werden alle gefundenen Werte gelistet und mit folgenden Werten dargestellt:

  • Bezeichnung/WKN/Zeit/Candle/Kurs/Stops
  • Ranking (Bewertungsfunktion im DynFilter)

Die Darstellung erfolgt in 3 Abschnitten

  1. Logausgaben
  2. Filter bzw. den Bedingungsbaum
  3. Filterergebnisse

Jedes der Elemente kann durch Doppelklick auf die Titelleiste ein-und ausgeblendet werden. Hier im Beispiel sind die Logausgaben ausgeblendet.

Loglevel

Grundsätzlich werden alle Logausgaben in einer Logdatei mitgeschrieben. Diese kann jederzeit über die Toolbar mit "Logdatei öffnen" geöffnet werden. Parallel steht direkt im Frontend ein Live-Log zur Verfügung der während der Bearbeitung eines Filters alle Ausgaben anzeigt. Welchen Detailgrad die Ausgaben haben wird über den Log-Level in der Toolbar festgelegt.

Ausgangsüberlegungen

Ein Filter setzt sich aus den Bedingungen und den in einer Bedingung genutzten Vergleichswerten inkl.- Funktionen zusammen. Jede Einzelbedingung muss jedoch immer ein Wahrheitswert ergeben, d.h. Aussagen von wahr oder falsch ergeben. In einem Bedingungsbaum können die Einzelbedingungen mit UND, ODER, UND NICHT, Exklusives ODER (genau eine der Aussage muss wahr sein) verknüpft werden. Als Suchbasis dienen alle verfügbaren Papiere. Das Filtersystem zeigt sich somit komplett unabhängig von vorherigen Filterkriterien z.B. von Watchlisten oder Markteinstellungen und zwingt somit den User jedes verwendete Kriterien zu definieren und genau darüber nachzudenken.

Allgemeine Voraussetzungen:

  • Das System soll den Semiprofessionalen Anleger bei der Anlageentscheidung unterstützen.
  • Der Erfolg des Systems setzt eine Diziplin des Anwenders voraus insb. bei der Ausführung von Verkaufsorders, da sonst das System nicht nachvollziehbar validierbar ist.

Weitere Ausgangsvoraussetzungen für die Nutzung in einem Handelssystem

  • Die Strategie baut auf eine Form des Performancetradings auf, d.h. Ziel ist es unter Abzug von Transaktionskosten und Slippageverlusten einen maximalen Gewinn zu erzielen .
  • Es können, da hauptsächlich am Europäischen Markt gehandelt werden soll, nur Longpositionen eingegangen werden. Shortpositionen werden nicht berücksichtigt bzw. berechnet.
    Nach der Erzeugung eines Kaufsignals durch das Handelssystem ist die Position als Wahlentscheidung zwischen:
  • Eingehen der Position auf Basis der Schlußauktion (Close der gleichen Periode)
  • Eingehen der Position auf Basis des Eröffnungskurses des nächsten Tages (Open)
  • Eingehen der Positon auf Basis des Anfangshandels, wenn das Signal bestätigt wird, d.h. der Eröffnungskurs liegt über dem Schlußkurs des Vortages. Die Realisierung kann mittels Stop-Buy begrenzt auf den entsprechenden Handelstag erfolgen.
    Die Realisierung des Handelssystems setzt kein Vollzeitaktivität des Anwenders voraus, verlangt aber eine Prüfung der Stopkurse (Trailing-Stops) auf noch nicht geschlossene Systeme kurz vor bzw. nach Handelsende (je nach Basis: Open/Close)
  • Ein Engagement des Anlegers darf nur erfolgen, wenn Möglichkeiten zum Verkauf auf Tagesbasis gegeben sind, d.h. im Urlaub sollten keine Positionen ohne gesetztem Stop eingegangen werden. Hoffnungsansätze sind verboten, d.h. das System muss Anwendung finden (können).

Außerhalb dieser Überlegung gibt es bereits ein Produkt das diese Teilmenge der Problematik bereits sehr gut löst, allerdings sehr stark im professionalen Segment (Preissegment) angesiedelt ist. Hier können über das bisher vorgeschlagene Konzept hinaus auch gezielt Future Trades, Put/Call-Scheine und Short-Positionen berücksichtigt werden. Die Kursdatenversorgung kann zudem mit fast allen gängigen Kursanbietern erfolgen.

Warum soll ein neues System bereitgestellt werden, wenn es bereits ein Produkt gibt, was die Anforderungen weitgehend erfüllen kann? Zum einen ist hier die Preispolitik ein entscheidener Faktor. Ebenso sind insb. die Candlestickformationen und eine Reihe von Indikatoren nicht im entsprechenden Maße abgedeckt, wie ich es mir vorstelle; ebenso wie eine Reihe von Unternehmensdaten. Dies ist jedoch meine subjektive Meinung, da es durchaus für einige Anleger entsprechend Gegenargumente geben kann.

Arbeitsschritte

Die Bearbeitung von Filtern erfolgt unter Analyse / Filter-System. Der Shortcut hierzu ist <F12>. Alle folgenden Hinweise beziehen sich auf die Masken.

Anlegen eines Filters

In SHAREholder können beliebig viele Filter angelegt werden. Um einen neuen Filter anzulegen, muss mit dem Button "Hinzufügen" ein neuer Grundeintrag erzeugt werden. Es wird dabei automatisch die Frage gestellt, ob die Bedingungen aus dem aktuell selektierten Knoten übernommen werden sollen. Damit lassen sich dann leicht auch Kopien anfertigen.

Bearbeiten der Bedingungen eines Filters (Bedingungsbaum)

Jeder Filter besitzt einen Entscheidungsbaum, der alle Bedingungen in Beziehung zueinander setzt. Dabei sind als Verknüpfungstypen grundsätzlich

  • UND
  • ODER
  • NOT (darf nicht)
  • XOR (Exklusives ODER und somit muss genau 1 Werte wahr sein)
    erlaubt.

Der Bedingungsbaum verknüpft damit logisch Einzelbedingungen miteinander. Dies erfolgt in einer Baumansicht. So wird semantisch immer eine Verknüpfungstyp wie "UND" / "ODER" als Vater definiert und darunter die zu verknüpfenden Bedingungen z.B.

  • AND
    • 1. Bedingung
    • 2. Bedingung
    • n. Bedingung

Die grundsätzliche Verarbeitung erfolgt dabei von oben nach unten. Die Reihenfolge ist damit entscheidend für die Verarbeitungsgeschwindigkeit eines Filters. Die Reihenfolge wird deshalb automatisch mit jedem vollständigen Suchvorgang optimiert anhand der statistischen Wahrscheinlichkeit P(error). Dabei gilt, dass Bedingungen mit hoher Ausfallwahrscheinlichkeit an den Anfang eines Zweiges gesetzt werden bei UND - Bedingungen, bei OR entsprechend die Bedingungen die eine hohe Trefferwahrscheinlichkeit haben. Somit erfolgt die Präferenzbildung immer auf Basis einer möglichst schnellen Abwicklung des Zweiges festgelegt durch den Verknüpfungstyp .

Da jeder Filter durchaus mehere Ergebniswerte zurückliefern kann, wird bei jedem Filter eine Rankingfunktion gesetzt, die die Sortierung der Ergebnisse erlaubt. Sie wird damit zu einer Bewertungsfunktion und führt zu einem Ranking innerhalb der Liste. Es kann pro Filter dabei immer nur eine Rankingfunktion geben. Müssen zwei verschiedene Funktionswerte genutzt werden, so muss ein mathematischer sinnvoller Ausdruck gefunden werden, der beide verknüpft.

Bedeutung hat dies entweder innerhalb einer persönlichen Rankingfunktion (manuellen) aber auch einer objektiven bei der Nutzung innerhalb eines Handelssystems. Hier werden die Positionen in der Ranking-Reihenfolge eingegangen, solange ausreichend Handelskapital zum Entscheidungstag zur Verfügung steht entsprechend den Einstellungen für die max. Kapitalsumme pro Position. Als Beispiel:

  1. 1. Position entsprechend 1. Rankingposition mit 40% Kapitalsumme
  2. 2. Position entsprechend 2. Rankingposition mit 40% Kapitalsumme
  3. 3. Position wird nicht mehr eingegangen, da die Mindestanalagesumme nicht mehr zum Handelstag zur Verfügung steht.

Anlegen und Editieren einer Bedingung

Das Editieren einer Einzelbedingung erfolgt ausgehend vom Entscheidungsbaum im Editor "Einzelbedingung". Dieser arbeitet mit einer Autosuchfunktion, womit der User beliebige Variablen oder Funktionen eintippen kann und das System zeigt noch alle passenden Werte in einer Baumstruktur (Funktion) bzw. Listenansicht (Variablen) an. Die Validierung und Prüfung der Gültigkeit der aktuellen Eingabe wird fortwährend vom System vorgenommen. Grundsätzlich unterscheidet das System praktisch nur zwischen Mathematischen Ausdrücken und Patterns. Patterns meinen dabei beliebige Zeichenkettenvergleiche verbunden mit Oder | und Und & Vergleichen z.B. Markt='Ne*'|Markt='Nasdaq*'. Erlaubt eine Funktion Parameter, so werden diese in einem seperaten Fenster abgefragt und dann als Ausdruck im Editor hinterlegt/angezeigt.

Die Einzelbedingungen werden vom System automatisch optimiert in ihrer Reihenfolge hinterlegt bei jeder Nutzung des Filters, d.h. Aussschlusskriterien mit hoher Wahrscheinlichkeit bei den bisherigen Prüfungen werden zuerst berücksichtigt, so d. alle nachfolgenden Berechnungen/Prüfungen nicht mehr notwendig werden.

Eine Einzeloptimierung der Parameter von Funktionen insb. der Technischen Indikatoren ist vorgesehen, jedoch noch nicht realisiert, da hierzu das Handelssystem erst fertiggestellt und optimiert werden muss.

Bedingungen sind entweder in mathematischer Form oder als Pattern zu formulieren. Hierbei entscheidet das Programm automatisch, wann welche Form genutzt wird, anhand der bisher genutzten Ausdrücke, Funktionen oder Variablen.


Verwendbare Filterkriterien bzw. Funktionen


Datenfelder und KennzahlenWeitere Details
Aktienstammdaten / Unternehmens-Stammdaten und Unternehmens-Kennzahlen

siehe Reguläre Expressions für Text-Stammdaten wie Notizen, Name, Markt etc.

Alle in SHAREholder bekannten Kennzahlen sind auch im Filter nutzbar.

  • KGV(Basisjahr) : Kurs Gewinn Verhältnis des Basisjahres (1-nächste,0-aktuelle)
  • KBV : Kurs Buchverhältnis
  • KCV : Kurs Cashflow - Verhältnis
  • UMK : Umsatz Kursverhältnis
  • Buchwert
  • Cashflow
  • Aktienstueckzahl
  • Umsatz
  • Gewinn(Basisjahr) : Gewinn des Basisjahres (1-nächste,0-aktuelle)
  • Dividende(Basisjahr): Dividende des Basisjahres (1-nächste,0-aktuelle)e
  • PEG(Basisjahr) : Gewinnwachstum des Basisjahres (1-nächste,0-aktuelle) 
  • DivR: Dividendenrendite
Technische Indikatoren und dessen Kauf-Verkaufssignalesiehe Indikatoren-Funktionen in Filtern nutzen
Mathematische und Logische Basisfunktionen 

Einige mathematische und logische Basisfunktionen:

  • SQR(x) Quadrat X
  • SIN(x) Die Funktion Sin berechnet den Sinus eines Winkels.
  • COS(x) Die Funktion Cos berechnet den Cosinus eines Winkels im Bogenmaß
  • ATAN(x) Die Funktion ArcTan berechnet den Arcustangens einer bestimmten Zahl.
  • SINH(x) Die Funktion ArcSin berechnet den inversen Sinus einer bestimmten Zahl.
  • COSH(x) ArcCos berechnet den inversen Cosinus einer bestimmten Zahl.
  • COTAN(x) Die Funktion Cotan berechnet den Cotangens eines Winkels (Intern wird 1 / Tan(X) gerechnet)
  • TAN(x) Tan berechnet den Tangens von X.
  • EXP(x) Die Funktion Exp gibt die Potenz von X zurück.
  • LN(x) Die Funktion Ln gibt den natürlichen Logarithmus eines Real-Ausdrucks zurück (Ln(e) = 1)
  • LOG(x) Logarithmus zur Basis 10
  • SQRT(x) Wurzel x
  • ABS(x) Die Funktion Abs gibt einen absoluten Wert zurück.
  • SIGN(x) Vorzeichen (-1,1,0)
  • TRUNC(x) Abschneiden der Nachkommastellen
  • CEIL(x) Ceil rundet den Wert einer Variablen auf z.B. Ceil(-2.8) = -2; Ceil(2.8) = 3; Ceil(-1.0) = -1
  • FLOOR(x) Floor rundet Variablen ab z.B. Floor(-2.8) = -3; Floor(2.8) = 2; Floor(-1.0) = -1
  • RND() Die Funktion Random erzeugt eine Zufallszahl innerhalb eines bestimmten Bereichs.
  • RANDOM() Initlisierung für die Nutzung von Zufallszahlen
  • INTPOW(x,y) IntPower errechnet die Potenz aus einer Basis.
  • POW(x,y) Power errechnet aus der Basis Base und dem beliebigen Wert Exponent die Potenz.
  • LOGN(x,y) LogN berechnet den Logarithmus X zur angegebenen Basis.
  • MIN(x,y) Minium von X, Y
  • MAX(x,y) Maximum von X,Y
  • IF(A,B,C) Wenn A>0 dann B sonst C
Kursdaten

Es gibt für den Zugriff auf Kursdaten zwei relevante Funktionen:

  • Intraday(<baiswert>,<kurstyp>)
  • History(<basiswert>,<kurstyp>,<Heute-X-Zeitpunkt>)

Der Basiswert (Bezugswert für die Auswertung) ist im Normalfall mit "varAll" belegt und somit innerhalb einer Suchliste variabel, d.h. es wird immer der aktuelle Titel als Basiswert gesetzt und kein fixer Titel. Es ist aber auch möglich z.B. den TecDAX mit seiner (!)WKN zu verwenden "Intraday(<TECDAX-WKN>,<KursTyp>)" und hier einzusetzen. Es ist somit der betrachtete Wert unbestimmt mit varAll oder bereits vorbelegt mit der WKN nutzbar. Das Prinzip ist so für alle vorhandenen Funktionen übertragbar.


Als Kurstypen (<kurstyp>) sind erlaubt (O-1,H-2,L-3,C-4,V-5,D-8). Um die Schreibweise leserlicher zu machen (statt der Zahlenwerte), gibt es korrespendierende Konstanten: 
varKOpen, varKHigh, varKLow, varKClose, varKVolumen, varKDatum.

Um die Lesbarkeit zu behalten, sollten diese wenn möglich auch immer verwendet werden. Diese werden aber nicht erzwungen. Intraday gibt dabei immer den aktuellen interen Tageskurs zurück. Liegen noch keine aktuellen Daten vor, wird der letzte bekannte Wert zurückgegeben. Der Wert entspricht immer der Anzeige in den Kurslisten unter AK (Aktuellem Kurs).

Heute-X-Zeitpunkt für History

History besitzt ein Parameter der bei 0 beginnt zu zählen, d.h. mit 0 : Tageswert und somit = Intraday entsprechend dem gewählten Kurstyp z.B.

  • History(varAll,varKClose,0) - Heutiger Schlusskurs bzw. letzter AK von heute.
  • History(varAll,varKClose,-1) - Vortageswert
  • History(varAll,varKClose,-2) - Vorgestern
    usw.

Logisch ist damit

  • History(<basiswert>,<kurstyp>,0) = Intraday(<basiswert>,<kurstyp>)


Ebenfalls verwendet werden kann für die Rückgabe von Kursdaten. Hierbei kann jedoch auf keinen Fremdtitel referenziert werden, sondern es wird im Filter immer der jeweilige aktuell geprüfte Titel verwendet im Filter-Durchlauf:

RasInt und RasHis(O|H|L|C|V|Min|Max) wobei die Felder als Zeit oder Indexfelder verwendet werden können

  • z.B. RasHisC(-2) gibt den Schlusskurs von vor 2 Handelstagen wieder
  • z.B. RasHisMax(-5) gibt den Höchstkurs der letzten 5 Handelstage wieder


HistoryCount() gibt die Anzahl der vorhandenen Kursdaten auf Schluss-Kurs-Basis zurück. Dies soll vor allem dem herausfiltern von Titeln dienen, die keine ausreichende Kursbasis haben.

Nutzung der Ergebnisse eines anderen Filters (SubFilter)

Die Bedingungen in einem DynFilter können zusätzlich strukturiert werden innerhalb von Sub-Filtern, d.h. es können definierte Filter in anderen Filtern aufgerufen werden. Dieser Aufruf darf nicht rekursiv erfolgen.

Die Berechnung des Subfilters erfolgt zu dem Zeitpunkt der ersten Nutzung innerhalb eines Bedingungsbaumes, sofern dies logisch notwendig ist (wenn die vorherigen AND Bedingungen nicht erfüllt werden können, kommt es zu keinem Aufruf der Funktion). Die Ergebnisse des Filters werden zwischengespeichert, so dass ein nochmaliger Zugriff nicht zu einer kompletten Neuberechnung führt.

Die Zugriffsfunktionen sind:

  • SubFilter(ID des Filters,varAll,Ergebniswert)

Als Ergebniswerte eines Subfilters sind definiert:

  • varFilterRanking - Rückgabe des Rankingwertes des betrachteten Basistitels
  • varFilterExists - 1 wenn existiert
  • varFilterPos - Position in der Ergebnismenge auf Basis der sortierten Liste mittels der Rankingfunktion
    zulässig.

Somit läßt sich sowohl die Position als auch die Existenz eines Wertes in einem anderen Filter ermitteln. Auch die Auswertung auf Basis eines bestehenden Rankings ist möglich.

Datumsfunktionen
  • toDate(DD,MM,YYYY): EXTENTED
  • toTime(HH,MI): EXTENTED (Nachkommastelle)
  • BaseDATE(<basis-verschiebung>) : EXTENTED,
  • FirstEOD: EXTENDED, womit der erste Kurs des Bastitels ermitteln wird und ein Vergleich zur Prüfung einer ausreichenden Kursbasis möglich wird z.B. FirstEOD<toDate(01,01,2000) möglich wird

wobei <basis-verschiebung> zwischen -3000 und 3000 liegen kann und sich auf das aktuell Datum bezieht


Optimierung

Zur Zeit gibt es nur eine Variante eines automatischen Brute-Force-Optimierungsalgorithmus, d.h. es wird der Filter komplett berechnet mit vollständiger Auswertung aller logischen Ausdrücke (auch wenn logisch bereits klar ist, dass der Gesamtausdruck festgelegt ist wahr/falsch). Somit werden die Laufzeiten und die Gesamt-Aufrufe der Einzelbedingungen festgestellt.

Jede Einzelbedingung wird bewertet mit

  • Zeitbedarf x Aufrufe

Alle Einzelbedingungen können so sortiert werden nach logischem Ausschluß. Hierbei werden die Bedingungen, die ein sehr hohen "Aufwand" produzieren innerhalb eines Teilbaumes nach hinten sortiert. In der Praxis können so die weniger ressourcenhungrigen Bedingungen zuerst berechnet werden um dann (wenn noch notwendig) die weiteren Bedingungen auszuwerten.

In der Summe sollte so ein erstellter Filter immer durch das System optimiert werden. Eine manuelle Änderung der Reihenfolge der Einzelbedingungen innerhalb eines Teilbaumes ist zur Zeit vorgesehen, jedoch noch nicht integriert.

Bewertung eines Filters mit Handelssystem

siehe /wiki/spaces/SHARPUB/pages/1605507