Zum Inhalt springen
Melde dich an, um diesem Inhalt zu folgen  
FranzPischels

Finance API gesucht

Empfohlene Beiträge

FranzPischels

Hallo zusammen,

 

ich suche jetzt schon viele Stunden, aber finde absolut nichts was passt.

Ich benötige eine Finance API (oder andere Quelle...) wo ich per Excel Makro oder Power Shell einfach mal alle Aktien (also ISIN oder WKN) abfragen kann, welche eine Dividende zahlen.

 

Ich kann mit Alphavantage.co wenn ich einen bestimmten Ticker eingebe, zwar Live Kurse zu diesem einen Unternehmen abfragen, aber wirklich nur zu diesem einen Unternehmen.

Es muss doch etwas einfaches geben, womit ich erstmal alle Unternehmen abfrage, wo die Dividende > 0 ist.

 

Finde aber leider auch nach langem suchen nichts. Falls einer ne Idee hat, würde ich mich sehr freuen!

 

vielen Dank

Franz

Diesen Beitrag teilen


Link zum Beitrag
TWFS

Moin Franz,

 

zu Alphavantage gibt es ein Excel-PlugIn, damit sollte es einfacher sein:

https://www.alphavantage.co/spreadsheets/#o365-guide

 

Alternativ kann ich Google Sheets empfehlen, die Funktion lautet GOOGLEFINANCE().

 

Solltest du erwägen, mit einer Sprache wie Python zu arbeiten, ist meine Empfehlung stockdio.com. Die API ist sehr einfach und wenn man sich an ein paar Limitationen hält kostenlos. So ist die Anzahl der API Requests pro Monat begrenzt. Dies lässt sich aber einfach umgehen, indem man alle Anfragen pro Börse bündelt. Hier habe ich ein kleines Python-Script dazu hinterlegt:

 

Viele Grüße,

Stefan.

Diesen Beitrag teilen


Link zum Beitrag
FranzPischels

Hallo TWFS,

 

vielen Dank für deine Information. Von den genannten Möglichkeiten scheint mir GoogleFinance() die am ehesten umsetzbare. Dort kann man laut Internet Videos wunderbar Dividenden Infos abstauben, allerdings mit einem Extra Plugin namens WiseSheets.

 

Das habt z.B. folgende Befehle:

=WISE("AMZN","Revenue",2019,"Q3")

=WISE("AAPL","ROE","TTM")

 

Egal welchen Befehl ich auch eingebe (dieser kommt copy & paste aus der Doku) kommt immer "Fehler beim Parsen".  Wenn ich mir allerdings in einer Erweiterung Get Data z.b. die Balance Sheets zu Apple zusammenklicke funktioniert alles wunderbar.

Das Problem sind also anscheinend die Kommandos.

 

Aber die KOmmandos sind doch aus der Doku??? Ich bin echt ratlos...

Hat sich gelöst, man musste Komma Semikolon tauschen, wahrscheinlich weil das US lastig ist.

Man musste Komma Semikolon tauschen, wg. US Software GER Software...

Diesen Beitrag teilen


Link zum Beitrag
FranzPischels

OK, das Wisesheets ist halt kostenpflichtig. Geht die einfache Dividendenabfrage auch nur mit GoogleFinance() ?

Diesen Beitrag teilen


Link zum Beitrag
albr

warum nutzt du nicht yahoo finance ?

 

 

Diesen Beitrag teilen


Link zum Beitrag
FranzPischels

HI,

 

Yahoo Finance war noch nicht in meiner Testliste, hatte nur hier und da mal gelesen das die angeblich alles umgebaut hätten und Skripte nicht mehr funktonieren würden....

 

Kann jemand das hier empfehlen?

https://github.com/ranaroussi/yfinance

 

Oder gibt es sonst schon ein fertiges Skript bei euch für YF? (kann es gerne umbauen, möchte aber nicht bei 0 starten, wenn es geht...)

 

Danke euch!!!!

Diesen Beitrag teilen


Link zum Beitrag
Oli Garch

Habe auch lange gedacht, dass bei Yahoo nichts mehr geht. Inzwischen habe ich noch zwei URLs identifiziert, die Daten im JSON-Format zurückgeben. Ein VBA-Script, der eine solche verwendet, sieht z. B. so aus:

 

