|
|
import pandas as pd |
|
|
import numpy as np |
|
|
import ta |
|
|
from typing import List, Dict, Any |
|
|
|
|
|
def calculate_indicators(df: pd.DataFrame, indicators: List[str]) -> pd.DataFrame: |
|
|
""" |
|
|
Calculate technical indicators for the given OHLCV data |
|
|
|
|
|
Args: |
|
|
df: DataFrame with OHLCV data |
|
|
indicators: List of indicators to calculate |
|
|
|
|
|
Returns: |
|
|
DataFrame with calculated indicators |
|
|
""" |
|
|
|
|
|
result = df.copy() |
|
|
|
|
|
|
|
|
required_columns = ['timestamp', 'datetime', 'open', 'high', 'low', 'close', 'volume'] |
|
|
for col in required_columns: |
|
|
if col not in result.columns: |
|
|
if col == 'datetime' and 'timestamp' in result.columns: |
|
|
|
|
|
continue |
|
|
else: |
|
|
raise ValueError(f"Required column {col} not found in DataFrame") |
|
|
|
|
|
|
|
|
if 'rsi' in indicators: |
|
|
result['rsi'] = ta.momentum.RSIIndicator( |
|
|
close=result['close'], |
|
|
window=14 |
|
|
).rsi() |
|
|
|
|
|
|
|
|
if 'macd' in indicators: |
|
|
macd = ta.trend.MACD( |
|
|
close=result['close'], |
|
|
window_fast=12, |
|
|
window_slow=26, |
|
|
window_sign=9 |
|
|
) |
|
|
result['macd'] = macd.macd() |
|
|
result['macd_signal'] = macd.macd_signal() |
|
|
result['macd_histogram'] = macd.macd_diff() |
|
|
|
|
|
|
|
|
if 'bollinger' in indicators: |
|
|
bollinger = ta.volatility.BollingerBands( |
|
|
close=result['close'], |
|
|
window=20, |
|
|
window_dev=2 |
|
|
) |
|
|
result['bb_upper'] = bollinger.bollinger_hband() |
|
|
result['bb_middle'] = bollinger.bollinger_mavg() |
|
|
result['bb_lower'] = bollinger.bollinger_lband() |
|
|
|
|
|
|
|
|
if 'ema' in indicators: |
|
|
result['ema_9'] = ta.trend.EMAIndicator( |
|
|
close=result['close'], window=9 |
|
|
).ema_indicator() |
|
|
|
|
|
result['ema_21'] = ta.trend.EMAIndicator( |
|
|
close=result['close'], window=21 |
|
|
).ema_indicator() |
|
|
|
|
|
result['ema_50'] = ta.trend.EMAIndicator( |
|
|
close=result['close'], window=50 |
|
|
).ema_indicator() |
|
|
|
|
|
result['ema_200'] = ta.trend.EMAIndicator( |
|
|
close=result['close'], window=200 |
|
|
).ema_indicator() |
|
|
|
|
|
|
|
|
if 'atr' in indicators: |
|
|
result['atr'] = ta.volatility.AverageTrueRange( |
|
|
high=result['high'], |
|
|
low=result['low'], |
|
|
close=result['close'], |
|
|
window=14 |
|
|
).average_true_range() |
|
|
|
|
|
|
|
|
if 'stoch' in indicators: |
|
|
stoch = ta.momentum.StochasticOscillator( |
|
|
high=result['high'], |
|
|
low=result['low'], |
|
|
close=result['close'], |
|
|
window=14, |
|
|
smooth_window=3 |
|
|
) |
|
|
result['stoch_k'] = stoch.stoch() |
|
|
result['stoch_d'] = stoch.stoch_signal() |
|
|
|
|
|
return result |
|
|
|