Zum Inhalt springen
Christian-133

Aktienanylyse mit Python + yfinace

Empfohlene Beiträge

Christian-133

Hallo an die Community,

 

Ich bin ein neues Mitglied hier und habe gesehen, dass es hier in diesem Forum auch ein bisschen um das Thema Python und Aktien geht. Ich habe deshalb hierzu mal ein neues Thema erstellt. Ich selbst habe mich in den letzten Monaten etwas in Python und yfinance eingelesen und festgestellt, dass man mit wenig Zeilen Code interessante Sachen erstellen kann. z.b. eine Korrelationsmatrix oder eine monatliche Performance-Übersicht, oder ein Vergleich von Kennzahlen.  Mich würde mal interessieren, ob ihr auch mit Python und yfinance Aktienanalyse durchführt und wenn ja, was ihr da bereits so gemacht habt. Vielleicht ergibt sich ja daraus die ein oder andere Idee, die man vielleicht weiter ausbauen kann.

Diesen Beitrag teilen


Link zum Beitrag
TWFS

Moin. Ich nutze Python zusammen mit der stockdio API, um 3x pro Handelstag ein paar Aktienkurse zu ziehen und zu verarbeiten.

Das funktioniert sehr gut und zuverlässig seit ein paar Jahren, besser als Google Finance. Die stockdio API hat bei mir alphavantage abgelöst, wegen chronischer Unzuverlässigkeit. Ich nutze die gebührenfreie Variante, daher 3 Läufe pro Tag, was aber für meine Zwecke reicht.

Code-Schnipsel stelle ich bei Bedarf gerne zur Verfügung.

Diesen Beitrag teilen


Link zum Beitrag
Christian-133

Moin,

 

die API kenne ich gar nicht. Worin besteht jetzt der Unterschied zu yfinance.? Yfinance ist ja auch kostenlos. Vielleicht sollte ich mir das erstmal angucken, bevor ich so viele Fragen stelle :-) Und was machst du jetzt genau mit dieser API?

 

Gruß

Christian

Diesen Beitrag teilen


Link zum Beitrag
slowandsteady
vor 10 Stunden von TWFS:

Moin. Ich nutze Python zusammen mit der stockdio API, um 3x pro Handelstag ein paar Aktienkurse zu ziehen und zu verarbeiten.

So ähnlich hatte ich das auch mal, als ich noch Haushaltsbuch geführt habe und quasi einen "Liveticker" vom Vermögen hatte. Damals noch mit der "alten" Yahoo Finance API, wo man es einfach ohne API-Key als CSV bekommen hat. Mittlerweile sind mir die Kurse aber auch ziemlich egal - meine passive Investmentstrategie ändert sich ja sowieso nicht und fürs jährliche Rebalancing von 3 Positionen World, EMU, EM brauche ich nur ein paar Minuten, ein Skript ist da Overkill.

Diesen Beitrag teilen


Link zum Beitrag
TWFS
Am 13.10.2023 um 08:49 von Christian-133:

Und was machst du jetzt genau mit dieser API?

Ich ziehe die aktuellen Kurse unserer Aktien aus der API und berechne Summen pro Depot und eine Gesamtsumme. Eine Art "Liveticker" zum Vermögen, wie @slowandsteady schon richtig vermutet hat.

Zusätzlich zur Abarbeitung der Depots wird die Watchlist bearbeitet und ich bekomme Benachrichtigungen beim Erreichen festgelegter Schwellwerte. Das könnte man auch mit Limit-Orders regeln, aber so ist es mir lieber.

Depots und Watchlist liegen in CSV vor.

Dann werden ein paar Zahlen auf ein Paperwhite-Display geschrieben und das Raspi legt sich wieder schlafen.

Diesen Beitrag teilen


Link zum Beitrag
Christian-133

Ach cool. Ist bestimmt ein sehr interessantes Projekt. 

Diesen Beitrag teilen


Link zum Beitrag
Christian-133

Moin TWFS,

 

ich habe deine Idee mit yfinance nachgebaut. Es hat auch super funktioniert. Leider gibt es wohl seit neuestem ein Problem mit yfinance, sodass mein Script leider nicht mehr richtig funktioniert. Ich habe mich deshalb gerade bei stockdio angemeldet. Kannst du mir vielleicht dein Script zur Verfügung stellen, dann muss ich nicht lange rumexperimentieren. Dann wäre es nett.

 

Gruß

Christian

Diesen Beitrag teilen


Link zum Beitrag
TWFS

Na klar gerne.