Public Function yFin(Ticker As String, myKey As String) As Double
Dim strResponse As String
Dim XML As Object
On Error GoTo Fehler
Set XML = CreateObject("MSXML2.ServerXMLHTTP")
    XML.Open "GET", "https://query1.finance.yahoo.com/v6/finance/options/" & Ticker, myKey, False
XML.send
strResponse = XML.ResponseText
strResponse = Split(strResponse, myKey)(1)
strResponse = Mid(strResponse, 3, 20)
strResponse = Left(strResponse, InStr(strResponse, ",") - 1)
strResponse = Replace(strResponse, ".", ",")
yFin = CDbl(strResponse)
Set XML = Nothing
Exit Function
Fehler:
    yFin = 0
    Set XML = Nothing
End Function

 

In der Excel-Zelle sollte dann dieses stehen:
=yFin(B3;"trailingAnnualDividendRate")
oder:
=yFin(B3;"trailingAnnualDividendYield")
in B3 das Ticker-Symbol!

Wenn du die URL aus dem Script mit einem angehängten Symbol im Browser eingibst, kannst du sehen, welche Werte noch abrufbar sind.
Noch Fragen?
 

Diesen Beitrag teilen


Link zum Beitrag
FranzPischels

Hallo Oli Garch,

 

das Skript funktioniert ja wunderbar. Ich dachte echt das Yahoo Finance Geschichte wäre... Muss man für yFin übrigens keinen API haben wie bei all den anderen Anbietern?

Ich habe jetzt lediglich nur noch das Problem, das meine Excel Liste mit 85000 Ticker Symbolen anscheinend das Abfrage Limit bei Yahoo übersteigt. Evtl. kann man das Skript ja noch um den API Key erweitern, dann kann man evtl. mehr Calls machen!

 

Falls jmd ne Info hat, gerne her damit!

 

Schöne Pfingsten an alle!

Diesen Beitrag teilen


Link zum Beitrag
Oli Garch

Von API-Keys bei Yahoo habe ich noch nichts gehört und Yahoo hat das ursrünglich mal umfangreiche Datenangebot fast vollständig eingestellt. Ich glaube auch, dass mein Script für deine wirklich riesige Menge an Ticker-Symbolen nicht besonders geeignet ist. Vielleicht können andere Forumsmitglieder dir weiterhelfen. Bei den Datenmengen geht das womöglich nur noch kostenpflichtig mit einer API und nicht mehr mit einem VBA-Script bei Yahoo.

Viel Erfolg

Oli

Diesen Beitrag teilen


Link zum Beitrag
FranzPischels
· bearbeitet von FranzPischels
Am 18.5.2024 um 19:30 von Oli Garch:

Habe auch lange gedacht, dass bei Yahoo nichts mehr geht. Inzwischen habe ich noch zwei URLs identifiziert, die Daten im JSON-Format zurückgeben. Ein VBA-Script, der eine solche verwendet, sieht z. B. so aus:

 

Public Function yFin(Ticker As String, myKey As String) As Double
Dim strResponse As String
Dim XML As Object
On Error GoTo Fehler
Set XML = CreateObject("MSXML2.ServerXMLHTTP")
    XML.Open "GET", "https://query1.finance.yahoo.com/v6/finance/options/" & Ticker, myKey, False
XML.send
strResponse = XML.ResponseText
strResponse = Split(strResponse, myKey)(1)
strResponse = Mid(strResponse, 3, 20)
strResponse = Left(strResponse, InStr(strResponse, ",") - 1)
strResponse = Replace(strResponse, ".", ",")
yFin = CDbl(strResponse)
Set XML = Nothing
Exit Function
Fehler:
    yFin = 0
    Set XML = Nothing
End Function

 

In der Excel-Zelle sollte dann dieses stehen:
=yFin(B3;"trailingAnnualDividendRate")
oder:
=yFin(B3;"trailingAnnualDividendYield")
in B3 das Ticker-Symbol!

Wenn du die URL aus dem Script mit einem angehängten Symbol im Browser eingibst, kannst du sehen, welche Werte noch abrufbar sind.
Noch Fragen?
 

