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