Binance_Master / app.py
shaheerawan3's picture
Update app.py
c81174d verified
import requests
import streamlit as st
import numpy as np
import pandas as pd
import plotly.graph_objs as go
import plotly.express as px
import yfinance as yf
import mplfinance as mpf
import tensorflow as tf
from sklearn.preprocessing import MinMaxScaler
from sklearn.model_selection import train_test_split
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import LSTM, Dense, Dropout
from prophet import Prophet
import pandas_ta as ta
import os
# API Keys
ALPHA_VANTAGE_API_KEY = os.getenv('1E7BEZ2T6N3YKN1H')
CRYPTOCOMPARE_API_KEY = os.getenv('060a0d950fb96512f174c57fee1150fefb221c28e7aebc564a9ce8bc43762e6d')
class AdvancedTradingPredictor:
def __init__(self, symbol):
self.symbol = symbol
self.risk_tolerance = 0.02
def fetch_historical_data(self, period='1y', interval='1h'):
"""
Fetch comprehensive historical trading data using Alpha Vantage and CryptoCompare
"""
try:
# Fetch data from Alpha Vantage
alpha_url = f"https://www.alphavantage.co/query?function=DIGITAL_CURRENCY_DAILY&symbol={self.symbol}&market=USD&apikey={ALPHA_VANTAGE_API_KEY}"
alpha_response = requests.get(alpha_url)
alpha_data = alpha_response.json()
# Fetch data from CryptoCompare
crypto_url = f"https://min-api.cryptocompare.com/data/v2/histoday?fsym={self.symbol}&tsym=USD&limit=1000&api_key={CRYPTOCOMPARE_API_KEY}"
crypto_response = requests.get(crypto_url)
crypto_data = crypto_response.json()
# Combine data
alpha_df = pd.DataFrame(alpha_data['Time Series (Digital Currency Daily)']).T
crypto_df = pd.DataFrame(crypto_data['Data']['Data'])
# Process and merge data
# (Add your data processing logic here)
return combined_df
except Exception as e:
st.error(f"Data Fetch Error: {e}")
return None
def prepare_lstm_data(self, data):
"""
Prepare data for LSTM model
"""
# Use Close prices
prices = data['Close'].values.reshape(-1, 1)
# Normalize
scaler = MinMaxScaler(feature_range=(0, 1))
scaled_prices = scaler.fit_transform(prices)
# Create sequences
X, y = [], []
look_back = 60
for i in range(len(scaled_prices) - look_back):
X.append(scaled_prices[i:i+look_back])
y.append(scaled_prices[i+look_back])
X, y = np.array(X), np.array(y)
X = X.reshape((X.shape[0], X.shape[1], 1))
return X, y, scaler
def build_lstm_model(self, input_shape):
"""
Build advanced LSTM model
"""
model = Sequential([
LSTM(100, return_sequences=True, input_shape=input_shape),
Dropout(0.3),
LSTM(50, return_sequences=False),
Dropout(0.2),
Dense(50, activation='relu'),
Dense(1)
])
model.compile(optimizer='adam', loss='mean_squared_error')
return model
def prophet_forecast(self, data):
"""
Use Prophet for time series forecasting
"""
prophet_data = data[['Close']].reset_index()
prophet_data.columns = ['ds', 'y']
# Remove timezone information
prophet_data['ds'] = prophet_data['ds'].dt.tz_localize(None)
model = Prophet(
seasonality_mode='multiplicative',
yearly_seasonality=True,
weekly_seasonality=True,
daily_seasonality=True
)
model.fit(prophet_data)
future = model.make_future_dataframe(periods=30)
forecast = model.predict(future)
return forecast
def generate_trading_signals(self, predictions):
"""
Generate advanced trading signals using technical indicators
"""
signals = []
for i in range(1, len(predictions)):
change_percent = ((predictions[i] - predictions[i-1]) / predictions[i-1]) * 100
if change_percent > 2:
signals.append('Strong Buy')
elif change_percent > 1:
signals.append('Weak Buy')
elif change_percent < -2:
signals.append('Strong Sell')
elif change_percent < -1:
signals.append('Weak Sell')
else:
signals.append('Hold')
return signals
def predict_prices(self):
"""
Comprehensive price prediction
"""
# Fetch historical data
data = self.fetch_historical_data()
if data is None:
return None
# LSTM Prediction
X, y, scaler = self.prepare_lstm_data(data)
# Split data
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)
# Build and train model
model = self.build_lstm_model((X_train.shape[1], 1))
early_stop = tf.keras.callbacks.EarlyStopping(
monitor='val_loss',
patience=10,
restore_best_weights=True
)
model.fit(
X_train, y_train,
epochs=100,
batch_size=32,
validation_split=0.2,
callbacks=[early_stop],
verbose=0
)
# Predict
predictions = model.predict(X_test)
predictions = scaler.inverse_transform(predictions)
actual = scaler.inverse_transform(y_test)
# Prophet Forecast
prophet_forecast = self.prophet_forecast(data)
# Trading Signals
trading_signals = self.generate_trading_signals(predictions.flatten())
return {
'lstm_predictions': predictions.flatten(),
'actual_prices': actual.flatten(),
'prophet_forecast': prophet_forecast,
'trading_signals': trading_signals,
'current_price': data['Close'].iloc[-1]
}
def create_candlestick_chart(data):
"""
Create interactive candlestick chart
"""
fig = go.Figure(data=[go.Candlestick(
x=data.index,
open=data['Open'],
high=data['High'],
low=data['Low'],
close=data['Close']
)])
fig.update_layout(
title='Candlestick Chart',
xaxis_title='Date',
yaxis_title='Price',
template='plotly_dark'
)
return fig
def get_ton_usd_price():
"""
Fetch real-time TON/USD price using yfinance
"""
try:
# Using yfinance to get TON price
ton_ticker = yf.Ticker("TON-USD")
ton_data = ton_ticker.history(period='1d')
if not ton_data.empty:
return ton_data['Close'].iloc[-1]
else:
st.warning("Could not fetch latest TON price")
return None
except Exception as e:
st.error(f"Could not fetch TON price: {e}")
return None
def main():
st.set_page_config(
page_title="Advanced Trading Prediction",
page_icon="📈",
layout="wide"
)
st.title("🚀 Advanced Trading Prediction AI")
# Sidebar Configuration
st.sidebar.header("Trading Configuration")
trading_symbol = st.sidebar.selectbox(
"Select Trading Pair",
["BTCUSDT", "ETHUSDT", "BNBUSDT", "ADAUSDT", "TONUSDT"] # Added TONUSDT
)
# Initialize Predictor
predictor = AdvancedTradingPredictor(trading_symbol)
# Fetch Predictions
predictions = predictor.predict_prices()
if predictions:
# Fetch TON/USD Price
ton_usd_price = get_ton_usd_price()
# Create metrics container
st.subheader("🔹 TON (Toncoin) Trading Analysis")
metrics_container = st.container()
col1, col2, col3 = metrics_container.columns(3)
with col1:
st.metric(
"Current TON/USD",
f"${ton_usd_price:.4f}" if ton_usd_price else "Unavailable"
)
with col2:
predicted_change = ((predictions['lstm_predictions'][-1] - ton_usd_price) / ton_usd_price * 100) if ton_usd_price else None
st.metric(
"Predicted TON/USD",
f"${predictions['lstm_predictions'][-1]:.4f}",
f"{predicted_change:+.2f}%" if predicted_change is not None else None,
delta_color="normal"
)
with col3:
volume = predictor.fetch_historical_data(period='1d')['Volume'].iloc[-1] if ton_usd_price else None
st.metric(
"24h Volume",
f"{volume:,.0f} TON" if volume is not None else "Unavailable"
)
# Add trading recommendations
st.subheader("📊 Trading Recommendations")
# Calculate key levels
if ton_usd_price:
current_price = ton_usd_price
support_level = current_price * 0.95 # 5% below current price
resistance_level = current_price * 1.05 # 5% above current price
levels_col1, levels_col2 = st.columns(2)
with levels_col1:
st.markdown("#### Key Price Levels")
st.markdown(f"- **Support Level**: ${support_level:.4f}")
st.markdown(f"- **Current Price**: ${current_price:.4f}")
st.markdown(f"- **Resistance Level**: ${resistance_level:.4f}")
with levels_col2:
st.markdown("#### Suggested Trading Ranges")
st.markdown(f"- **Conservative Stop Loss**: ${current_price * 0.97:.4f}")
st.markdown(f"- **Aggressive Stop Loss**: ${current_price * 0.95:.4f}")
st.markdown(f"- **Conservative Take Profit**: ${current_price * 1.03:.4f}")
st.markdown(f"- **Aggressive Take Profit**: ${current_price * 1.05:.4f}")
# Add market sentiment
latest_signals = predictions['trading_signals'][-5:] # Get last 5 signals
bullish_count = sum(1 for signal in latest_signals if 'Buy' in signal)
bearish_count = sum(1 for signal in latest_signals if 'Sell' in signal)
sentiment = "Bullish" if bullish_count > bearish_count else "Bearish" if bearish_count > bullish_count else "Neutral"
st.subheader("🎯 Market Sentiment")
st.markdown(f"""
- **Current Sentiment**: {sentiment}
- **Signal Strength**: {'Strong' if abs(bullish_count - bearish_count) >= 3 else 'Moderate' if abs(bullish_count - bearish_count) >= 2 else 'Weak'}
- **Recommendation**: {'Consider Long Positions' if sentiment == 'Bullish' else 'Consider Short Positions' if sentiment == 'Bearish' else 'Wait for Clearer Signals'}
""")
# Create Layout
col1, col2 = st.columns(2)
# Candlestick Chart
with col1:
st.subheader("Price Movement")
historical_data = predictor.fetch_historical_data()
candlestick_chart = create_candlestick_chart(historical_data)
st.plotly_chart(candlestick_chart)
# Predictions Visualization
with col2:
st.subheader("Price Predictions")
fig = go.Figure()
fig.add_trace(go.Scatter(
y=predictions['actual_prices'],
mode='lines',
name='Actual Prices'
))
fig.add_trace(go.Scatter(
y=predictions['lstm_predictions'],
mode='lines',
name='LSTM Predictions'
))
st.plotly_chart(fig)
# Trading Signals
st.subheader("Trading Signals")
signal_counts = pd.Series(predictions['trading_signals']).value_counts()
signal_chart = px.pie(
values=signal_counts.values,
names=signal_counts.index,
title="Trading Signal Distribution"
)
st.plotly_chart(signal_chart)
# Current Price & Risk Management
st.subheader("Risk Management")
current_price = predictions['current_price']
# Advanced Risk Calculation
volatility = np.std(predictions['actual_prices'])
risk_multiplier = 1 + (volatility / current_price)
stop_loss = current_price * (1 - (0.02 * risk_multiplier))
take_profit = current_price * (1 + (0.05 * risk_multiplier))
# Risk Level Classification
if volatility < current_price * 0.02:
risk_level = "Low"
elif volatility < current_price * 0.05:
risk_level = "Moderate"
else:
risk_level = "High"
col1, col2 = st.columns(2)
with col1:
st.metric("Current Price", f"${current_price:.4f}")
st.metric("Stop Loss", f"${stop_loss:.4f}")
st.metric("Volatility", f"{volatility:.4f}")
with col2:
st.metric("Take Profit", f"${take_profit:.4f}")
st.metric("Risk Level", risk_level)
# Future Price Projection
st.subheader("Future Price Projection")
prophet_forecast = predictions['prophet_forecast']
future_prices = prophet_forecast[['ds', 'yhat', 'yhat_lower', 'yhat_upper']]
# Create Forecast Visualization
forecast_fig = go.Figure()
forecast_fig.add_trace(go.Scatter(
x=future_prices['ds'],
y=future_prices['yhat'],
mode='lines',
name='Predicted Price',
line=dict(color='blue')
))
forecast_fig.add_trace(go.Scatter(
x=future_prices['ds'],
y=future_prices['yhat_upper'],
mode='lines',
name='Upper Bound',
line=dict(color='green', dash='dot')
))
forecast_fig.add_trace(go.Scatter(
x=future_prices['ds'],
y=future_prices['yhat_lower'],
mode='lines',
name='Lower Bound',
line=dict(color='red', dash='dot')
))
st.plotly_chart(forecast_fig)
# Comprehensive Warning
st.warning("""
⚠️ Trading Disclaimer:
- Predictions are probabilistic, NOT guaranteed
- Cryptocurrency markets are highly volatile
- Always conduct personal research
- Risk only what you can afford to lose
- Consult financial advisors before making decisions
""")
# Add a informative section about TON
st.markdown("### 💡 About TON (Toncoin)")
st.markdown("""
TON (The Open Network) is a high-performance blockchain designed for mass adoption:
- **Fast Transactions**: Up to 100,000 transactions per second
- **Low Fees**: Minimal transaction costs
- **Developed by Telegram**: Initial concept by Telegram's founder Pavel Durov
- **Decentralized**: Community-driven blockchain platform
- **Smart Contract Support**: Enables complex decentralized applications
""")
if __name__ == "__main__":
main()