omniverse1 commited on
Commit
cd38f99
·
verified ·
1 Parent(s): 19698be

Update data_processor.py

Browse files
Files changed (1) hide show
  1. data_processor.py +11 -17
data_processor.py CHANGED
@@ -10,12 +10,13 @@ class DataProcessor:
10
  def get_market_data(self, ticker="GC=F", interval="1d"):
11
  """Fetch market data from Yahoo Finance for a given ticker"""
12
  try:
 
13
  interval_map = {
14
  "5m": "5m",
15
  "15m": "15m",
16
  "30m": "30m",
17
- "1h": "60m",
18
- "4h": "240m",
19
  "1d": "1d",
20
  "1wk": "1wk",
21
  "1mo": "1mo",
@@ -34,10 +35,15 @@ class DataProcessor:
34
  period = "max"
35
 
36
  ticker_obj = yf.Ticker(ticker)
 
 
 
 
37
  df = ticker_obj.history(interval=yf_interval, period=period)
38
 
39
  if df.empty:
40
- raise ValueError(f"No data retrieved from Yahoo Finance for {ticker}")
 
41
 
42
  df.columns = [col.capitalize() for col in df.columns]
43
 
@@ -48,41 +54,33 @@ class DataProcessor:
48
  return pd.DataFrame()
49
 
50
  def calculate_indicators(self, df):
51
- """Calculate technical indicators"""
52
  if df.empty:
53
  return df
54
 
55
- # Simple Moving Averages (5, 20 as requested)
56
  df['SMA_5'] = df['Close'].rolling(window=5).mean()
57
  df['SMA_20'] = df['Close'].rolling(window=20).mean()
58
 
59
- # Exponential Moving Averages
60
  df['EMA_12'] = df['Close'].ewm(span=12, adjust=False).mean()
61
  df['EMA_26'] = df['Close'].ewm(span=26, adjust=False).mean()
62
 
63
- # MACD (12, 26, 9)
64
  df['MACD'] = df['EMA_12'] - df['EMA_26']
65
  df['MACD_signal'] = df['MACD'].ewm(span=9, adjust=False).mean()
66
  df['MACD_histogram'] = df['MACD'] - df['MACD_signal']
67
 
68
- # Split histogram into positive and negative for plotting
69
  df['MACD_bar_positive'] = df['MACD_histogram'].where(df['MACD_histogram'] > 0, 0)
70
  df['MACD_bar_negative'] = df['MACD_histogram'].where(df['MACD_histogram'] < 0, 0)
71
 
72
- # RSI
73
  delta = df['Close'].diff()
74
  gain = (delta.where(delta > 0, 0)).rolling(window=14).mean()
75
  loss = (-delta.where(delta < 0, 0)).rolling(window=14).mean()
76
  rs = gain / loss
77
  df['RSI'] = 100 - (100 / (1 + rs))
78
 
79
- # Bollinger Bands
80
  df['BB_middle'] = df['Close'].rolling(window=20).mean()
81
  bb_std = df['Close'].rolling(window=20).std()
82
  df['BB_upper'] = df['BB_middle'] + (bb_std * 2)
83
  df['BB_lower'] = df['BB_middle'] - (bb_std * 2)
84
 
85
- # Average True Range (ATR)
86
  high_low = df['High'] - df['Low']
87
  high_close = np.abs(df['High'] - df['Close'].shift())
88
  low_close = np.abs(df['Low'] - df['Close'].shift())
@@ -90,23 +88,20 @@ class DataProcessor:
90
  true_range = ranges.max(axis=1)
91
  df['ATR'] = true_range.rolling(window=14).mean()
92
 
93
- # Volume indicators
94
  df['Volume_SMA'] = df['Volume'].rolling(window=20).mean()
95
  df['Volume_ratio'] = df['Volume'] / df['Volume_SMA']
96
 
97
- # Stochastic Oscillator (14, 3)
98
  low_14 = df['Low'].rolling(window=14).min()
99
  high_14 = df['High'].rolling(window=14).max()
100
  df['%K'] = 100 * (df['Close'] - low_14) / (high_14 - low_14)
101
  df['%D'] = df['%K'].rolling(window=3).mean()
102
  df['%SD'] = df['%D'].rolling(window=3).mean()
103
- df['UL'] = 70 # Upper limit
104
- df['DL'] = 30 # Lower limit
105
 
106
  return df
107
 
108
  def get_fundamental_data(self, ticker="GC=F"):
109
- """Get fundamental gold market data (now generalized/mocked)"""
110
  try:
111
  if ticker == "BTC-USD":
112
  fundamentals = {
@@ -135,7 +130,6 @@ class DataProcessor:
135
  return {"Error": str(e)}
136
 
137
  def prepare_for_chronos(self, df, lookback=100):
138
- """Prepare data for Chronos model"""
139
  if df.empty or len(df) < lookback:
140
  return None
141
 
 
10
  def get_market_data(self, ticker="GC=F", interval="1d"):
11
  """Fetch market data from Yahoo Finance for a given ticker"""
12
  try:
13
+ # FIX: Gunakan string interval yang didukung langsung oleh Yahoo/yfinance
14
  interval_map = {
15
  "5m": "5m",
16
  "15m": "15m",
17
  "30m": "30m",
18
+ "1h": "1h",
19
+ "4h": "4h",
20
  "1d": "1d",
21
  "1wk": "1wk",
22
  "1mo": "1mo",
 
35
  period = "max"
36
 
37
  ticker_obj = yf.Ticker(ticker)
38
+ # Mengatasi masalah data kripto yang mungkin tidak tersedia dalam periode lama
39
+ if ticker == "BTC-USD" and period == "max":
40
+ period = "5y"
41
+
42
  df = ticker_obj.history(interval=yf_interval, period=period)
43
 
44
  if df.empty:
45
+ # Perbarui pesan error untuk memperjelas log
46
+ raise ValueError(f"No data retrieved from Yahoo Finance for {ticker} at interval {interval}. Check if ticker/interval is supported.")
47
 
48
  df.columns = [col.capitalize() for col in df.columns]
49
 
 
54
  return pd.DataFrame()
55
 
56
  def calculate_indicators(self, df):
 
57
  if df.empty:
58
  return df
59
 
 
60
  df['SMA_5'] = df['Close'].rolling(window=5).mean()
61
  df['SMA_20'] = df['Close'].rolling(window=20).mean()
62
 
 
63
  df['EMA_12'] = df['Close'].ewm(span=12, adjust=False).mean()
64
  df['EMA_26'] = df['Close'].ewm(span=26, adjust=False).mean()
65
 
 
66
  df['MACD'] = df['EMA_12'] - df['EMA_26']
67
  df['MACD_signal'] = df['MACD'].ewm(span=9, adjust=False).mean()
68
  df['MACD_histogram'] = df['MACD'] - df['MACD_signal']
69
 
 
70
  df['MACD_bar_positive'] = df['MACD_histogram'].where(df['MACD_histogram'] > 0, 0)
71
  df['MACD_bar_negative'] = df['MACD_histogram'].where(df['MACD_histogram'] < 0, 0)
72
 
 
73
  delta = df['Close'].diff()
74
  gain = (delta.where(delta > 0, 0)).rolling(window=14).mean()
75
  loss = (-delta.where(delta < 0, 0)).rolling(window=14).mean()
76
  rs = gain / loss
77
  df['RSI'] = 100 - (100 / (1 + rs))
78
 
 
79
  df['BB_middle'] = df['Close'].rolling(window=20).mean()
80
  bb_std = df['Close'].rolling(window=20).std()
81
  df['BB_upper'] = df['BB_middle'] + (bb_std * 2)
82
  df['BB_lower'] = df['BB_middle'] - (bb_std * 2)
83
 
 
84
  high_low = df['High'] - df['Low']
85
  high_close = np.abs(df['High'] - df['Close'].shift())
86
  low_close = np.abs(df['Low'] - df['Close'].shift())
 
88
  true_range = ranges.max(axis=1)
89
  df['ATR'] = true_range.rolling(window=14).mean()
90
 
 
91
  df['Volume_SMA'] = df['Volume'].rolling(window=20).mean()
92
  df['Volume_ratio'] = df['Volume'] / df['Volume_SMA']
93
 
 
94
  low_14 = df['Low'].rolling(window=14).min()
95
  high_14 = df['High'].rolling(window=14).max()
96
  df['%K'] = 100 * (df['Close'] - low_14) / (high_14 - low_14)
97
  df['%D'] = df['%K'].rolling(window=3).mean()
98
  df['%SD'] = df['%D'].rolling(window=3).mean()
99
+ df['UL'] = 70
100
+ df['DL'] = 30
101
 
102
  return df
103
 
104
  def get_fundamental_data(self, ticker="GC=F"):
 
105
  try:
106
  if ticker == "BTC-USD":
107
  fundamentals = {
 
130
  return {"Error": str(e)}
131
 
132
  def prepare_for_chronos(self, df, lookback=100):
 
133
  if df.empty or len(df) < lookback:
134
  return None
135