import gradio as gr import yfinance as yf import numpy as np import pandas as pd from scipy.signal import hilbert, butter, filtfilt from scipy.fft import fft, ifft import plotly.graph_objects as go from plotly.subplots import make_subplots # --- 1. ADAPTIVE SIGNAL PROCESSING ENGINE --- def adaptive_kalman_filter(z): """ Dinamik Kalman Filtresi: Interference (Girişim) miktarını ölçerek Q ve R parametrelerini anlık olarak optimize eder. """ n = len(z) x_hat = np.zeros(n) P = np.zeros(n) # Başlangıç değerleri x_hat[0] = z[0] P[0] = 1.0 # Adaptive parametreler için gözlem penceresi window_size = 10 for k in range(1, n): # 1. Lokal Volatilite Analizi (Interference Tespiti) if k > window_size: local_variance = np.var(z[k-window_size:k]) # R (Measurement Noise): Gözlemdeki gürültü arttıkça artar R = local_variance + 1e-2 # Q (Process Noise): Sistemin değişim hızına adaptasyon Q = local_variance * 0.1 + 1e-5 else: R = 1e-2 Q = 1e-5 # 2. Tahmin (Predict) x_hat_minus = x_hat[k-1] P_minus = P[k-1] + Q # 3. Güncelleme (Correct) K = P_minus / (P_minus + R) x_hat[k] = x_hat_minus + K * (z[k] - x_hat_minus) P[k] = (1 - K) * P_minus return x_hat def wiener_deconvolution(signal, lambd=0.05): """ Kanalın (Piyasanın) fiyata eklediği 'bulanıklığı' (lag) tersine çevirir. H_o(f) = H*(f) / (|H(f)|^2 + lambda) """ n = len(signal) h = np.exp(-np.arange(n) / 5.0) # Basit bir kanal gecikme modeli H = fft(h) Y = fft(signal) H_inv = np.conj(H) / (np.abs(H)**2 + lambd) restored_signal = np.real(ifft(Y * H_inv)) return restored_signal * (np.std(signal) / np.std(restored_signal)) def calculate_vsb_alpha_pro(ticker, period="6mo"): try: df = yf.download(ticker, period=period) if df.empty: return None, f"Hata: {ticker} için veri bulunamadı." raw_prices = df['Close'].values.flatten() # 1. Wiener Deconvolution (Sinyal Restorasyonu) restored_prices = wiener_deconvolution(raw_prices, lambd=0.05) # 2. VSB Demodülasyonu (I/Q Ayrışımı) z = hilbert(restored_prices) A = np.abs(z) # Envelope (Zarf) phase = np.unwrap(np.angle(z)) # 3. Faz Hızı Momentum (w_i = d_phi / d_t) omega_i = np.diff(phase) omega_i = np.append(omega_i, omega_i[-1]) omega_norm = np.tanh((omega_i - np.mean(omega_i)) / (np.std(omega_i) + 1e-6)) # 4. Vestige Analizi & Adaptive Kalman Filtreleme b, a = butter(4, 0.15, btype='high') raw_vestige = np.abs(filtfilt(b, a, restored_prices)) kalman_vestige = adaptive_kalman_filter(raw_vestige) # 5. SVR (Signal-to-Vestige Ratio) - Güven Skoru svr = 1 - (kalman_vestige / (A + 1e-6)) svr = np.clip(svr, 0, 1) # 6. Weighted Alpha Score [-1, 1] alpha_raw = (0.6 * omega_norm) + (0.4 * svr * np.sign(omega_norm)) alpha_score = np.tanh(alpha_raw) df['Restored'] = restored_prices df['Alpha'] = alpha_score df['SVR'] = svr df['Interference'] = raw_vestige - kalman_vestige return df, None except Exception as e: return None, f"Sistem Hatası: {str(e)}" # --- 2. DASHBOARD & UI --- def update_dashboard(ticker, period): df, error = calculate_vsb_alpha_pro(ticker, period) if error: return go.Figure().update_layout(title=error), error fig = make_subplots( rows=3, cols=1, shared_xaxes=True, vertical_spacing=0.05, row_heights=[0.5, 0.25, 0.25], subplot_titles=("Sinyal Restorasyonu & Zarf Analizi", "Adaptive Alpha Score (Interference Aware)", "Interference & Noise Floor") ) # Plot 1: Restored vs Raw fig.add_trace(go.Scatter(x=df.index, y=df['Close'], name="Ham Fiyat (Laggard)", line=dict(color='#475569', width=1)), row=1, col=1) fig.add_trace(go.Scatter(x=df.index, y=df['Restored'], name="Restored (Wiener)", line=dict(color='#22d3ee', width=2)), row=1, col=1) # Plot 2: Alpha Score colors = ['#10b981' if x > 0 else '#ef4444' for x in df['Alpha']] fig.add_trace(go.Bar(x=df.index, y=df['Alpha'], name="Alpha Score", marker_color=colors), row=2, col=1) fig.add_hline(y=0.7, line_dash="dash", line_color="#059669", row=2, col=1) fig.add_hline(y=-0.7, line_dash="dash", line_color="#dc2626", row=2, col=1) # Plot 3: Interference fig.add_trace(go.Scatter(x=df.index, y=df['Interference'], name="Interference Magnitude", fill='tozeroy', line=dict(color='#f43f5e')), row=3, col=1) fig.update_layout(height=900, template="plotly_dark", title_text=f"VSB Alpha PRO Dashboard: {ticker}", showlegend=True, paper_bgcolor='black', plot_bgcolor='black') last_alpha = df['Alpha'].iloc[-1] last_svr = df['SVR'].iloc[-1] status = "GÜÇLÜ AL" if last_alpha > 0.7 else "GÜÇLÜ SAT" if last_alpha < -0.7 else "NÖTR" report = f""" ### 🏛️ VSB Alpha PRO Analiz Raporu: {ticker} - **Karar Vektörü:** `{status}` (`{last_alpha:.4f}`) - **Sinyal Kalitesi (SVR):** `%{last_svr*100:.2f}` - **Modülasyon Durumu:** {"Temiz Kanal (Low Interference)" if last_svr > 0.75 else "Kirli Kanal (High Interference)"} **Teknik Özet:** Piyasa gecikmesi Wiener dekonvolüsyonu ile telafi edilmiş, gürültü girişimleri (interference) Adaptive Kalman katmanı ile minimize edilmiştir. """ return fig, report with gr.Blocks(theme=gr.themes.Monochrome()) as demo: gr.Markdown("# 🛰️ VSB Alpha PRO (Interference Aware Engine)") gr.Markdown("Haberleşme teorisi temelli, sinyal restorasyonu ve faz hızı momentum analizi.") with gr.Row(): ticker_input = gr.Textbox(label="Ticker (örn: BTC-USD, AAPL, THYAO.IS)", value="BTC-USD") period_input = gr.Dropdown(choices=["3mo", "6mo", "1y", "2y"], value="6mo", label="Periyot") btn = gr.Button("Sinyali Demodüle Et", variant="primary") out_plot = gr.Plot() out_report = gr.Markdown() btn.click(update_dashboard, [ticker_input, period_input], [out_plot, out_report]) if __name__ == "__main__": demo.launch()