GoshawkVortexAI commited on
Commit
183603a
·
verified ·
1 Parent(s): 82c1e28

Delete app.py

Browse files
Files changed (1) hide show
  1. app.py +0 -187
app.py DELETED
@@ -1,187 +0,0 @@
1
- import os
2
- import numpy as np
3
- import pandas as pd
4
- import gradio as gr
5
- import xgboost as xgb
6
- from sklearn.neighbors import KNeighborsClassifier
7
- from sklearn.preprocessing import StandardScaler
8
- from groq import Groq
9
-
10
- # ==========================================
11
- # 🔌 1. GROQ CLIENT
12
- # ==========================================
13
- api_key = os.environ.get("GROQ_API_KEY")
14
- client = Groq(api_key=api_key) if api_key else None
15
-
16
- # ==========================================
17
- # 📊 2. CSV DOSYASINI OKUMA (Ana dizinden)
18
- # ==========================================
19
- CSV_PATH = "BTCUSD_M30.csv"
20
-
21
- def load_local_csv(path=CSV_PATH):
22
- """Space ana dizinindeki CSV'yi okur (başlıksız, tab/virgül)."""
23
- try:
24
- if not os.path.exists(path):
25
- return None, f"Dosya bulunamadı: {path}"
26
-
27
- df = pd.read_csv(path, sep="\t", header=None)
28
- if df.shape[1] < 6:
29
- df = pd.read_csv(path, sep=",", header=None)
30
-
31
- if df.shape[1] < 6:
32
- return None, f"6 sütun bekleniyordu, {df.shape[1]} bulundu."
33
-
34
- df = df.iloc[:, :6]
35
- df.columns = ["date", "open", "high", "low", "close", "volume"]
36
-
37
- for c in ["open", "high", "low", "close", "volume"]:
38
- df[c] = pd.to_numeric(df[c], errors="coerce")
39
-
40
- df = df.dropna(subset=["close"]).reset_index(drop=True)
41
- if len(df) < 60:
42
- return None, f"En az 60 satır gerekli, {len(df)} var."
43
-
44
- return df, None
45
- except Exception as e:
46
- return None, f"Veri okunamadı: {e}"
47
-
48
- # ==========================================
49
- # 🧮 3. TEKNİK GÖSTERGELER + MODEL
50
- # ==========================================
51
- def compute_rsi(series, period=14):
52
- delta = series.diff()
53
- gain = delta.clip(lower=0).rolling(period).mean()
54
- loss = -delta.clip(upper=0).rolling(period).mean()
55
- rs = gain / loss
56
- return 100 - (100 / (1 + rs))
57
-
58
- def train_models(df):
59
- df = df.copy()
60
- df["ma_5"] = df["close"].rolling(5).mean()
61
- df["ma_20"] = df["close"].rolling(20).mean()
62
- df["rsi"] = compute_rsi(df["close"], 14)
63
- df["macd"] = df["close"].ewm(span=12).mean() - df["close"].ewm(span=26).mean()
64
- df["target"] = (df["close"].shift(-1) > df["close"]).astype(int)
65
-
66
- df_model = df.dropna().reset_index(drop=True)
67
- if len(df_model) < 20:
68
- return None, None, None, None, "Göstergelerden sonra yetersiz veri."
69
-
70
- features = ["ma_5", "ma_20", "rsi", "macd", "volume"]
71
- X = df_model[features].values
72
- y = df_model["target"].values
73
-
74
- xgb_model = xgb.XGBClassifier(
75
- n_estimators=60, max_depth=3, learning_rate=0.1,
76
- objective="binary:logistic", eval_metric="logloss", random_state=42
77
- )
78
- xgb_model.fit(X, y)
79
-
80
- scaler = StandardScaler()
81
- X_scaled = scaler.fit_transform(X)
82
- knn_model = KNeighborsClassifier(n_neighbors=7)
83
- knn_model.fit(X_scaled, y)
84
-
85
- latest = df_model.iloc[-1]
86
- metrics = {
87
- "last_close": float(latest["close"]),
88
- "last_date": str(latest["date"]),
89
- "ma5": float(latest["ma_5"]),
90
- "ma20": float(latest["ma_20"]),
91
- "rsi": float(latest["rsi"]),
92
- "macd": float(latest["macd"]),
93
- "volume": float(latest["volume"]),
94
- }
95
- return xgb_model, knn_model, scaler, metrics, None
96
-
97
- # ==========================================
98
- # 🧠 4. ANALİZ FONKSİYONU
99
- # ==========================================
100
- def predict_and_analyze():
101
- df, err = load_local_csv()
102
- if err:
103
- return err, {}
104
-
105
- xgb_model, knn_model, scaler, metrics, err = train_models(df)
106
- if err:
107
- return err, {}
108
-
109
- feat = np.array([[metrics["ma5"], metrics["ma20"], metrics["rsi"],
110
- metrics["macd"], metrics["volume"]]])
111
-
112
- xgb_up = float(xgb_model.predict_proba(feat)[0][1])
113
- knn_up = float(knn_model.predict_proba(scaler.transform(feat))[0][1])
114
- ens_up = (xgb_up + knn_up) / 2
115
- ens_down = 1 - ens_up
116
- direction = "YUKARI 📈" if ens_up > 0.5 else "AŞAĞI 📉"
117
- conf = max(ens_up, ens_down) * 100
118
-
119
- prob_dict = {
120
- "XGBoost Yükseliş": xgb_up,
121
- "KNN Yükseliş": knn_up,
122
- "Ensemble Yükseliş": ens_up,
123
- }
124
-
125
- prompt = f"""
126
- BTC/USD teknik analiz raporu (Türkçe).
127
- Son Kapanış ({metrics['last_date']}): ${metrics['last_close']:,.2f}
128
- RSI: {metrics['rsi']:.2f}, MA5: ${metrics['ma5']:,.2f}, MA20: ${metrics['ma20']:,.2f}, MACD: {metrics['macd']:.4f}, Hacim: {metrics['volume']:,.2f}
129
- XGBoost Yükseliş: %{xgb_up*100:.1f}
130
- KNN Yükseliş: %{knn_up*100:.1f}
131
- Ensemble: %{ens_up*100:.1f} -> {direction} (Güven %{conf:.1f})
132
- Başlıklar: 1. Model Yorumu 2. Teknik Analiz 3. İşlem Stratejisi. Yatırım tavsiyesi değildir.
133
- """
134
-
135
- if client:
136
- try:
137
- resp = client.chat.completions.create(
138
- model="openai/gpt-oss-120b",
139
- messages=[{"role": "user", "content": prompt}],
140
- temperature=0.3,
141
- max_tokens=1024
142
- )
143
- analysis = resp.choices[0].message.content
144
- except Exception as e:
145
- analysis = f"Groq API Hatası: {e}"
146
- else:
147
- analysis = "GROQ_API_KEY bulunamadı!"
148
-
149
- header = (
150
- f"**Son: ${metrics['last_close']:,.2f}** | RSI: {metrics['rsi']:.1f} | "
151
- f"MA5: ${metrics['ma5']:,.0f} | MA20: ${metrics['ma20']:,.0f}\n\n"
152
- f"**XGB:** %{xgb_up*100:.1f} | **KNN:** %{knn_up*100:.1f} | "
153
- f"**Ens:** %{ens_up*100:.1f}\n\n---\n\n"
154
- )
155
- return header + analysis, prob_dict
156
-
157
- # ==========================================
158
- # 🎨 5. GRADIO ARAYÜZÜ
159
- # ==========================================
160
- with gr.Blocks(theme=gr.themes.Soft(primary_hue="orange", secondary_hue="slate")) as demo:
161
- gr.Markdown(
162
- f"""
163
- # ₿ BTC/USD XGBoost + KNN & Groq AI Tahmin Radarı
164
- Veri kaynağı: **`{CSV_PATH}`** (Space ana dizini)
165
- """
166
- )
167
-
168
- with gr.Row():
169
- with gr.Column():
170
- analyze_btn = gr.Button("📊 CSV'yi Oku ve Analiz Et", variant="primary", size="lg")
171
- gr.Markdown(
172
- """
173
- **Not**: Model, `BTCUSD_M30.csv` dosyasını her butona basışta yeniden okur ve eğitir.
174
- """
175
- )
176
- with gr.Column():
177
- prob_output = gr.Label(label="Model Tahminleri")
178
- analysis_output = gr.Markdown(value="Butona basarak analizi başlatın.")
179
-
180
- analyze_btn.click(
181
- fn=predict_and_analyze,
182
- inputs=[],
183
- outputs=[analysis_output, prob_output]
184
- )
185
-
186
- if __name__ == "__main__":
187
- demo.launch()