File size: 3,392 Bytes
e74d865
 
 
 
 
 
 
 
 
 
bea8fed
e74d865
 
25a1e9c
e74d865
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
c567df4
e74d865
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
c567df4
e74d865
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
import streamlit as st
import pandas as pd
import plotly.express as px
from data_loader import load_data
from indicators import calculate_indicators
from ai_insights import get_ai_insight
from portfolio_optimiser import optimize_portfolio
import os

# Streamlit UI
st.title("AI-Powered Stock Analysis and Portfolio Optimisation Tool")

# User Inputs
tickers = st.text_input("Enter stock tickers (comma-separated, e.g., TSLA, AAPL, MSFT):", "")
tickers = [ticker.strip().upper() for ticker in tickers.split(",")]

start_date = st.date_input("Start Date:", value=pd.to_datetime("2024-01-01"))
end_date = st.date_input("End Date:", value=pd.to_datetime("2025-01-01"))

ma_window = st.slider("Moving Average Window:", min_value=5, max_value=50, value=20)
rsi_window = st.slider("RSI Window:", min_value=5, max_value=30, value=14)
macd_fast = st.slider("MACD Fast Period:", min_value=5, max_value=30, value=12)
macd_slow = st.slider("MACD Slow Period:", min_value=20, max_value=50, value=26)
macd_signal = st.slider("MACD Signal Period:", min_value=5, max_value=20, value=9)

risk_tolerance = st.slider("Risk Tolerance (0-1):", min_value=0.0, max_value=1.0, value=0.5, step=0.01)


def calculate_and_return_everything(data):
    # Calculate Indicators
    indicator_data = calculate_indicators(data, ma_window, rsi_window, macd_fast, macd_slow, macd_signal)
    if indicator_data is None:
        st.stop()

    # AI Insights
    st.subheader("💡 AI Insights")
    last_row = indicator_data.iloc[-1]

    api_key = st.secrets["OPENAI_API_KEY"]  # Ensure API key is set

    # Get AI insights for each indicator
    ma_insight = get_ai_insight("Moving Average", last_row['MA'], api_key)
    bb_insight = get_ai_insight("Bollinger Bands", f"Upper: {last_row['Upper_BB']}, Lower: {last_row['Lower_BB']}", api_key)
    rsi_insight = get_ai_insight("RSI", last_row['RSI'], api_key)
    macd_insight = get_ai_insight("MACD", last_row['MACD'], api_key)

    st.write(f"Moving Average: {ma_insight}")
    st.write(f"Bollinger Bands: {bb_insight}")
    st.write(f"RSI: {rsi_insight}")
    st.write(f"MACD: {macd_insight}")

    return indicator_data



if st.button("Analyse"):
    all_data = {}
    for i in tickers:
        # Load Data
        data = load_data(i, start_date, end_date) # Passing ticker instead of tickers
        if data is None:
            st.warning(f"No data found for {i}. Skipping...")
            continue
        st.subheader(f'Ticker: {i}')
        id = calculate_and_return_everything(data)
        if id is not None:
            all_data[i] = id

    if not all_data:
        st.warning("No valid data available for any of the tickers. Exiting analysis.")
        st.stop()

    # Portfolio Optimisation
    st.subheader("Portfolio Optimisation")

    # Extract closing prices for portfolio optimization
    close_prices = pd.DataFrame({ticker: all_data[ticker]['Close'] for ticker in all_data})

    print(close_prices.columns)

    asset_weights = optimize_portfolio(close_prices, risk_tolerance)
    if asset_weights:
        st.write("### Optimised Asset Allocation:")
        for ticker, weight in asset_weights.items():
            st.write(f"**{ticker}:** {weight:.4f}")
    else:
        st.write("Could not perform portfolio optimisation.")

print("Ensure that you have your OpenAI API set as environmental variable in Hugging Face Spaces for this script to work")