File size: 1,974 Bytes
8a3e273 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 |
import pandas as pd
import numpy as np
def calculate_sma(data, period=20):
"""Calculate Simple Moving Average."""
return data.rolling(window=period).mean()
def calculate_ema(data, period=20):
"""Calculate Exponential Moving Average."""
return data.ewm(span=period, adjust=False).mean()
def calculate_rsi(data, period=14):
"""Calculate Relative Strength Index."""
delta = data.diff()
gain = (delta.where(delta > 0, 0)).rolling(window=period).mean()
loss = (-delta.where(delta < 0, 0)).rolling(window=period).mean()
rs = gain / loss
return 100 - (100 / (1 + rs))
def calculate_macd(data):
"""Calculate MACD."""
exp1 = data.ewm(span=12, adjust=False).mean()
exp2 = data.ewm(span=26, adjust=False).mean()
macd = exp1 - exp2
signal = macd.ewm(span=9, adjust=False).mean()
hist = macd - signal
return pd.DataFrame({
'MACD': macd,
'Signal': signal,
'Histogram': hist
})
def calculate_bollinger_bands(data, period=20, num_std=2):
"""Calculate Bollinger Bands."""
sma = data.rolling(window=period).mean()
std = data.rolling(window=period).std()
upper = sma + (std * num_std)
lower = sma - (std * num_std)
return pd.DataFrame({
'Upper': upper,
'Middle': sma,
'Lower': lower
})
def add_indicators(df):
"""Add all technical indicators to the dataframe."""
df = df.copy()
# Calculate indicators
df['SMA_20'] = calculate_sma(df['Close'], 20)
df['EMA_20'] = calculate_ema(df['Close'], 20)
df['RSI'] = calculate_rsi(df['Close'])
# MACD
macd_data = calculate_macd(df['Close'])
df['MACD'] = macd_data['MACD']
df['MACD_Signal'] = macd_data['Signal']
df['MACD_Hist'] = macd_data['Histogram']
# Bollinger Bands
bbands = calculate_bollinger_bands(df['Close'])
df['BB_Upper'] = bbands['Upper']
df['BB_Middle'] = bbands['Middle']
df['BB_Lower'] = bbands['Lower']
return df |