Ja, noch Fragen. Hinter welchem Wert bzw. Schalter in der API verbirgt sich das ex Dividend Datum? Das finde ich nicht, wenn ich mir die JSONs in der API mit dem Link https://query1.finance.yahoo.com/v6/finance/options/AAPL anschaue (Beispiel Apple). Das wäre aber noch cool in der Excel zu haben...

Diesen Beitrag teilen


Link zum Beitrag
Oli Garch
vor 8 Stunden von FranzPischels:

Hinter welchem Wert bzw. Schalter in der API verbirgt sich das ex Dividend Datum?

Nicht so einfach:
Normalerweise haben wir hier das Key-Wort 'dividendDate'. Mit 'AAPL' funktioniert es. Leider fehlt dieser Wert bei Aktien-Symbolen von deutschen Börsenplätzen. Da kannst du vielleicht noch mit leben, aber es wird nicht einfacher. 'dividenddate' wird im UNIX-Timestamp-Format angegeben, muss also erst noch Excel-gerecht umgewandelt werden. Das geht aber alles mit einer zusätzlichen Zeile im Script:

If InStr(myKey, "dividendDate") > 0 Then strResponse = (strResponse / 86400) + 25569

Diese Zeile einfach vor Zeile :
yFin = CDbl(strResponse)
einfügen.

Jetzt wirst du es ausprobieren und wirst feststellen: " Oh Sch... das Ergebnis stimmt ja gar nicht."
Denn das Script zeigt dir als Ergebnis: '16.05.2024' und bei Yahoo auf der Übersichtsseite
https://de.finance.yahoo.com/quote/AAPL/key-statistics
steht '10. Mai 2024'.
Kommt daher, dass auf der Yahoo Übersichtsseite das Ex-Dividenddate und bei den Werten die das Script abrufen kann unter dividendDate das Paymentdate geladen wird.
das kann man schön hier vergleichen:
https://www.nasdaq.com/market-activity/stocks/aapl/dividend-history
Und das lässt sich nun mal nicht ändern.
 

Diesen Beitrag teilen


Link zum Beitrag
FranzPischels

hallo Oli,

 

vielen dank, funktioniert alles genauso wie du gesagt hast. Jetzt hätte ich in der Tat nur noch eine Frage:

 

Wenn ich im Browser die Werte der API ansehe, also über Link https://query1.finance.yahoo.com/v6/finance/options/AAPL sehe ich ja, das noch viele Attribute dort theoretisch abrufbar sind. z. B. fiftyTwoWeekLow

Wieso funktioniert aber mit diesen vielen anderen Attributen nicht die Excel Abfrage, wenn ich ein =yFin(A2;"fiftyTwoWeekLow") eingebe?

 

Auf der Website bzw. API URL steht dort der Wert 164.08, Excel gibt mir nur eine 0 aus. Das ist mir nicht logisch. Vielen Dank!

 

 

Diesen Beitrag teilen


Link zum Beitrag
Oli Garch
vor 39 Minuten von FranzPischels:

Wieso funktioniert aber mit diesen vielen anderen Attributen nicht die Excel Abfrage, wenn ich ein =yFin(A2;"fiftyTwoWeekLow") eingebe?

das kann ich dir schnell beantworten: schlampige Programmierung, hatte nur mit deinen Wunschdaten getestet.

Der Fehler entsteht immer dann, wenn es Schlüsselwörter mit dem gleichen Wortstamm gibt. Z. B. 'fiftyTwoWeekLow' und 'fiftyTwoWeekLowChange'. Steht dann das längere Wort oberhalb von dem gesuchten, entsteht ein Fehler, weil keine Zahl in dem vorgegebenen Bereich steht. Mit einer kleinen Änderung (Zeile eingefügt und eine Zeile geändert) hier das ganze Script mit Korrektur.

 

Public Function yFin(Ticker As String, myKey As String) As Double
Dim strResponse As String
Dim XML As Object
'On Error GoTo Fehler
Set XML = CreateObject("MSXML2.ServerXMLHTTP")
    XML.Open "GET", "https://query1.finance.yahoo.com/v6/finance/options/" & Ticker, myKey, False
