|
|
import os |
|
|
import pandas as pd |
|
|
import numpy as np |
|
|
import streamlit as st |
|
|
import plotly.express as px |
|
|
from sklearn.linear_model import LinearRegression |
|
|
from sklearn.preprocessing import StandardScaler |
|
|
from dotenv import load_dotenv |
|
|
import cloudscraper |
|
|
|
|
|
|
|
|
load_dotenv() |
|
|
API_KEY = os.environ.get("API_KEY") |
|
|
|
|
|
|
|
|
if not API_KEY: |
|
|
raise ValueError("API_KEY is not set. Please add it to your environment.") |
|
|
|
|
|
|
|
|
def fetch_market_data(api_key, url): |
|
|
"""Fetch market data using cloudscraper.""" |
|
|
headers = { |
|
|
"Authorization": f"Bearer {api_key}", |
|
|
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36" |
|
|
} |
|
|
scraper = cloudscraper.create_scraper() |
|
|
response = scraper.get(url, headers=headers) |
|
|
response.raise_for_status() |
|
|
return response.json() |
|
|
|
|
|
def preprocess_data(data): |
|
|
"""Preprocess market data for AI analysis.""" |
|
|
df = pd.DataFrame(data) |
|
|
if 'close_time' in df.columns: |
|
|
df['close_time'] = pd.to_datetime(df['close_time'], unit='ms', errors='coerce') |
|
|
return df |
|
|
|
|
|
def train_predictive_model(df): |
|
|
"""Train a simple predictive model based on historical data.""" |
|
|
if 'close' not in df.columns or len(df) < 10: |
|
|
return None |
|
|
|
|
|
|
|
|
scaler = StandardScaler() |
|
|
X = np.arange(len(df)).reshape(-1, 1) |
|
|
y = df['close'].values.reshape(-1, 1) |
|
|
X_scaled = scaler.fit_transform(X) |
|
|
|
|
|
|
|
|
model = LinearRegression() |
|
|
model.fit(X_scaled, y) |
|
|
|
|
|
|
|
|
future_indices = np.arange(len(df), len(df) + 10).reshape(-1, 1) |
|
|
future_indices_scaled = scaler.transform(future_indices) |
|
|
predictions = model.predict(future_indices_scaled) |
|
|
|
|
|
return predictions |
|
|
|
|
|
def display_predictions(predictions): |
|
|
"""Display predictions in a Streamlit chart.""" |
|
|
future_dates = pd.date_range(start=pd.Timestamp.now(), periods=len(predictions), freq='H') |
|
|
prediction_df = pd.DataFrame({'Date': future_dates, 'Predicted Close': predictions.flatten()}) |
|
|
|
|
|
fig = px.line(prediction_df, x='Date', y='Predicted Close', title="Predicted Price Movement") |
|
|
st.plotly_chart(fig) |
|
|
|
|
|
|
|
|
def main(): |
|
|
st.title("AI-Driven Stock & Crypto Dashboard") |
|
|
|
|
|
|
|
|
url_active_markets = "https://archeanvision.com/api/signals/available" |
|
|
try: |
|
|
active_markets = fetch_market_data(API_KEY, url_active_markets) |
|
|
market_list = [market['market'] for market in active_markets] |
|
|
selected_market = st.selectbox("Select a Market", market_list) |
|
|
|
|
|
|
|
|
url_market_data = f"https://archeanvision.com/api/signals/{selected_market}/data" |
|
|
market_data = fetch_market_data(API_KEY, url_market_data) |
|
|
|
|
|
|
|
|
df = preprocess_data(market_data) |
|
|
st.write("Market Data Overview:") |
|
|
st.dataframe(df.head()) |
|
|
|
|
|
|
|
|
predictions = train_predictive_model(df) |
|
|
if predictions is not None: |
|
|
st.write(f"Predicted price movement for {selected_market}:") |
|
|
display_predictions(predictions) |
|
|
else: |
|
|
st.warning("Insufficient data or missing 'close' column for prediction.") |
|
|
|
|
|
except Exception as e: |
|
|
st.error(f"Error fetching or processing data: {e}") |
|
|
|
|
|
if __name__ == "__main__": |
|
|
main() |
|
|
|