lokale Maxima und Minima finden

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Python_Test
User
Beiträge: 9
Registriert: Samstag 10. Februar 2018, 17:50

Liebe Python-Gemeinde,
ich interessiere mich gerade für das Thema Finance-Trading / Algo-Trading.

Aktuell möchte ich aus einem Kursverlauf lokale Maxima & Minima finden. Im nächsten Schritt möchte ich die Tage identifizieren, wo der Kurs jeweils nach den Minima mind. 3% höher liegt, bzw. 3% unter den lokalen Maxima liegt.
Es kommt vor, dass nach einem lokalen Maximum ein lokales Minimum folgt, bevor der Kurs die 97% vom Maximums erreicht. In dieser Situation "verfällt" sozusagen die Suche nach dem 97%-Kurs dieses lokalen Maximums. Gleiches gilt im umgekehrter Weise für 103% Kurse von den lokalen Minima.

Mit vielen For-Schleifen habe ich es ansatzweise hinbekommen (allerdings funktioniert der Code nicht 100% zuverlässig). Mich würde interessieren, ob man das nicht auch kurz und bündig ohne viele Schleifen hinbekommt. Da fehlt es mir aber noch etwas an Programmier-Kenntnissen.

Hoffe das war halbwegs verständlich und jemand und jemand hat hierzu ein paar gute Ideen.

Falls jemand die Bibliothek zum import von Aktienkursen nicht kennt. Ich habe es mit dieser Yahoo-API gemacht:

Code: Alles auswählen

import fix_yahoo_finance as yf 
t_symbol="ALV.DE"
data = yf.download(str(t_symbol),'2017-01-01',date.today())
data['25ma'] = data['Adj Close'].rolling(window=25,min_periods=0).mean()
Vielen Dank schon mal
Bolitho
User
Beiträge: 219
Registriert: Donnerstag 21. Juli 2011, 07:01
Wohnort: Stade / Hamburg
Kontaktdaten:

dann zeig doch mal, was du bisher hinbekommen hast. Darauf lässt sich sicher aufbauen.
Python_Test
User
Beiträge: 9
Registriert: Samstag 10. Februar 2018, 17:50

Entschuldige schon mal den Mix aus englischen und deutschen Bezeichnungen. Sicherlich auch nicht ganz den Python - Konventionen entsprechend und es sind nicht alle Bibliotheken nötig. Aber hier mal der Code.
Der Code ist jetzt nur für die Ermittlung der Tage & Kurse von 103% nach den gefundenen Minima. Diese werden im dataframe "Cluster_min" abgelegt.
Wie gesagt, gefühlsmäßig sollte das mit deutlich weniger Code gehen und zuverlässiger. Den z.B. wird das Minimum Anfang 2019 von dem Algorithmus fälschlicherweise nicht gefunden.

Wenn man den code so ausführt, müsste der Kursverlauf von Apple der letzten 2000 Tage als plot generiert werden.
Vielen Dank schon mal

Code: Alles auswählen


import fix_yahoo_finance as yf 
from yahoofinancials import YahooFinancials
import pandas_datareader as pdr
from yahoo_fin import stock_info as si
import numpy as np
from scipy.signal import argrelextrema
from scipy import signal
from scipy.signal import find_peaks
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
import os
from numpy import *
import time
import datetime as dt
from tqdm import tqdm
from datetime import datetime
from datetime import date
from datetime import datetime, timedelta
import seaborn as sns
sns.set()

# Auswahl des Kurses von Apple über die letzten 2000 Tage
t_symbol='AAPL'
Dauer = 2000

data = yf.download(str(t_symbol),date.today()-timedelta(days=Dauer),date.today())
data['50ma'] = data['Adj Close'].rolling(window=50,min_periods=0).mean()


x = data.index
y2= data['50ma']

# Bestimmung der lokalen Maxima und Minima
a = diff(sign(diff(y2))).nonzero()[0] + 1 # local min+max
b = (diff(sign(diff(y2))) > 0).nonzero()[0] + 1 # local min
c = (diff(sign(diff(y2))) < 0).nonzero()[0] + 1 # local max
VK=pd.DataFrame([y2[b]]).transpose()
VVK=pd.DataFrame([y2[c]]).transpose()

# Hier wird ein definiert, dass die Kaufsignale bei 3% höheren Werten leigen sollen. Sozusagen wird die Kurve der Aktienkurse um 3% nach oben verschoben
VK['Kauf']=VK['50ma']*1.03
VVK['Verkaufen']=VVK['50ma']*0.97

df_y2=y2.to_frame()

# hier werden  die Tage gefunden, wenn nach einem Minimun ein Kurs von 103% des Minimums ereicht wird.
Signals=pd.DataFrame([])
for i in range(len(VK)):
    k=df_y2[df_y2.index > VK.index[i]]
    Buy_Impulse = k[k['50ma'] > VK['Kauf'][i]]
    
    try:
        Signals=Signals.append({'Date':Buy_Impulse.index[0],'50ma':Buy_Impulse['50ma'][0]},ignore_index=True)
    except:
        None

        
# Kauf
Signals.sort_values(by=['Date'], axis=0,ascending=True, inplace=True)
Signals['Index']=range(0,len(Signals))
Signal2=Signals.set_index('Index')


# Die gefundenen Werte werden in Gruppen (Cluster) zusammengefügt
n=1
cluster=1
Cluster_Datum = list()
Cluster_Number = list()
DF_Cluster = pd.DataFrame([])

for i in range(len(Signals)-1):
    
    if max(VK.index[VK.index < Signal2['Date'][i]]) == max(VK.index[VK.index < Signal2['Date'][i+1]]):
        cluster = n
        
    else:
        n+=1
    
    Cluster_Number.append(cluster)
    Cluster_Datum.append(Signal2['Date'][i])

DF_Cluster['Datum'] = Cluster_Datum
DF_Cluster['Cluster'] = Cluster_Number
DF_Cluster['Typ']='Buy'

# LIST COMPREHENSION für Kaufsignale (Auswahl des ersten aus Cluster)
aa=[d[1]['Datum'].min() for d in DF_Cluster.groupby('Cluster')]
Cluster_min=data.loc[data.index.isin(aa)]

# graphical output...
plt.plot
plt.plot(x,y2,'.')    
plt.plot(Cluster_min.index, Cluster_min['50ma'],'o', fillstyle='none',markersize=15, color='green')
plt.xlabel('Datum')
plt.ylabel('Aktienkurs von "' + t_symbol + '" in €')
plt.xticks(rotation=45)
plt.show()
plt.savefig('model1.png',dpi=600)
Antworten