XML.send
myKey = myKey + """:"
strResponse = XML.ResponseText
strResponse = Split(strResponse, myKey)(1)
strResponse = Left(strResponse, 20)
strResponse = Left(strResponse, InStr(strResponse, ",") - 1)
strResponse = Replace(strResponse, ".", ",")
If InStr(myKey, "dividendDate") > 0 Then strResponse = (strResponse / 86400) + 25569
yFin = CDbl(strResponse)
Set XML = Nothing
Exit Function
Fehler:
    yFin = 0
    Set XML = Nothing
End Function

 

Und vielen Dank für den Hinweis und deine Geduld.

Oli

 

Diesen Beitrag teilen


Link zum Beitrag
FranzPischels
· bearbeitet von FranzPischels

Hallo Oli,

 

Sorry für die späte Antwort, bin aktuell viel unterwegs und komme leider nur selten an den PC abends ;-) Aber, super, das klappt genauso wie von dir beschrieben!!!

Was ich jetzt noch nicht schaffe ist region und curreny abzufragen. Hier bin ich mir noch nicht sicher, ob das Problem im Makro Code ist oder ob die Excel Zelle irgendwo anders formatiert sein muss --> es kommt ja ein Char und kein Double Wert an...

 

vielen Dank nochmals für dein guten Input!

so sieht mein angepasster bzw. dein angepasster code aktuell bei mir in Excel aus:

 

Public Function yFin(Ticker As String, myKey As String) As Double
    Dim strResponse As String
    Dim XML As Object
    
    On Error GoTo Fehler
    Set XML = CreateObject("MSXML2.ServerXMLHTTP")
    XML.Open "GET", "https://query1.finance.yahoo.com/v6/finance/options/" & Ticker, False
    XML.send
    myKey = myKey + """:"
    strResponse = XML.ResponseText
    
    If InStr(strResponse, myKey) > 0 Then
        strResponse = Split(strResponse, myKey)(1)
        strResponse = Left(strResponse, 20)
        strResponse = Left(strResponse, InStr(strResponse, ",") - 1)
        strResponse = Replace(strResponse, ".", ",")
        If InStr(myKey, "dividendDate") > 0 Then
            strResponse = (strResponse / 86400) + 25569
        End If
        yFin = CDbl(strResponse)
    Else
        yFin = 0 ' Falls der Schlüssel nicht gefunden wird, gebe 0 zurück
    End If
    
    Set XML = Nothing
    Exit Function

Fehler:
    yFin = 0
    Set XML = Nothing
End Function

 

Diesen Beitrag teilen


Link zum Beitrag
Oli Garch

Genau wie du vermutest: der Fehler entsteht, wenn der Textwert zu einem Double-Wert gezwungen werden soll.

Machen wir einfach einen Variant-Wert daraus.

Dein Script (Änderungen fett):

 

Public Function yFin(Ticker As String, myKey As String) As Variant
    Dim strResponse As String
    Dim XML As Object
    
    On Error GoTo Fehler
    Set XML = CreateObject("MSXML2.ServerXMLHTTP")
    XML.Open "GET", "https://query1.finance.yahoo.com/v6/finance/options/" & Ticker, False
    XML.send
    myKey = myKey + """:"
    strResponse = XML.ResponseText
    
    If InStr(strResponse, myKey) > 0 Then
        strResponse = Split(strResponse, myKey)(1)
        strResponse = Left(strResponse, 50)
        strResponse = Left(strResponse, InStr(strResponse, ",") - 1)
        strResponse = Replace(strResponse, ".", ",")
        If InStr(myKey, "dividendDate") > 0 Then
            strResponse = (strResponse / 86400) + 25569
        End If
        If IsNumeric(Left(strResponse, 1)) = False Then
          strResponse = Replace(strResponse, """", "")
          yFin = strResponse
        Else
     
      yFin = CDbl(strResponse)
        End If
    Else
        yFin = 0 ' Falls der Schlüssel nicht gefunden wird, gebe 0 zurück
    End If
    
    Set XML = Nothing
    Exit Function

Fehler:
    yFin = 0
    Set XML = Nothing
End Function
Den String musste ich auch noch auf 50 verlängern. Bei longName "Deutsche Telekom AG" z. B. waren 20 Zeichen schon zu knapp.

Diesen Beitrag teilen


Link zum Beitrag
Oli Garch

