vsbalpha / app.py
kaganseyda's picture
Update app.py
78fd228 verified
Raw
History Blame Contribute Delete
6.41 kB
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()