import gradio as gr import yfinance as yf import plotly.graph_objects as go import pandas as pd import numpy as np from sklearn.linear_model import LinearRegression def forecast_crypto(coin, currency, window_days): # 1. Ambil Data Kripto Dasar (Selalu dalam USD) base_ticker = f"{coin}-USD" data = yf.download(base_ticker, period="1y", interval="1d") if data.empty: return None, f"⚠️ Gagal mengambil data untuk {base_ticker}." if isinstance(data.columns, pd.MultiIndex): data.columns = data.columns.get_level_values(0) # 2. DATA ENGINEERING: Konversi Mata Uang Historis if currency != "USD": fx_ticker = f"USD{currency}=X" fx_data = yf.download(fx_ticker, period="1y", interval="1d") if fx_data.empty: return None, f"⚠️ Gagal mengambil data kurs {fx_ticker}." if isinstance(fx_data.columns, pd.MultiIndex): fx_data.columns = fx_data.columns.get_level_values(0) # Pasar kripto buka 24/7, tapi pasar Forex tutup saat akhir pekan. # Kita harus menyelaraskan (reindex) dan mengisi hari yang kosong (ffill/bfill) fx_close = fx_data['Close'].reindex(data.index).ffill().bfill() # Kalikan semua harga USD dengan kurs lokal di hari tersebut for col in ['Open', 'High', 'Low', 'Close']: if col in data.columns: data[col] = data[col] * fx_close # 3. Analisis Tren Historis data['Trend (SMA)'] = data['Close'].rolling(window=int(window_days)).mean() # 4. MACHINE LEARNING: Prediksi Harga Besok # Ambil tren X hari terakhir untuk dipelajari mesin df_pred = data[['Close']].dropna().tail(int(window_days)) if len(df_pred) < 3: return None, "⚠️ Data tidak cukup untuk melakukan prediksi." # Siapkan data untuk model ML X = np.arange(len(df_pred)).reshape(-1, 1) y = df_pred['Close'].values model = LinearRegression() model.fit(X, y) # Prediksi 1 hari ke depan next_day_X = np.array([[len(df_pred)]]) predicted_price = model.predict(next_day_X)[0] # 5. Visualisasi Interaktif Plotly fig = go.Figure() # Garis Harga Asli fig.add_trace(go.Scatter(x=data.index, y=data['Close'], mode='lines', name='Harga Aktual', line=dict(color='#2980b9', width=2))) # Garis Tren (SMA) fig.add_trace(go.Scatter(x=data.index, y=data['Trend (SMA)'], mode='lines', name=f'Garis Tren ({window_days} Hari)', line=dict(color='#e74c3c', width=2, dash='dash'))) fig.update_layout( title=f"📈 AI Market Forecasting: {coin} to {currency}", xaxis_title="Tanggal", yaxis_title=f"Harga ({currency})", template="plotly_white", hovermode="x unified", legend=dict(orientation="h", yanchor="bottom", y=1.02, xanchor="right", x=1) ) # 6. Ringkasan Eksekutif & Hasil Prediksi last_price = float(data['Close'].iloc[-1]) current_trend = float(data['Trend (SMA)'].iloc[-1]) status = "🟢 Naik (Bullish)" if last_price > current_trend else "🔴 Turun (Bearish)" # Format mata uang simbol = "Rp" if currency == "IDR" else ("$" if currency == "USD" else ("€" if currency == "EUR" else "£")) summary = f""" ### 📊 Market & Prediction Summary ({coin}/{currency}) * **Harga Penutupan Terakhir:** **{simbol} {last_price:,.2f}** * **Status Tren Pasar:** **{status}** * 🤖 **AI Prediksi Harga Besok:** **{simbol} {predicted_price:,.2f}** *(Catatan: Konversi mata uang dilakukan secara real-time menggunakan data pasar valuta asing. Prediksi dihitung menggunakan Machine Learning berdasarkan momentum {window_days} hari terakhir).* """ return fig, summary # --- UI GRADIO --- with gr.Blocks(theme=gr.themes.Soft(), title="CryptoProphet AI") as app: gr.Markdown("# 🤖 CryptoProphet: AI Market Forecasting") gr.Markdown("Sistem analitik prediktif yang menarik data *real-time* via API, melakukan konversi kurs otomatis, dan menggunakan **Machine Learning** untuk meramalkan harga kripto di hari berikutnya.") with gr.Row(): with gr.Column(scale=1): in_coin = gr.Dropdown(choices=["BTC", "ETH", "SOL", "BNB", "DOGE", "XRP", "ADA"], value="BTC", label="Pilih Koin Kripto") in_currency = gr.Dropdown(choices=["USD", "IDR", "EUR", "GBP"], value="IDR", label="Pilih Mata Uang (Fiat)") in_days = gr.Slider(minimum=7, maximum=90, value=30, step=1, label="Jendela Prediksi ML (Hari)") btn = gr.Button("🔄 Jalankan Prediksi AI", variant="primary") with gr.Column(scale=2): out_summary = gr.Markdown("### 📊 Memuat data prediksi AI...") with gr.Row(): out_plot = gr.Plot() btn.click(forecast_crypto, inputs=[in_coin, in_currency, in_days], outputs=[out_plot, out_summary]) app.load(forecast_crypto, inputs=[in_coin, in_currency, in_days], outputs=[out_plot, out_summary]) app.launch()