Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
|
@@ -271,37 +271,54 @@ def build_models() -> dict:
|
|
| 271 |
def train_and_evaluate(df: pd.DataFrame):
|
| 272 |
"""
|
| 273 |
Modelleri eğitir; son 10 günü test seti olarak kullanır.
|
| 274 |
-
|
|
|
|
|
|
|
|
|
|
| 275 |
"""
|
| 276 |
avail = [c for c in FEATURE_COLS if c in df.columns]
|
| 277 |
-
X
|
| 278 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 279 |
|
| 280 |
split = -10
|
| 281 |
-
X_train, X_test
|
| 282 |
-
y_train,
|
|
|
|
| 283 |
|
| 284 |
scaler = StandardScaler()
|
| 285 |
X_tr_sc = scaler.fit_transform(X_train)
|
| 286 |
X_te_sc = scaler.transform(X_test)
|
| 287 |
|
| 288 |
-
models
|
| 289 |
-
trained
|
| 290 |
-
test_preds = {}
|
| 291 |
|
| 292 |
for name, m in models.items():
|
| 293 |
m.fit(X_tr_sc, y_train)
|
| 294 |
-
|
| 295 |
-
|
|
|
|
|
|
|
|
|
|
| 296 |
|
| 297 |
return trained, scaler, test_preds, y_test, avail
|
| 298 |
|
| 299 |
|
| 300 |
def predict_next(trained: dict, scaler, df: pd.DataFrame, avail: list):
|
| 301 |
-
"""
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 302 |
x = df[avail].iloc[-1].values.reshape(1, -1)
|
| 303 |
xs = scaler.transform(x)
|
| 304 |
-
preds = {n: float(m.predict(xs)[0]) for n, m in trained.items()}
|
| 305 |
ensemble = float(np.mean(list(preds.values())))
|
| 306 |
return preds, ensemble
|
| 307 |
|
|
|
|
| 271 |
def train_and_evaluate(df: pd.DataFrame):
|
| 272 |
"""
|
| 273 |
Modelleri eğitir; son 10 günü test seti olarak kullanır.
|
| 274 |
+
Hedef: yarınki kapanış - bugünkü kapanış (fiyat değişimi / delta).
|
| 275 |
+
Bu sayede Ridge dahil tüm modeller mutlak fiyata yakınsamak yerine
|
| 276 |
+
gerçek yön ve büyüklük sinyali öğrenir.
|
| 277 |
+
Dönüş: trained_models, scaler, test_preds (mutlak fiyat), y_test (mutlak fiyat), avail
|
| 278 |
"""
|
| 279 |
avail = [c for c in FEATURE_COLS if c in df.columns]
|
| 280 |
+
X = df[avail].values
|
| 281 |
+
close = df['Close'].values
|
| 282 |
+
|
| 283 |
+
# Hedef: bir sonraki günün fiyat değişimi (delta)
|
| 284 |
+
y_delta = np.diff(close) # uzunluk = N-1
|
| 285 |
+
X = X[:-1] # son satırı at (yarını bilinmiyor)
|
| 286 |
+
close_aligned = close[:-1] # delta ile hizalı kapanışlar
|
| 287 |
|
| 288 |
split = -10
|
| 289 |
+
X_train, X_test = X[:split], X[split:]
|
| 290 |
+
y_train, y_delta_test = y_delta[:split], y_delta[split:]
|
| 291 |
+
close_test = close_aligned[split:]
|
| 292 |
|
| 293 |
scaler = StandardScaler()
|
| 294 |
X_tr_sc = scaler.fit_transform(X_train)
|
| 295 |
X_te_sc = scaler.transform(X_test)
|
| 296 |
|
| 297 |
+
models = build_models()
|
| 298 |
+
trained = {}
|
| 299 |
+
test_preds = {} # grafik/metrik uyumu için mutlak fiyat olarak sakla
|
| 300 |
|
| 301 |
for name, m in models.items():
|
| 302 |
m.fit(X_tr_sc, y_train)
|
| 303 |
+
delta_pred = m.predict(X_te_sc)
|
| 304 |
+
test_preds[name] = close_test + delta_pred # delta → mutlak fiyat
|
| 305 |
+
trained[name] = m
|
| 306 |
+
|
| 307 |
+
y_test = close_test + y_delta_test # gerçek mutlak fiyat (backtest için)
|
| 308 |
|
| 309 |
return trained, scaler, test_preds, y_test, avail
|
| 310 |
|
| 311 |
|
| 312 |
def predict_next(trained: dict, scaler, df: pd.DataFrame, avail: list):
|
| 313 |
+
"""
|
| 314 |
+
Son satırın feature'larından ertesi gün tahmini üretir.
|
| 315 |
+
Model delta (değişim) tahmin eder; mevcut kapanışa eklenerek
|
| 316 |
+
mutlak fiyata dönüştürülür.
|
| 317 |
+
"""
|
| 318 |
+
cp = float(df['Close'].iloc[-1])
|
| 319 |
x = df[avail].iloc[-1].values.reshape(1, -1)
|
| 320 |
xs = scaler.transform(x)
|
| 321 |
+
preds = {n: cp + float(m.predict(xs)[0]) for n, m in trained.items()}
|
| 322 |
ensemble = float(np.mean(list(preds.values())))
|
| 323 |
return preds, ensemble
|
| 324 |
|