Py.Cafe

a.grover/

Stocksim

Streamlit on Pycafe: Interactive Examples

DocsPricing
  • app.py
  • requirements.txt
  • stocksim.py
app.py
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
import streamlit as st
import random

# ---------------- SETUP SESSION STATE ----------------
if "bal" not in st.session_state:
    st.session_state.bal = 1000

if "market" not in st.session_state:
    st.session_state.market = {
        "Nvidia": 200,
        "Roblox": 50,
        "Google": 100,
        "Tesla": 115,
    }

if "owned" not in st.session_state:
    st.session_state.owned = {}

# ---------------- HEADER ----------------
st.title("๐Ÿ“ˆ Stock Simulator 1.1.0")
st.write("You start with **$1000**. Everything is random. Good luck!")

# ---------------- MENU ----------------
choice = st.selectbox(
    "Choose an action:",
    ["View Market", "Buy Stocks", "Sell Stocks", "My Portfolio", "Simulate Time"]
)

# ---------------- VIEW MARKET ----------------
if choice == "View Market":
    st.subheader("๐Ÿ“Š Market Prices")
    st.write(st.session_state.market)

# ---------------- PORTFOLIO ----------------
elif choice == "My Portfolio":
    st.subheader("๐Ÿ’ผ Your Portfolio")
    st.write("Owned stocks:", st.session_state.owned)
    st.write("Balance: $", st.session_state.bal)

# ---------------- BUY STOCKS ----------------
elif choice == "Buy Stocks":
    stock = st.selectbox("Select stock to buy", st.session_state.market.keys())
    shares = st.number_input("How many shares?", min_value=1, step=1)

    price = st.session_state.market[stock] * shares

    if st.button("Buy"):
        if st.session_state.bal >= price:
            st.session_state.bal -= price
            st.session_state.owned[stock] = st.session_state.owned.get(stock, 0) + shares
            st.success("Stock purchased!")
        else:
            st.error("Insufficient funds")

# ---------------- SELL STOCKS ----------------
elif choice == "Sell Stocks":
    if not st.session_state.owned:
        st.warning("You donโ€™t own any stocks")
    else:
        stock = st.selectbox("Select stock to sell", st.session_state.owned.keys())
        max_shares = st.session_state.owned[stock]
        shares = st.number_input("How many shares?", min_value=1, max_value=max_shares, step=1)

        if st.button("Sell"):
            price = st.session_state.market[stock] * shares
            st.session_state.bal += price
            st.session_state.owned[stock] -= shares

            if st.session_state.owned[stock] == 0:
                del st.session_state.owned[stock]

            st.success("Stock sold!")

# ---------------- SIMULATION ----------------
elif choice == "Simulate Time":
    period = st.selectbox("Simulate:", ["Day", "Week", "Month", "Year"])

    if st.button("Simulate"):
        ranges = {
            "Day": 5,
            "Week": 20,
            "Month": 50,
            "Year": 200,
        }

        for stock in st.session_state.market:
            st.session_state.market[stock] += random.randint(
                -ranges[period], ranges[period]
            )

        st.success(f"{period} simulated!")
        st.write(st.session_state.market)