Quellen für historische Kurse

Ich weiß nicht, nach meinem Eindruck legst du zu viel Gewicht auf die unterschiedlichen Zugangsmethoden und zu wenig auf die Quellen selbst. Portfolio Report ist überhaupt nicht erwähnt, obwohl es sicher die aktuell bequemste Bezugsmöglichkeit ist (für Werte, die auf Xetra gehandelt werden). Ansonsten nutze ich in erster Linie Ariva und in einem Fall Onvista (beides Methode „Tabelle auf Website“).

Hallo in die Runde
Ich bin auf diesen Beitrag gestossen, weil ich nach einer Lösung für autom. Kursimport ab swissfunddata.ch gesucht habe.
Kann z.B. das CSV von hier
https://www.swissfunddata.ch/sfdpub/de/funds/excelData/102619
herunter laden und manuell über die CSV-Import-Funktion einlesen.
Jetzt wäre es super, wenn das automatisch erfolgen könnte.

Hab dazu hier noch keine Lösung gefunden.

Wertpapier editieren → Tab Historische Kurse, dort “Tabelle auf einer Website” wählen und als Kurs-URL

https://de.investing.com/funds/ch0432279021-historical-data

eingeben.

Besten Dank, nicht die Antwort auf meine Frage aber die Lösung :slight_smile:
Hab die meisten meiner Fonds da gefunden und hab die weitere History manuell mit CSV ab swissfunddata importiert.

Du hattest doch keine Frage gestellt :wink:

Hallo Leute,

bin neu hier - bitte um Geduld.

Würde gerne den Kurs meiner Aktie - gekauft an der Börse Mailand - aktualisieren. Finde aber keine entsprechende aktuelle Kursliste und auch kein Börsenkürzel. Jemand einen Tipp?

LG, HjP

wenn du schreibst, um welche Aktie es sich handelt, dann wären wir vielleicht in der Lage dir zu helfen :slight_smile:

Hallo,

ja freichlich. Es handelt sich dabei um die Saras S.p.a WKN A0JL4P.

Gruß, HjP

https://de.investing.com/equities/saras-spa-historical-data z.B.

yahoo-Symbol wäre SRS.MI

Hey,

da ich für mehrere Wertpapiere historische Kurse einfügen wollte die nicht bei Portfolie Report dabei waren, habe ich ein kleines Script geschrieben, welches die Erstellung des Links automatisiert.

Den Link kann man dann einfach nehmen und bei Portfolio Performance eintragen.

Mithilfe der ISIN, findet es bei Onvista die Notationid raus und zusammen mit dem Anfangsdatum erstellt es dann automatisch den richtigen Link. Das funktioniert stand heute 15. April 2021. Falls sich da in Zukunft wieder was ändert, könnten wir/ich das in dem Script immer up-to-date halten.
Die ISINs könnten gespeichert werden, sodass man bei Änderungen von OnVista nur das Skript einmal neu anschmeißen muss und sofort alle neuen Links hat. Wenn das jemand möchte, mach ich das.

Sieht dann so aus:

(das Fett gedruckte gibt man ein)

python3 main.py
ISIN: LU0125951151
0: Baader Bank (EUR, Echtzeit)
1: Berlin (EUR, Echtzeit)
2: Düsseldorf (EUR, Echtzeit)
3: Frankfurt (EUR, verzögert)
4: gettex (EUR, Echtzeit)
5: Hamburg (EUR, Echtzeit)
6: KVG (EUR, Echtzeit)
7: München (EUR, Echtzeit)
8: Quotrix (EUR, Echtzeit)
9: Stuttgart (EUR, Echtzeit)
10: Swiss Exchange (EUR, verzögert)
11: Tradegate (EUR, Echtzeit)
stockmarket: 3
Startdate (any format): 2018-05-01
Der produzierte Link: https://www.onvista.de/onvista/times+sales/popup/historische-kurse/?notationId=15912438&dateStart=01.05.2018&interval=Y5&assetName=LU0125951151_MFS%20Meridian-Eur.Value%20A1%20EUR&exchange=Frankfurt%20%28EUR%2C%20verz%C3%B6gert%29


Link zum Github Projekt

Pull Requests oder sonstiges Kommentar sind natürlich willkommen.

Für die, die sich mit GitHub nicht so gut auskennen:

Nachdem ihr auf den Link gedrückt habt seht ihr direkt eine kleine Anleitung, der ihr einfach folgen müsst. Ist keine große Sache. Besteht alles nur aus einem Python Script mit ein paar Zeilen Code.