Die stockdio API bietet nur eine begrenzte Anzahl kostenloser Calls pro Monat an, daher arbeite ich eine Liste ab und setze pro Handelsplatz lediglich einen API Call ab. Dazu einen Call für die aktuellen Währungsumrechnungskurse. Mein Raspi wacht 3x pro Wochentag auf, zieht die Kurse, malt ein paar Zahlen auf ein Paperwhite-Display und legt sich wieder schlafen.

Frag gerne nach, wenn etwas unklar ist.

 

#!/usr/bin/env python3


import requests


def _print_err(x):
    print('[ERROR] ' + x)


def _stockdio_jdata2dict(j_data, exchange):
    output = {}
    for i in j_data['data']['prices']['values']:
        symbol = i[0]
        if exchange == 'FOREX':
            symbol = symbol[:3]
        quote = float(i[2])
        if quote <= 0:
            _print_err('API quote ' + symbol + ' ' + str(quote))
            raise ValueError()
        output[symbol] = quote
    return output


def stockdio_prices(exchange='FOREX', symbols='USD/EUR;CHF/EUR'):
    """Query stockdio.com API getlatestprices. Return dictionary."""
    apikey = 'DEIN-API-KEY'
    apiurl = 'https://api.stockdio.com/'
    apipath = 'data/financial/prices/v1/getlatestprices?'
    stockdio_s = requests.Session()
    stockdio_s.params = {'app-key': apikey,
                         'stockExchange': exchange, 'symbols': symbols}
    response = stockdio_s.get(apiurl + apipath)
    if response.ok:
        return _stockdio_jdata2dict(response.json(), exchange)
    else:
        _print_err('API prices ' + exchange + ' ' + symbols)
        response.raise_for_status()


def _get_fx(list):
    fx_str = ''
    for row in list:
        if row['Currency'] not in fx_str and row['Currency'] != 'EUR':
            fx_str += row['Currency'] + '/EUR;'
    fx_str = fx_str[:-1]
    fx_response = stockdio_prices('FOREX', fx_str)
    fx_response['EUR'] = 1
    return fx_response


def _get_quotes(list):
    quotes = {}
    exchanges = []
    for row in list:
        if row['Exchange'] not in exchanges:
            exchanges.append(row['Exchange'])
    for ex in exchanges:
        symbols = []
        for row in list:
            if row['Exchange'] == ex and row['Symbol'] not in symbols:
                symbols.append(row['Symbol'])
        symbol_str = ';'.join(symbols)
        quotes_response = stockdio_prices(ex, symbol_str)
        quotes.update(quotes_response)
    return quotes

 

Diesen Beitrag teilen


Link zum Beitrag
Christian-133

Moin, 

 

vielen Dank für deinen Code. Ich habe mir zwischenzeitlich auch etwas mit Python und BeautifulSoup programmiert. Das Script zieht die Information aus der Webseite von Yahoo finance. 

 

Ich poste hier auch mal meinen Code. Ich weiß zwar nicht, ob das hier so das richtige Forum dafür ist, aber egal :-)))

Mein Code ist noch nicht optimiert. Ist sicherlich noch dirty Work., aber er funktioniert :-) 

 

import requests
from bs4 import BeautifulSoup
import pandas as pd

# Aufbau CSV
# Ticker,Anzahl, Bezeichnung
ticker_obj = pd.read_csv("aktien.csv")
symbols = ticker_obj['Ticker'].tolist()
t = ticker_obj
t = ticker_obj.set_index('Ticker')


# Dataframe
df = pd.DataFrame(index=[symbols],columns=['Bezeichnung','close','ask','anzahl','result']);

for i in symbols:
    try:
        url = ('https://de.finance.yahoo.com/quote/'+ i +'?p='+ i +'&.tsrc=fin-srch')
        r = requests.get(url)
        r.text
        web_content = BeautifulSoup(r.text, 'lxml')
        web_content_close = web_content.find('td',{'data-test':'PREV_CLOSE-value'}).text.replace(",",".")
        web_content_ask = web_content.find('td',{'data-test':'ASK-value'}).text.replace(",",".")
        #print(url)
        #print (web_content_close)
        # print (type(web_content_ask))
        ask = web_content_ask.split(" ")
        df.at[i,'ask'] = ask[0]
        df.at[i,'close'] = web_content_close
        df.at[i,'anzahl'] = t.loc[i].Anzahl
        df.at[i,'Bezeichnung'] = t.loc[i].Bezeichnung
    except:
        print ("error")


df['ask'] = df['ask'].astype(float)
df['close'] = df['close'].astype(float)
df['test'] = df['ask']-df['close']
df

 

Wer einen Optimierungsvorschlag hat. Immer gern. 

 

Gruß

Christian

 

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

×
×
  • Neu erstellen...