Es ist noch etwas Nacharbeit notwendig. Bei negativen Ergebnissen, die z. B. bei 'regularMarketChange' auftreten können ist die Anzeige noch richtig, aber es handelt sich nicht um eine echte Zahl. Deshalb ist der Test auf 'isNumeric' geändert.
Dann war von allen Datums- und Zeitangaben im Code nur der 'dividendDate' berücksichtigt. Nunmehr müssten alle Datums- und Zeitabfragen funktionieren. Zeitangabe bezieht sich auf hier übliche MEZ (UTC+1). Sommerzeit (UTC+2) wird berücksichtigt.
Und da jetzt auch Textausgaben möglich sind, habe ich bei den beiden möglichen Fehlermeldungen Text angegeben.
Dann müsste aber so langsam alles funktionieren.

Der Code:

 

Public Function yFin(Ticker As String, myKey As String) As Variant
    Dim strResponse As String
    Dim Laege As Long
    Dim XML As Object
    
    On Error GoTo Fehler
    Set XML = CreateObject("MSXML2.ServerXMLHTTP")
    XML.Open "GET", "https://query1.finance.yahoo.com/v6/finance/options/" & Ticker, False
    XML.send
    myKey = myKey + """:"
    strResponse = XML.ResponseText
    Laenge = Len(strResponse)
    
    If InStr(strResponse, myKey) > 0 Then
        strResponse = Split(strResponse, myKey)(1)
        strResponse = Left(strResponse, 50)
        strResponse = Left(strResponse, InStr(strResponse, ",") - 1)
        strResponse = Replace(strResponse, ".", ",")
        If InStr(myKey, "Date") > 0 Or InStr(myKey, "MarketTime") > 0 Or InStr(myKey, "Timestamp") > 0 Then
            If Date >= DateSerial(Year(Date), 4, 0) And Date <= DateSerial(Year(Date), 11, 0) - Weekday(DateSerial(Year(Date), 11, 0)) + 1 Then
                strResponse = strResponse + 7200
            Else: strResponse = strResponse + 3600
            End If
            strResponse = (strResponse / 86400) + 25569
        End If
        If IsNumeric(Left(Replace(strResponse, "-", ""), 1)) = False Or InStr(myKey, "Range") > 0 Then
          strResponse = Replace(strResponse, """", "")
          yFin = strResponse
        Else
            yFin = CDbl(strResponse)
        End If
    Else
        yFin = "nokey" ' Falls der Schlüssel nicht gefunden wird
        If Laenge < 50 Then yFin = "noSymbol"
    End If
    
    Set XML = Nothing
    Exit Function

Fehler:
    yFin = "error"
    Set XML = Nothing
End Function
 

Diesen Beitrag teilen


Link zum Beitrag
FranzPischels

Wahnsinn, vielen Dank für all deine Mühen! Ich werde es gerne nächste Woche ausgiebig testen & berichten, bin noch bis Sonntag Abend beruflich unterwegs ...,-)

 

Schönes langes WE euch allen!

Diesen Beitrag teilen


Link zum Beitrag
FranzPischels

Hi Oli,

 

funktioniert alles super toll! Einen kleinen Fehler in der Variablenbenennung hattest du: Dim Laege As Long muss ja Dim Laenge As Long sein, aber das war ja schnell korrigiert! Aller besten Dank. Sag gerne Bescheid, falls ich nochmals mein komplettes Skript posten soll, falls Interesse besteht!

Diesen Beitrag teilen


Link zum Beitrag
Oli Garch

Hallo Franz,

wenn das Script in der letzten Fassung so auch bei dir funktioniert, können wir das so stehen lassen. Es müsste für Mitleser soweit nachvollziehbar sein.

Mache gerade eine Woche Urlaub und kann gerade nichts weiter beitragen.

Gruß Oli

Diesen Beitrag teilen


Link zum Beitrag
FranzPischels

In diesem sinne, ein schönen Urlaub wünsche ich !!!

Diesen Beitrag teilen


Link zum Beitrag

Erstelle ein Benutzerkonto oder melde dich an, um zu kommentieren

Du musst ein Benutzerkonto haben, um einen Kommentar verfassen zu können

Benutzerkonto erstellen

Neues Benutzerkonto für unsere Community erstellen. Es ist einfach!

Neues Benutzerkonto erstellen

Anmelden

Du hast bereits ein Benutzerkonto? Melde dich hier an.

Jetzt anmelden
Melde dich an, um diesem Inhalt zu folgen  

×
×
  • Neu erstellen...