Aktualisierung und Quellen für Fundamentaldaten
Grundlage jeder guten Handelsstrategie ist eine fundierte und vollständige Datenbasis. Insb. die Susan Levermann Strategie baut dabei sehr stark auf Fundamentaldaten, die so auch gesichert abgeglichen werden müssen. Shareholder bietet verschiedene Optionen:
- Abgleich über die Börse-Online-Statistiken mit dem notwendigen BO-Interactive-Zugriff der mit einem Zeitungs-Abo gegeben wird (siehe https://premium.finanzenverlag.de/boerse-online/bo-data-interactive)
siehe auch Import von Börse-Online-Statistiken - Abgleich über die Tai-Pan Schnittstellen mit dem notwendigen Daten-Abo über Lenz&Partner (siehe https://www.lp-software.de/shareholder/abonnements_bestellen.html)
siehe auch Tai-Pan Fundamentaldaten
Um hier eine weitere kostenlose Möglichkeit zur Aktualisierung der enorm relevanten Aktien-Stammdaten wie GuV, Kennzahlen und Statistiken, sowie Analystenbetrachtungen zu realisieren, steht ebenfalls ein Fundamentaldatenabgleich über freie Internetangebote oder API-Datenabrufe zur Verfügung.
Technisch werden hierbei in einer Konfigurationsdatei (INI) die Basis-Adresssen (URLs) und zugehörige Ausdrücke (RegEx) definiert, die die zu verwendenden Informationen extrahieren und in in die Shareholder-Datenbank übernehmen.
Anwendung
Die Nutzung ist einheitlich über die Tool-Leiste innerhalb des Depots oder innerhalb der Detaillisten geregelt. Wie auch bei der Kursaktualisierung wird immer die aktuell sichtbare Liste für den Aktualisierungsumfang verwendet. So werden innerhalb des Depots alle Depotwerte und bei von Watchlisten alle aktuell Watchlisteneinträge für die Aktualisierung verwendet. Das gleiche gilt für Detaillisten.
Die Nutzung des Fundamental-Datenabgleichs ist der Profiversion vorbehalten! Zudem werden die Fundamentaldatenbank-Konfigurationen als eigene Zusatzmodule angeboten. In der Standardauslieferung ist die Funktionsweise nur angedeutet und nicht vollständig. Dieses Vorgehen soll sicherstellen, dass ein dauerhafter Support gewährleistet werden kann, da diese Konfigurationen wartungsintensiv sind.
Nach dem Start werden alle ausgewählten Aktien einzeln aktualisiert entsprechend dem konfigurierten Setup. Notwendige Variablen werden dabei automatisch aufgelöst und sind mit { } gekennzeichnet. Jede aufgerufene URL wird dabei gesondert angezeigt und fett markiert. Alle nachfolgenden Ausdrücke (Expressions) beziehen sich dabei immer auf den zurückgegebenen Inhalt der URL. Es werden dabei auch Seiten (paging)-Operationen unterstützt d.h. es kann zwischen verschiedenen Seiten technisch geblättert werden z.B. um für 2012-2017 und 2006-2011 die Daten abzurufen. Dabei können nicht nur Einzelwerte abgerufen werden, sondern auch Unternehmensdaten in "Jahres-Spalten" (siehe z.B. Avira).
Der nachfolgende Screenshot zeigt sehr gut das Vorgehen und die Möglichkeiten:
- Mit den ersten zwei Zeilen wird der verwendete Modus d.h. ReadOnly und Debug angezeigt. Die Einstellungen erfolgen zusammen mit allen anderen Einstellungen direkt in der zugehörigen Konfigurationsdatei, die für die Aktie verwendet werden soll. Die Einstellung erfolgt dabei über die Aktualisierungsgruppen.
- Mit der fett dargestellten URL-Zeile beginnt der Datenabruf einer Zieladresse (hier ariva-search) und der nachfolgenden Datenzuordnungen auf Basis der abgerufene Inhalte/HTMl-Seite. Hier wird konkret mit {ArivaID} das Ariva-Search-Ergebnis-Seite genutzt, um eine Variable zu setzen, die für nachfolgende URL-Datenabrufe genutzt werden kann. Dabei können Zieladressen zusammengesetzt werden und Variablen beinhalten.
- Ab der Zeile "Jahr" wird eine Tabelle oder eine Griddarstellung aufgelöst in eine Art "Matrix" d.h. die Spaltenköpfe initialisieren eine entsprechende Matrix, die dann mit den nachfolgende Zeilen gefüllt werden kann. Dies funktioniert inkl. einem Paging-Ansatz d.h. kann mehrere Datenseiten beinhalten die auf der Orginal-Website mit "Vor" und "Zurück" dargestellt sind.
Debug-Mode und Entwicklungs-Optionen
Im Dialog kann über die untere Toolleiste ein Debug-Mode aktiviert werden. Dies bewirkt, dass jede Aktie einzeln aufgelöst wird und erst mit "Starten/Weiter" der nächste Durchlauf erfolgt. Als weitere Option besteht mit "Wiederholen" die Möglichkeit einen Durchlauf für den aktuellen Titel zu wiederholen. Dies ist insb. in der Konfigurationsphase hoch relevant, da im Hintergrund die Daten geändert werden können und mit Wiederholen bereits ein Testlauf erfolgen kann ohne ständig die Dialoge zu wechseln.
Einrichtung und Konfiguration
Im \Daten-Verzeichnis (Hilfe / Infos / Öffne Datenverzeichnis) können verschiedene Konfigurationsdateien abgelegt werden mit einem festen Namensschema: "Internet.Fundamental-Data-*.ini".
Diese Konfigurationen können dabei in den Aktualisierungsgruppen zugeordnet werden. Mit der Zuordnung ist es möglich analog zu den Kursaktualisierungen auch Aktualisierungen für Fundamentaldaten zu verwenden. Dies orientieren sich vollständig an den Konfigurationen in der Konfigurationsdatei.
Einstellungen
Spezial-Attribute
|
Ausprägungen
|
|
---|---|---|
@include |
<String> Fügt ein Segment oder eine komplette Definition von einer anderen Datei ein. Damit können Definitions-Dubletten komplett vermieden werden
|
|
debug |
<True|False> Wenn aktiviert wird:
|
|
readonly |
<True|False> Wenn "False" definiert, werden:
|
|
decimalseperator |
<Char> Für die Interpreation für alle Zahlenwerte wird diese Definition verwendet:
|
|
disablerefreshifconditions | <True|False> | |
Caching | ||
url |
|
|
url.refreshif.anyfieldisempty |
Wichtig ist die Definition vor der eigentlichen URL-Definition zu setzen! Für Array-Definitionen kann in Klammern das gewünschte Geschäftsjahr geschrieben werden z.B. [ 2020 ]
|
|
url..refreshif.mindayssincelastupdate | ||
url.refreshif.maxdayssincelastupdate | ||
Verhalten | ||
RegEx.Settings |
|
|
Datenabruf | ||
url |
Als Variablen dürfen alle internen Internet-Variablen genutzt werden in { } Klammern ebens wie ISIN, WKN
|
|
url.paging |
|
|
url.startpaging |
Keine weiteren Parameter notwendig, da nur die Position verwendet wird. Der mit startpaging und endpaging definierte Block wird durch "paging" effektiv als URL angefragt und dann mit allen Teilelementen aufgelöst. |
|
url.endpaging | Keine weiteren Parameter notwendig, da nur die Position verwendet wird (s.o.) | |
Wert-Attribute | ||
<key>.removespaces |
|
|
<key>.umrechnungsfaktor |
Nur für Anzahl-Aktien relevant z.B. um Anzahl-Aktien in Mio. umzurechnen. Intern werden <Int64> Zahlwerte verwendet.
|
|
<key>.datumsformat |
Nur für Datumsformate interessant
|
|
Ausprägungen für Aktualisierungen | ||
anzahl-aktien | <integer> | |
notizen |
<string>
|
|
fullname | <string> | |
shortname | <string> | |
wkn | <wkn> | |
wpart | <wertpapierart> - Zuordnung über Name | |
isin | <isin> | |
basiswertisin | <string> | |
logo-url | <string> | |
ir-weblink | <string> | |
weblink | <string> | |
x-analysten-buy | <int> | |
x-analysten-hold | <int> | |
x-analysten-sell | <int> | |
land | <string> | |
branche | <string> | |
tätigkeitsbereich | <string> | |
bilanzierungsmethode | <string> | |
mitarbeiter | <double> - Array basierend auf dem durch Jahr definierten Array | |
währung | <string> - Zuordnung durch Short-Name | |
ende-fiskaljahr | <string> als Datum | |
hv-termin |
<string> als Datum
|
|
letzter-quartalsberichtszeitpunkt | <string> als Datum | |
kommender-quartalsberichtszeitpunkt | <string> als Datum | |
streubesitz-in% | <double> | |
verschuldungsgrad-in% | <double> | |
Array-Definitionen d.h. Definitionen pro Jahr z.B. Gewinn pro Jahr | ||
jahr |
<int> - Array was nachfolgende Feldzuordnungen erlaubt
|
|
umsatz | <double> - Array basierend auf dem durch Jahr definierten Array | |
ebit | <double> - Array basierend auf dem durch Jahr definierten Array | |
gewinn | <double> - Array basierend auf dem durch Jahr definierten Array | |
buchwert | <double> - Array basierend auf dem durch Jahr definierten Array | |
cashflow | <double> - Array basierend auf dem durch Jahr definierten Array | |
dividende | <double> - Array basierend auf dem durch Jahr definierten Array | |
jahresueberschuss-in-Mio | <double> - Array basierend auf dem durch Jahr definierten Array | |
bilanzsumme-in-mio | <double> - Array basierend auf dem durch Jahr definierten Array | |
liquide-mittel-in-mio | <double> - Array basierend auf dem durch Jahr definierten Array | |
eigenkapital-in-mio | <double> - Array basierend auf dem durch Jahr definierten Array | |
cashflow-in-mio | <double> - Array basierend auf dem durch Jahr definierten Array | |
dilutedEPS | <double> - Array basierend auf dem durch Jahr definierten Array | |
Array-Definitionen als ... pro Aktie | ||
Gewinn-pro-Aktie |
|
|
Cashflow-pro-Aktie | ||
Dividende-pro-Aktie | ||
Buchwert-pro-Aktie | ||
Variablen | ||
{<Variablen-Name>} = <Wert> |
Setzen einer beliebigen Variable
|
URL=https://www.ariva.de/{WebArivaID}/bilanz-guv
URL=https://www.ariva.de/search/search.m?searchname={ISIN}
URL=http://www.stockpup.com/data/{RIC[isin]}_quarterly_financial_data.csv
Beispiel-Konfiguration "Internet.Fundamental-Data-Template.ini"
Nachfolgend eine Beispiel-Konfiguration die so im \Daten-Verzeichnis abgelegt werden könnte.
# Reine Template-Version, die jedoch alle typischen Kombinationen aufnimmt und als Beispiel-Referenz dienen sollte
# Status: INIT-Version
# History: 04.10.2017: Initialversion inkl. der neuen Stammdaten aus der 13.12.2 Version (04.10.2017)
[Development-Settings]
# debug true(default)|false
debug=true
# readonly true(default)|false
readonly=false
[RegEx-Settings]
# Optionale Einstellungen für die Perl-Expressions
# TPerlRegExOptions = set of (
# preCaseLess, // /i -> Case insensitive
# preMultiLine, // /m -> ^ and $ also match before/after a newline, not just at the beginning and the end of the string
# preSingleLine, // /s -> Dot matches any character, including \n (newline). Otherwise, it matches anything except \n
# preExtended, // /x -> Allow regex to contain extra whitespace, newlines and Perl-style comments, all of which will be filtered out
# preAnchored, // /A -> Successful match can only occur at the start of the subject or right after the previous match
# preUnGreedy, // Repeat operators (+, *, ?) are not greedy by default (i.e. they try to match the minimum number of characters instead of the maximum)
# preNoAutoCapture // (group) is a non-capturing group; only named groups capture
# );
RegEx.Settings=[preCaseLess, preSingleLine, preUnGreedy]
[Variablen]
# Das Dezimaltrennzeichen kann jederzeit neu gesetzt werden und ist dann fortan gültig
decimalseperator=,
# URLS können abhängig von dem letzten Aktualisierungszeitpunkt aufgerufen werden, um unnötige Aktualisierungen zu vermeiden
URL.RefreshIf.MinDaysSinceLastUpdate=7
# AnyFields enthält per Komma getrennt alle Stammdaten-Felder/Variablen die geprüft werden sollen, ob diese leer sind. Nur wenn dies der Fall ist, erfolgt die URL-Auflösung.
# Die Verarbeitung erfolgt dann erst beim nächstfolgenden URL-Request. Variablen werden dabei ohne { aufgeschrieben. Stammdaten-Felder werden analog der normalen Schreibweise
# vor dem = Zeichen aufgeschrieben
URL.RefreshIf.AnyFieldIsEmpty=(ArivaID)
# Jede URL wird genutzt um neuen Content abzurufen.
# Alle nachfolgenden RegEx werden dann auf diesem Content angewendet. Zeilenvorschübe werden dabei ersetzt mit einem Leerzeichen, um die RegEx zu vereinfachen
URL=https://www.zieladresse.com/search/search.m?searchname={ISIN}
# Mit einem Contentabruf können auch Variablen gebildet werden, die durch { } gekennzeichnet sind und nachfolgend wie andere Variablen genutzt werden können
{ReqID}.SaveInDatabase=true
{ReqID}=<a href="/([\w-]*)/kurs"
[Analystendaten]
URL.RefreshIf.MinDaysSinceLastUpdate=7
URL.RefreshIf.AnyFieldIsEmpty=(x-Analysten-Buy, x-Analysten-Hold, x-Analysten-Sell, Anzahl-Aktien, IR-Weblink)
URL=https://www.zieladresse.com/{ReqID}
x-Analysten-StrongBuy=
x-Analysten-Buy=analyst_type=analyst\&recommendation=buy"\>(\d*) \<\/a\>
x-Analysten-Hold=analyst_type=analyst\&recommendation=hold"\>(\d*) \<\/a\>
x-Analysten-Sell=analyst_type=analyst\&recommendation=sell"\>(\d*) \<\/a\>
x-Analysten-StrongSell=
# EPS-Revisionen=
[Stammdaten]
Anzahl-Aktien=Aktienanzahl</td>.*([0-9]*.[0-9]*).Mio
Notizen=div class="text".(.*)./div
IR-Weblink=class="subtitle">Website</td>.*href="(.*)"
Weblink=
Land=class="subtitle">Land</td> <td>(.*)</td>
Branche=class="subtitle">Branche</td> <td>(.*)</td>
Tätigkeitsbereich=class="subtitle">Sektor</td> <td>(.*)</td>
Mitarbeiter=Personal.am.Ende.des.Jahres\s+</td>\s+<td class="right"\s+>([-+]?[0-9]*.?[0-9]*|- \ )</td>\s+<td class="right"\s+>([-+]?[0-9]*.?[0-9]*|- \ )</td>\s+<td class="right"\s+>([-+]?[0-9]*.?[0-9]*|- \ )</td>\s+<td class="right"\s+>([-+]?[0-9]*.?[0-9]*|- \ )</td>\s+<td class="right"\s+>([-+]?[0-9]*.?[0-9]*|- \ )</td>\s+<td class="right" >([-+]?[0-9]*.?[0-9]*|- \ )</td> </tr>\s+<tr>\s+<td class="subtitle level0"\s+>\s+Personalaufwand
Währung=class="subtitle">Währung</td> <td>(.*)</td>
Ende-Fiskaljahr=
HV-Termin.datumsformat = dd.mm.yyyy
HV-Termin=HV-Termin<div>(.*)</div>
Streubesitz-in%=
Bilanzierungsmethode=
Letzter-Quartalsberichtszeitpunkt=
Kommender-Quartalsberichtszeitpunkt=
[Kennzahlen]
URL=https://www.zieladresse.com/{ReqID}/bilanz-guv
# Reguläre Ausdrücke analog: https://www.regular-expressions.info/quickstart.html. Es werden die Matchgruppen 1-10 verwendet.
Eigenkapitalquote-in%=Eigenkapitalquote.in.%\s+</td>\s+<td class="right"\s+>([-+]?[0-9]*.?[0-9]*|- \ )</td>\s+<td class="right"\s+>([-+]?[0-9]*.?[0-9]*|- \ )</td>\s+<td class="right"\s+>([-+]?[0-9]*.?[0-9]*|- \ )</td>\s+<td class="right"\s+>([-+]?[0-9]*.?[0-9]*|- \ )</td>\s+<td class="right"\s+>([-+]?[0-9]*.?[0-9]*|- \ )</td>\s+<td class="right" >([-+]?[0-9]*.?[0-9]*|- \ )</td>
Eigenkapitalrendite-in%=Eigenkapitalrendite.in.%\s+</td>\s+<td class="right"\s+>([-+]?[0-9]*.?[0-9]*|- \ )</td>\s+<td class="right"\s+>([-+]?[0-9]*.?[0-9]*|- \ )</td>\s+<td class="right"\s+>([-+]?[0-9]*.?[0-9]*|- \ )</td>\s+<td class="right"\s+>([-+]?[0-9]*.?[0-9]*|- \ )</td>\s+<td class="right"\s+>([-+]?[0-9]*.?[0-9]*|- \ )</td>\s+<td class="right" >([-+]?[0-9]*.?[0-9]*|- \ )</td>
Netto-Marge-in-%=Gewinnrendite.in.%\s+</td>\s+<td class="right"\s+>([-+]?[0-9]*.?[0-9]*|- \ )</td>\s+<td class="right"\s+>([-+]?[0-9]*.?[0-9]*|- \ )</td>\s+<td class="right"\s+>([-+]?[0-9]*.?[0-9]*|- \ )</td>\s+<td class="right"\s+>([-+]?[0-9]*.?[0-9]*|- \ )</td>\s+<td class="right"\s+>([-+]?[0-9]*.?[0-9]*|- \ )</td>\s+<td class="right" >([-+]?[0-9]*.?[0-9]*|- \ )</td>
EBIT-Marge-in%=
EBITDA-marge-in%=
Cashquote-in%=
Verschuldungsgrad-in%=
[Bilanz]
Bilanzsumme-in-Mio=Summe Aktiva\s+</td>\s+<td class="right"\s+>([-+]?[0-9]*.?[0-9]*|- \ )</td>\s+<td class="right"\s+>([-+]?[0-9]*.?[0-9]*|- \ )</td>\s+<td class="right"\s+>([-+]?[0-9]*.?[0-9]*|- \ )</td>\s+<td class="right"\s+>([-+]?[0-9]*.?[0-9]*|- \ )</td>\s+<td class="right"\s+>([-+]?[0-9]*.?[0-9]*|- \ )</td>\s+<td class="right" >([-+]?[0-9]*.?[0-9]*|- \ )</td>
Liquide-Mittel-in-Mio=
Cashflow-in-Mio=
Jahresueberschuss-in-Mio=
[Bilanz-mit-Jahresdaten]
URL.StartPaging
Jahr="subtitle.*">.*<td.*"right year">([0-9]*|- \ )</td>.*"right year">([0-9]*|- \ )</td>.*"right year">([0-9]*|- \ )</td>.*"right year">([0-9]*|- \ )</td>.*"right year">([0-9]*|- \ )</td>.*"right year">([0-9]*|- \ )</td>
Jahr=Gewinn-.und.Verlustrechnung.*<thead>.*<th>([0-9]{4}).?</th>.*<th>([0-9]{4}).?</th>.*<th>([0-9]{4}).?</th>.*<th>([0-9]{4}).?</th>.*<th>([0-9]{4}).?</th>.*<th>([0-9]{4}).?</th>
Umsatz=(?:Umsatz|Gesamtertrag)\s.*class="right"\s+>([-+]?[0-9]*.?[0-9]*|- \ )</td>.*"right"\s+>([-+]?[0-9]*.?[0-9]*|- \ )</td>.*"right"\s+>([-+]?[0-9]*.?[0-9]*|- \ )</td>.*"right"\s+>(.*)</td>.*"right"\s+>([-+]?[0-9]*.?[0-9]*|- \ )</td>.*"right"\s+>([-+]?[0-9]*.?[0-9]*|- \ )</td>
Jahresueberschuss-in-Mio=Jahresüberschuss\/-fehlbetrag\s+</td>\s+<td class="right"\s+>([-+]?[0-9]*.?[0-9]*|- \ )</td>\s+<td class="right"\s+>([-+]?[0-9]*.?[0-9]*|- \ )</td>\s+<td class="right"\s+>([-+]?[0-9]*.?[0-9]*|- \ )</td>\s+<td class="right"\s+>([-+]?[0-9]*.?[0-9]*|- \ )</td>\s+<td class="right"\s+>([-+]?[0-9]*.?[0-9]*|- \ )</td>\s+<td class="right" >([-+]?[0-9]*.?[0-9]*|- \ )</td>
EBIT.UmrechnungsFaktor=1000
EBIT=EBIT</td>.*<td>([-+]?[0-9,\,]*)</td>.*<td>([-+]?[0-9,\,]*)</td>.*<td>([-+]?[0-9,\,]*)</td>.*<td>([-+]?[0-9,\,]*)</td>.*<td>([-+]?[0-9,\,]*)</td>.*<td>([-+]?[0-9,\,]*)</td>
# ... wird umgerechnet in Gewinn-pro-Aktie
Gewinn=
Gewinn-pro-Aktie=Ergebnis.je.Aktie.\(brutto\)\s.*class="right"\s+>([-+]?[0-9]*.?[0-9]*|- \ )</td>.*"right"\s+>([-+]?[0-9]*.?[0-9]*|- \ )</td>.*"right"\s+>([-+]?[0-9]*.?[0-9]*|- \ )</td>.*"right"\s+>(.*)</td>.*"right"\s+>([-+]?[0-9]*.?[0-9]*|- \ )</td>.*"right"\s+>([-+]?[0-9]*.?[0-9]*|- \ )</td>
# ... wird umgerechnet in Buchwert-pro-Aktie
Buchwert=
Buchwert-pro-Aktie=Buchwert.je.Aktie\s.*class="right"\s+>([-+]?[0-9]*.?[0-9]*|- \ )</td>.*"right"\s+>([-+]?[0-9]*.?[0-9]*|- \ )</td>.*"right"\s+>([-+]?[0-9]*.?[0-9]*|- \ )</td>.*"right"\s+>(.*)</td>.*"right"\s+>([-+]?[0-9]*.?[0-9]*|- \ )</td>.*"right"\s+>([-+]?[0-9]*.?[0-9]*|- \ )</td>
# ... wird umgerechnet in Cashflow-pro-Aktie
Cashflow=
Cashflow-pro-Aktie=Cashflow.je.Aktie\s.*class="right"\s+>([-+]?[0-9]*.?[0-9]*|- \ )</td>.*"right"\s+>([-+]?[0-9]*.?[0-9]*|- \ )</td>.*"right"\s+>([-+]?[0-9]*.?[0-9]*|- \ )</td>.*"right"\s+>(.*)</td>.*"right"\s+>([-+]?[0-9]*.?[0-9]*|- \ )</td>.*"right"\s+>([-+]?[0-9]*.?[0-9]*|- \ )</td>
# ... wird umgerechnet in Dividende-pro-Aktie
Dividende=
Dividende-pro-Aktie=Dividende.je.Aktie\s.*class="right"\s+>([-+]?[0-9]*.?[0-9]*|- \ )</td>.*"right"\s+>([-+]?[0-9]*.?[0-9]*|- \ )</td>.*"right"\s+>([-+]?[0-9]*.?[0-9]*|- \ )</td>.*"right"\s+>(.*)</td>.*"right"\s+>([-+]?[0-9]*.?[0-9]*|- \ )</td>.*"right"\s+>([-+]?[0-9]*.?[0-9]*|- \ )</td>
URL.EndPaging
[Finanzen-GuV-10y]
# Wenn ein Paging benötigt wird, kann dies mit .Paging eingeleitet werden. Es erfolgt automatisch ein Rücksprung auf die letzte definierte URL und dessen Formatbeschreibungen
# URL.Paging=https://www.zieladresse.com/{ReqID}/bilanz-guv?page=6
[Finanzen-GuV-15y]
# Wenn ein Paging benötigt wird, kann dies mit .Paging eingeleitet werden. Es erfolgt automatisch ein Rücksprung auf die letzte definierte URL und dessen Formatbeschreibungen
# URL.Paging=https://www.zieladresse.com/{ReqID}/bilanz-guv?page=12