P.S: wär echt cool, wenn wir alle in dem Skript in Zukunft einfach immer eine Methode hätten die aktuell funktioniert, dann muss man nicht immer aufs neue das Forum durchstöbern und sich selbst damit auseinander setzen :blush:

Grüße
Fabian

@Fabioni

Gute Idee. Zwei Verbesserungsvorschläge:

  1. PP kann den Zeitraum variabel halten, etwa: “heute vor einem Monat” ( {TODAY:dd.MM.yyyy:-P1M} im folgenden Link).
  2. Man braucht einige Werte im Detail nicht. Relevant ist nur die notationId.

Verallgemeinert und vereinfacht könnte der Output des Python-Scripts sein:
https://www.onvista.de/onvista/times+sales/popup/historische-kurse/?notationId=15912438&dateStart={TODAY:dd.MM.yyyy:-P1M}&interval=Y5&assetName=a&exchange=a

Damit muss man dann zukünftig kein Datum mehr anpassen

Hey @hemagi,
In der URL müssen die Werte gesetzt sein. Man könnte natürlich auch xx rein schreiben aber dann kann man auch gleich die richtigen rein geben. Auf der Website von OnVista werden sie dann ja angezeigt und tragen so zur Übersichtlichkeit bei. Was man dagegen davon hat den Link zu “vereinfachen” wüsste ich gerade nicht. Den Link muss ja niemand händisch abschreiben.

  1. PP kann den Zeitraum variabel halten, etwa: “heute vor einem Monat” ( {TODAY:dd.MM.yyyy:-P1M} im folgenden Link).

Das ist interessant und könnt man einbauen. Für was steht -P1M?

Einen Monat vor heute.

Grundsätzlich wäre begrüßenswert, wenn nicht mehr Daten bezogen würden als gerade nötig. Sonst könnte Onvista auf die Idee kommen, das zu blockieren, um Serverlast einzusparen.

Hab das mit “{TODAY:dd.MM.yyyy:-P5Y}” jetzt gemacht. Kannte ich vorher nicht. Echt gut :slight_smile:

Die anderen Werte werden ja nicht extra abgefragt sondern stehen auf der gleichen Website wo auch die NotationId her ist. Erzeugt also keine extra Anfrage an den onvista Server.

Man könnte natürlich auch xx rein schreiben aber dann kann man auch gleich die richtigen rein geben. Auf der Website von OnVista werden sie dann ja angezeigt und tragen so zur Übersichtlichkeit bei.

Ob es gut aussieht, interessiert PP nicht. Es sollen doch nur Daten geholt werden. Form follows Function. Und die Lesbarkeit bei den ganzen URL-encodeten Zeichen ist… unterdurchschnittlich.

Hab das mit “{TODAY:dd.MM.yyyy:-P5Y}” jetzt gemacht.

Bloß nicht. So holst du bei jedem Aufruf die Daten der letzten 5 Jahre. Genauso wie @chirlu bin ich der Meinung, dass man so wenig Daten holen sollte wie nötig, sonst machen es die Lieferanten den Zugang irgendwann zu. Denn jede Query kostet sie Geld.
Dein Argument

Die anderen Werte werden ja nicht extra abgefragt sondern stehen auf der gleichen Website wo auch die NotationId her ist. Erzeugt also keine extra Anfrage an den onvista Server.

ist schwach, da onvista leicht merken kann, dass die Kursabfrage nicht aus ihren Webseiten erfolgt. Und wenn sie nicht von ihren Webseiten erfolgt, bringt es ihnen keinen Gewinn, weder, dass sie neue eigene Kunden generieren, noch das Werbung geschaltet werden kann.

Ich war davon ausgegangen, dass jeder einmal im Monat PP öffnet und die Kurse aktualisiert. Daher reicht es vollkommen, wenn wenn man die Daten des letzten Monats holt. Öffnet man fast jeden Tag PP, kann man sich auch auf 1 Woche beschränken.
Wenn du in deinem Python-Script anbietest, dass man die Anzahl der Monate oder Tage angeben kann, für die rückwirkend die Daten geholt werden, und default 1 Monat oder 7 Tage anbietest, würde das helfen.

3 Likes

Was haltet ihr von der Idee, Ariva als zusätzliche Quelle zu implementieren? Hierdurch werden Wikifolios sehr gut abgedeckt. Ich nutze Wikifolio und konnte noch keine zufriedenstellende Lösung finden, die historischen Kurse automatisch zu importieren. Wählt man “Tabelle auf einer Webseite” als Kurslieferant und anschließend Ariva werden nur die letzten 30 Tage importiert.
Ich habe die Umsetzung bereits mit python programmiert, eventuell könnte man den Code daran orientieren. Hier der Code:

