(09.03.2023, 12:31)TomJoe schrieb: würde zumindest helfen und Zeit sparen
Code:
#pip install yfinance
#pip install mplfinance
import yfinance as yf
import mplfinance as mpf
import talib as ta
import numpy as np
import pandas as pd
import math
from mplfinance import _styles
#_styles.available_styles()
# styles = ['binance','blueskies','brasil','charles','checkers','classic','default','ibd',
# 'kenan','mike','sas','starsandstripes','yahoo']
#------------------------------------------------
path = 'C:/....your path to file.csv/'
symbol = 'ALV.DE' # bei yahoo für DAX xxx.DE verwendet
#------------------------------------------------
data= yf.download(symbol, period='9mo') # max, 1y,3mo,5min
data.to_csv(path+symbol + '_1y.csv')
#------------------------------------------------
# check data to plot
#mpf.plot(data, type='candle', figsize=(20,5),mav=(5,20), volume=True)
#------------------------------------------------
# # Calculate MACD values using the pandas_ta library
df['ema9'] = df['Close'].ewm(span=9, adjust=False, min_periods=12).mean()
df['ema12'] = df['Close'].ewm(span=12, adjust=False, min_periods=12).mean()
df['ema26'] = df['Close'].ewm(span=26, adjust=False, min_periods=12).mean()
# Subtract the 26-day EMA from the 12-Day EMA to get the MACD signal line
df['macd_line'] = df['ema12'] - df['ema26']
df['macd_signal'] = df['macd_line'].ewm(span=9, adjust=False, min_periods=9).mean()
#------------------------------------------------
# check mpf plot
mpf.plot(df, type='candle', volume=True, addplot=macd_plot)
#------------------------------------------------
# macd plot
import mplfinance as mpf
import talib as ta
from matplotlib import style
import matplotlib.pyplot as plt
plt.style.use('classic')
def MACD(df, window_slow, window_fast, window_signal):
macd = pd.DataFrame()
macd['ema_slow'] = df['Close'].ewm(span=window_slow).mean()
macd['ema_fast'] = df['Close'].ewm(span=window_fast).mean()
macd['macd'] = macd['ema_slow'] - macd['ema_fast']
macd['signal'] = macd['macd'].ewm(span=window_signal).mean()
macd['diff'] = macd['macd'] - macd['signal']
macd['bar_positive'] = macd['diff'].map(lambda x: x if x > 0 else 0)
macd['bar_negative'] = macd['diff'].map(lambda x: x if x < 0 else 0)
return macd
macd = MACD(df, 12, 26, 9)
macd_plot = [
mpf.make_addplot((macd['macd']), color='#606060', panel=2, ylabel='MACD', secondary_y=False),
mpf.make_addplot((macd['signal']), color='#1f77b4', panel=2, secondary_y=False),
mpf.make_addplot((macd['bar_positive']), type='bar', color='#4dc790', panel=2),
mpf.make_addplot((macd['bar_negative']), type='bar', color='#fd6b6c', panel=2),]
mpf.plot(df, type='candle', volume=True, addplot=macd_plot)
#-------------------------------------------
# macd
data["macd"], data["macd_signal"], data["macd_hist"] = ta.MACD(data['Close'])
# plot macd
macd_plot = mpf.make_addplot(data["macd"], panel=1, color='fuchsia', title="MACD")
colors = ['g' if v >= 0 else 'r' for v in data["macd_hist"]]
macd_hist_plot = mpf.make_addplot(data["macd_hist"], type='bar', panel=1, color=colors) # color='dimgray'
macd_signal_plot = mpf.make_addplot(data["macd_signal"], panel=1, color='b')
#----------------------------------------------
def detect_macd_signals(data):
"""Use MACD cross-over to decide buy/sell
Args:
data: panda DataFrame with OHLC with MACD data
Return:
buy_signals, sell_signals: for chart plot
signals: buy/sell transaction for summary printing
"""
#----------------------------------------------
buy_signals = [np.nan]
sell_signals = [np.nan]
signals = []
last_signal = None
for i in range(1, len(data)):
if data['macd_hist'][i-1] < 0 and data['macd_hist'][i] > 0:
price = (data['Open'][i] + data['Close'][i]) / 2
buy_signals.append(price)
last_signal = 'buy'
signals.append({
'date': data.index[i],
'action': 'buy',
'price': price
})
sell_signals.append(np.nan)
elif data['macd_hist'][i-1] > 0 and data['macd_hist'][i] < 0 and last_signal == 'buy':
price = (data['Open'][i] + data['Close'][i]) / 2
sell_signals.append(price)
last_signal = 'sell'
signals.append({
'date': data.index[i],
'action': 'sell',
'price': price
})
buy_signals.append(np.nan)
else:
buy_signals.append(np.nan)
sell_signals.append(np.nan)
return buy_signals, sell_signals, signals
#------------------------------------------------
# performance calculation
def print_performance_summary(signals):
"""Print buy/sell transactions and statistics
Args:
signals: recorded buy/sell transactions
"""
pairs = zip(*[iter(signals)]*2)
rows = []
profit_count = 0
profit_pct_avg = 0
for (buy, sell) in pairs:
profit = sell['price'] - buy['price']
profit_pct = profit / buy['price']
if profit > 0:
profit_count += 1
profit_pct_avg += profit_pct
row = {
'buy_date': buy['date'],
'duration': (sell['date'] - buy['date']).days,
'profit': profit,
'profit_pct': "{0:.2%}".format(profit_pct)
}
rows.append(row)
df = pd.DataFrame(rows, columns=['buy_date', 'duration',
'profit', 'profit_pct'])
with pd.option_context('display.max_rows', None, 'display.max_columns', None):
print(df)
total_transaction = math.floor(len(signals) / 2)
stats = {
'total_transaction': total_transaction,
'profit_rate': "{0:.2%}".format(profit_count / total_transaction),
'avg_profit_per_transaction': "{0:.2%}".format(profit_pct_avg / total_transaction)
}
for key, value in stats.items():
print('{0:30} {1}'.format(key, value))
#---------------------------------------------------
# buy/sell
buy_signals, sell_signals, signals = detect_macd_signals(data)
#---------------------------------------------------
# print buy/sell transaction and stats
print_performance_summary(signals)
# so sollte die performance Ausgabe aussehen
# buy_date duration profit profit_pct
#0 2022-09-12 00:00:00+02:00 14 -7.089996 -4.09%
#1 2022-10-10 00:00:00+02:00 49 40.110001 24.44%
#2 2023-01-04 00:00:00+01:00 26 12.724998 6.10%
#total_transaction 3
#profit_rate 66.67%
#avg_profit_per_transaction 8.82%
#---------------------------------------------------
# plot buy/sell
buy_plot = mpf.make_addplot(buy_signals, type='scatter', marker='^',
markersize=50, panel=0)
sell_plot = mpf.make_addplot(sell_signals, type='scatter', marker='v',
markersize=50, panel=0)
#---------------------------------------------------
# plot candle chart and all
plots = [macd_plot, macd_signal_plot, macd_hist_plot, buy_plot, sell_plot]
mpf.plot(data, type='candle',figsize=(20,10), style='classic',
addplot=plots, title=f"\n{symbol}", ylabel='Price (€)')
und so sieht der mit mplfinance erstelle chart von Allianz aus.
jetzt fehlt noch zum Vergleich (optimieren) anstatt macd crossover max(grün) und min(rot) von macd histogram als buy sell datzustellen.
