File size: 3,973 Bytes
5fcda4c
36a9c04
 
 
 
 
 
 
 
5fcda4c
 
 
 
36a9c04
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5fcda4c
36a9c04
 
 
 
 
 
 
 
 
 
 
5fcda4c
 
36a9c04
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5fcda4c
36a9c04
 
 
 
 
 
 
 
 
 
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
# Import libraries
import streamlit as st
import yfinance as yf
from statsmodels.tsa.arima.model import ARIMA
import pandas as pd
import matplotlib.pyplot as plt

# Title and description
st.title("Algorithmic Trading Bot with ARIMA")
st.write(
    "This app simulates an algorithmic trading bot using the ARIMA model for price prediction. "
    "The bot predicts future stock prices and simulates trades based on the predicted trends."
)

# Sidebar for user inputs
st.sidebar.title("Settings")
ticker = st.sidebar.text_input("Stock Ticker (e.g., AAPL, TSLA, ^GSPC):", value="^GSPC")
start_date = st.sidebar.date_input("Start Date", value=pd.to_datetime("2015-01-01"))
end_date = st.sidebar.date_input("End Date", value=pd.to_datetime("2023-12-31"))
n_days = st.sidebar.slider("Prediction Horizon (days)", min_value=1, max_value=30, value=7)
initial_balance = st.sidebar.number_input("Initial Balance (USD):", value=10000.0)
arima_order = st.sidebar.text_input("ARIMA Order (p, d, q):", value="5,1,0")

# Parse ARIMA order
try:
    p, d, q = map(int, arima_order.split(","))
except ValueError:
    st.error("Invalid ARIMA order. Please enter in the format 'p,d,q'.")

# Fetch historical data
st.write("### Historical Data")
try:
    data = yf.download(ticker, start=start_date, end=end_date)
    data = data["Close"]
    st.line_chart(data)
except Exception as e:
    st.error(f"Error fetching data: {e}")

# Trading Bot Simulation
if st.button("Run Trading Bot"):
    st.write("### Trading Bot Simulation")
    
    if len(data) < 30:
        st.error("Not enough data to train the model. Please select a longer date range.")
    else:
        try:
            # Train ARIMA model
            model = ARIMA(data, order=(p, d, q))
            fitted_model = model.fit()

            # Predict future prices
            future_index = pd.date_range(start=data.index[-1], periods=n_days + 1, freq="B")[1:]
            forecast = fitted_model.forecast(steps=n_days)
            st.write("### Debug: Forecasted Prices")
            st.write(pd.DataFrame({"Date": future_index, "Predicted Price": forecast}))

            # Simulate trading
            balance = initial_balance
            position = 0  # Number of shares held
            trades = []

            for i in range(1, len(forecast)):
                if forecast[i] > forecast[i - 1]:  # Buy signal
                    if position == 0:
                        position = balance / forecast[i]
                        balance = 0
                        trades.append((future_index[i], "BUY", forecast[i]))
                elif forecast[i] < forecast[i - 1]:  # Sell signal
                    if position > 0:
                        balance = position * forecast[i]
                        position = 0
                        trades.append((future_index[i], "SELL", forecast[i]))

            # Final balance
            final_balance = balance + (position * forecast[-1] if position > 0 else 0)
            profit = final_balance - initial_balance

            # Show results
            st.write(f"### Final Balance: ${final_balance:,.2f}")
            st.write(f"### Total Profit: ${profit:,.2f}")
            trades_df = pd.DataFrame(trades, columns=["Date", "Action", "Price"])
            st.write("### Trade History")
            st.write(trades_df)

            # Plot results
            plt.figure(figsize=(10, 6))
            plt.plot(data, label="Historical Data (USD/share)")
            plt.plot(future_index, forecast, label="Predicted Data (USD/share)", linestyle="--")
            for trade in trades:
                plt.scatter(trade[0], trade[2], label=trade[1], color="green" if trade[1] == "BUY" else "red")
            plt.legend()
            plt.title("Algorithmic Trading Bot Simulation")
            plt.xlabel("Date")
            plt.ylabel("Price (USD/share)")
            st.pyplot(plt)

        except Exception as e:
            st.error(f"Error in trading bot simulation: {e}")