import pandas as pd
import re
from bs4 import BeautifulSoup

Angaben vom Nutzer

isin = ‘DE000LS9HP25’ # Wikifolio-ISIN

WKN aus der Wikifolio-ISIN extrahieren

wkn = re.match(r"DE[0-9]+(.*)", isin).group(1)[:-1] # wkn = ‘LS9HP2’

Finde die SECU-Nummer des Wertpapiers für Ariva

base_url = ‘https://www.ariva.de/
url_ariva = base_url + ‘zertifikate/’ + str(wkn) + ‘/historische_kurse?’
response = requests.get(url_ariva)
soup = BeautifulSoup(response.text, “html.parser”)
secu = soup.find(‘input’, {‘name’: ‘secu’})[‘value’] # secu = ‘124122501’

HTML Element mit SECU-Nummer (Größer- und Kleinerzeichen durch Fragezeichen ersetzt)

?form action="/quote/historic/historic.csv" method=“get” name=“histcsv”?
?input type=“hidden” name=“secu” value=“124122501”?

?/form?

Download csv mit historischen Kursen bis 1.1.2000 (Datum kann man beliebig weit zurück setzen)

url_download = base_url + ‘/quote/historic/historic.csv?secu=’ + str(secu) +
‘&min_time=1.1.2000&max_time=17.4.2021&trenner=%3B&go=Download’
historical_quotes = pd.read_csv(url_download, delimiter=";", decimal=",")

Das Wertpapier existiert erst seit dem 04.12.2015
Output:

       Datum    Erster      Hoch      Tief  Schlusskurs  Stuecke  Volumen

0 2021-04-16 460.1580 465.5520 459.4135 465.2435 NaN NaN
1 2021-04-15 457.9710 460.0640 457.9170 459.5685 NaN NaN
… … … … … … …
1718 2015-12-07 163.5720 164.4280 163.1080 164.3945 NaN NaN
1719 2015-12-04 161.9405 163.6495 161.8135 163.5490 NaN NaN

Warum machst du keinen einmaligen Import per CSV und dann reichen die 30 Tage doch, wenn du PP einmal im Monat aufmachst :slight_smile:

2 Likes

Ich bin davon ausgegangen, dass die historischen Kurse komplett überschrieben werden :grinning_face_with_smiling_eyes:. Wenn nur neue hinzugefügt werden, ist das ausreichend. Danke :slight_smile:

Mein Autoit-Script für deutlich bequemeren historischen-Kursdaten-Download bei allen ariva.de Börsenplätzen …

Um folgendes Script verwenden zu können muss Autoit installiert werden → https://autoit.de/

#include <Date.au3>

Local $i

Local $boerse_id_[25]
$boerse_id_[0] =    0 ;Duesseldorf
$boerse_id_[1] =    1 ;Frankfurt
$boerse_id_[2] =    2 ;Hamburg
$boerse_id_[3] =    3 ;Hannover
$boerse_id_[4] =    4 ;Muenchen
$boerse_id_[5] =    5 ;Stuttgart
$boerse_id_[6] =    6 ;XETRA
$boerse_id_[7] =    8 ;Fondsgesellschaft
$boerse_id_[8] =   16 ;LS_RT
$boerse_id_[9] =   17 ;Berlin
$boerse_id_[10] =  21 ;NYSE
$boerse_id_[11] =  30 ;RBS_Indikation
$boerse_id_[12] =  37 ;DB_Indikation_Indizes
$boerse_id_[13] =  40 ;Nasdaq
$boerse_id_[14] =  41 ;AMEX
$boerse_id_[15] =  47 ;Stuttgart(EUWAX)
$boerse_id_[16] =  58 ;Wien
$boerse_id_[17] =  77 ;Indizes_Boerse_Wien
$boerse_id_[18] =  83 ;Nasdaq_OTC_Other
$boerse_id_[19] = 102 ;HypoVereinsbank
$boerse_id_[20] = 123 ;SIX_Swiss_Exchange
$boerse_id_[21] = 131 ;Tradegate
$boerse_id_[22] = 162 ;Quotrix
$boerse_id_[23] = 173 ;ARIVA_Indikation_Indizes
$boerse_id_[24] = 207 ;Gettex

