File size: 5,075 Bytes
ec53291
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
import gradio as gr
import pandas as pd
import requests
import random
import plotly.graph_objects as go
from datetime import datetime

# -----------------------------
# Fetch BTC Data via CoinGecko
# -----------------------------
def fetch_btc_data():
    try:
        url = "https://api.coingecko.com/api/v3/coins/bitcoin/market_chart?vs_currency=usd&days=50"
        res = requests.get(url, timeout=10)
        data = res.json()
        prices = data['prices']  # list of [timestamp, price]
        df = pd.DataFrame(prices, columns=['time', 'close'])
        df['time'] = pd.to_datetime(df['time'], unit='ms')
        return df
    except:
        # fallback if API fails
        return pd.DataFrame({'time': [datetime.now()], 'close': [0]})

# -----------------------------
# Simulated LSTM Prediction
# -----------------------------
def simulate_lstm_prediction(df):
    current_price = df.iloc[-1]['close']
    momentum = (df.iloc[-1]['close'] - df.iloc[-5]['close']) / df.iloc[-5]['close']
    variance = (random.random() - 0.5) * 0.03

    pred_price = current_price * (1 + (momentum * 0.4) + variance)
    trend = "HIGH" if pred_price > current_price else "LOW"
    confidence = random.uniform(0.7, 0.95)

    reasons = [
        "Local LSTM weights detected a hidden bullish divergence in the volume-price vector.",
        "Sequence analysis indicates the vanishing gradient problem is minimized for this 30-day window.",
        "Neural pattern matching suggests a 68% correlation with previous historical breakout cycles.",
        "Recursive hidden states are currently favoring a consolidation phase."
    ]

    return random.choice(reasons), f"${pred_price:,.2f}", f"{trend} ({int(confidence*100)}%)"

# -----------------------------
# Plot BTC Price Chart
# -----------------------------
def create_plot(df):
    fig = go.Figure()
    fig.add_trace(go.Scatter(
        x=df['time'],
        y=df['close'],
        mode='lines',
        name='BTC Price',
        line=dict(color='#3b82f6', width=4),
        fill='tozeroy',
        fillcolor='rgba(59, 130, 246, 0.1)'
    ))
    fig.update_layout(
        template="plotly_dark",
        paper_bgcolor='rgba(0,0,0,0)',
        plot_bgcolor='rgba(0,0,0,0)',
        margin=dict(l=0, r=0, t=0, b=0),
        height=400,
        xaxis=dict(showgrid=False),
        yaxis=dict(showgrid=True, gridcolor='rgba(255,255,255,0.05)')
    )
    return fig

# -----------------------------
# Main Dashboard Logic
# -----------------------------
def run_dashboard():
    df = fetch_btc_data()

    if df.empty or df['close'].iloc[-1] == 0:
        plot = go.Figure()
        plot.update_layout(template="plotly_dark")
        current_price = "Data not available"
        price = "N/A"
        trend = "N/A"
        reasoning = "Failed to fetch BTC data. Try again later."
        return plot, current_price, price, trend, reasoning

    reasoning, price, trend = simulate_lstm_prediction(df)
    plot = create_plot(df)
    current_price = f"${df.iloc[-1]['close']:,.2f}"

    return plot, str(current_price), str(price), str(trend), str(reasoning)

# -----------------------------
# Custom CSS
# -----------------------------
custom_css = """
.gradio-container { background-color: #020617 !important; color: white !important; }
.gr-button-primary { background: linear-gradient(90deg, #2563eb, #4f46e5) !important; border: none !important; }
"""

# -----------------------------
# Gradio UI
# -----------------------------
with gr.Blocks(theme=gr.themes.Soft(primary_hue="blue"), css=custom_css) as demo:
    gr.HTML("""
        <div style="text-align: center; padding: 40px 20px;">
            <div style="display: inline-block; padding: 10px; background: #f59e0b; border-radius: 12px; margin-bottom: 15px; color: #020617;">
                <i class="fa fa-bitcoin" style="font-size: 24px;"></i>
            </div>
            <h1 style="font-weight: 900; font-size: 3rem; margin-bottom: 0; letter-spacing: -2px; color: white;">BTC PREDICT</h1>
            <p style="color: #f59e0b; font-weight: 900; text-transform: uppercase; font-size: 0.7rem; letter-spacing: 3px; margin-top: 5px;">Built By Nadish • LSTM Neural Engine</p>
        </div>
    """)

    with gr.Row():
        with gr.Column(scale=1):
            price_display = gr.Label(label="Current Market Price")
        with gr.Column(scale=1):
            pred_display = gr.Label(label="AI Forecast Target")
        with gr.Column(scale=1):
            trend_display = gr.Label(label="Signal Direction")

    chart = gr.Plot(label="Market Trend Visualizer")

    with gr.Column():
        analysis = gr.Textbox(label="LSTM Inference Logic (Local Computation)", lines=3)
        predict_btn = gr.Button("INITIALIZE NEURAL INFERENCE", variant="primary", size="lg")

    predict_btn.click(
        fn=run_dashboard,
        outputs=[chart, price_display, pred_display, trend_display, analysis]
    )

# -----------------------------
# Launch App
# -----------------------------
if __name__ == "__main__":
    demo.launch(server_name="0.0.0.0", server_port=7860)