;~ Local $secu_9999 = "124460367"	;	PL11BTS00015	11 Bit Studios
;~ Local $secu_9999 = "102110472"	;	DE000FTG1111	_flatexDEGIRO
;~ Local $secu_9999 = "116183"		;	AT000AGRANA3	Agrana Beteiligungs
;~ Local $secu_9999 = "41873"		;	US0126531013	Albemarle Corporation
;~ Local $secu_9999 = "144480705"	;	KYG017191142	Alibaba Group
;~ Local $secu_9999 = "269125"		;	US02079K3059	Alphabet Inc A
;~ Local $secu_9999 = "247606"		;	AT0000A18XM4	ams
;~ Local $secu_9999 = "23"			;	AT0000969985	AT&S
;~ Local $secu_9999 = "126743379"	;	KYG070341048	Baidu Inc
;~ Local $secu_9999 = "3430"		;	US0846707026	Berkshire Hathaway B
;~ Local $secu_9999 = "152225"		;	CNE100000296	BYD
;~ Local $secu_9999 = "100397716"	;	PLOPTTC00011	CD Projekt
;~ Local $secu_9999 = "920"			;	HK0941009539	China Mobile
;~ Local $secu_9999 = "48187"		;	CNE1000002V2	China Telecom Corporation Limited
;~ Local $secu_9999 = "100195618"	;	BMG210901242	China Water Affairs Group
;~ Local $secu_9999 = "116237635"	;	AT00000FACC2	Facc
;~ Local $secu_9999 = "107840887"	;	US30303M1027	Facebook
;~ Local $secu_9999 = "557"			;	US3682872078	Gazprom ADR
;~ Local $secu_9999 = "100358677"	;	KYG4402L1510	Hengan International
;~ Local $secu_9999 = "103516555"	;	VGG456671053	HollySys Automation Technologies
;~ Local $secu_9999 = "410"			;	US4581401001	Intel
;~ Local $secu_9999 = "148573414"	;	KYG8208B1014	JD.COM INC
;~ Local $secu_9999 = "6957"		;	US55315J1025	MMC Norilsk Nickel ADR
;~ Local $secu_9999 = "880993"		;	AT0000A00Y78	Petro Welt Technologies
;~ Local $secu_9999 = "127985912"	;	PLPLAYW00015	PlayWay
;~ Local $secu_9999 = "884924"		;	AT0000A00XX9	Polytec Group
;~ Local $secu_9999 = "100611933"	;	KYG875721634	TENCENT HOLDINGS LTD
;~ Local $secu_9999 = "969"			;	US8816242098	Teva Pharma. Ind. LTD
;~ Local $secu_9999 = "727762"		;	AT0000908504	Vienna Insurance Group
Local $secu_9999 = "340"			;	AT0000937503	Voestalpine
;~ Local $secu_9999 = "1753"		;	DE0007664039	Volkswagen VZ

;~ Run("C:\Programme\Mozilla Firefox\firefox.exe -new-window " & $Link_ariva_de & ", "", @SW_MAXIMIZE")

For $i = 0 To 25 Step 1
;~ 	ConsoleWrite($boerse_id_[$i] & @LF)
	Run("C:\Programme\Mozilla Firefox\firefox.exe " _
	& "https://www.ariva.de/quote/historic/historic.csv?secu=" _
	& $secu_9999 _
	& "&boerse_id=" _
	& $boerse_id_[$i] _
	& "&clean_split=1&clean_payout=&clean_bezug=1&currency=EUR&min_time=" _
	& "2.1.1970" _
	& "&max_time=" _
	& _NowDate() & _
	"&trenner=%3B&go=Download")
Next

Exit

Jedes Wertpapier hat bei ariva.de eine secu-Nummer.
Für die For-Schleife muss man diese Nummer zuteilen (per $secu_9999 Variable), bevor man das Script startet.
Aktuell ist für die Variable($secu_9999) Voestalpine zugeteilt, weil die anderen Aktienzeilen wurden als Kommentarzeile aktiviert, siehe Zeilenanfang (;~).

Die secu-Nummer bekommt man indem man eine CSV-Datei per Hand runter lädt.
Danach kann man bei der Firefox-Browser-Download-Historie den Download-Link kopieren, im Script einfügen und die eingefügte Zeile den anderen anpassen.

Sobald das Script gestartet wird lädt es von allen 25 Börsenplätzen hintereinander die CSV-Datei runter, ohne das man beim Browser per Hand etwas klicken muss, das ist super bequem.
Immer von 2.1.1970 bis Heute.

Automatismus ist ja praktisch, aber wozu sollte ich für ein Wertpapier die Kurse von 25 verschiedenen Börsenplätzen benötigen? So ganz ersichtlich ist der Nutzen nicht wirklich :thinking: