Tuesday, July 14, 2026
Python Saham

Membuat Dashboard Portofolio Saham dengan Streamlit dan Python

Pendahuluan

Banyak investor masih menggunakan Microsoft Excel untuk memantau portofolio saham mereka. Cara tersebut memang sederhana, tetapi memiliki beberapa keterbatasan, seperti data yang harus diperbarui secara manual, visualisasi yang kurang interaktif, serta sulit dikembangkan ketika jumlah saham semakin banyak.

Dengan bantuan Python, kita dapat mengotomatisasi proses tersebut. Bahkan, hanya dengan beberapa ratus baris kode, kita sudah bisa membuat dashboard yang mampu menampilkan harga saham terkini, grafik historis, performa harian, hingga informasi dasar perusahaan.

Salah satu framework yang sangat populer untuk membangun dashboard data adalah Streamlit. Framework ini memungkinkan kita membuat aplikasi web interaktif hanya menggunakan Python tanpa harus mempelajari HTML, CSS, maupun JavaScript.

Pada artikel ini kita akan membangun sebuah dashboard portofolio saham Indonesia menggunakan kombinasi:

  • Python
  • Streamlit
  • yfinance
  • Pandas
  • Plotly

Hasil akhirnya berupa aplikasi web sederhana yang dapat dijalankan secara lokal maupun di-deploy ke Streamlit Community Cloud, sehingga bisa diakses dari mana saja melalui browser.


Apa itu Streamlit?

Streamlit merupakan framework open source yang dirancang untuk membuat aplikasi web berbasis data secara cepat menggunakan Python.

Framework ini sangat populer di kalangan:

  • Data Analyst
  • Data Scientist
  • Machine Learning Engineer
  • Financial Analyst
  • Quantitative Researcher

Karena tampilannya modern dan API-nya sederhana, Streamlit menjadi pilihan utama ketika ingin membuat dashboard tanpa membangun backend dan frontend secara terpisah.

Contoh sederhana:

import streamlit as st

st.title("Hello Streamlit")

Simpan sebagai app.py, lalu jalankan:

streamlit run app.py

Dalam beberapa detik browser akan menampilkan aplikasi web sederhana.


Mengapa Menggunakan Streamlit?

Ada banyak alasan mengapa Streamlit cocok digunakan untuk membuat dashboard portofolio saham.

1. Mudah Dipelajari

Jika Anda sudah menguasai dasar Python, Anda hampir tidak perlu mempelajari bahasa lain.


2. Interaktif

Komponen seperti:

  • Dropdown
  • Slider
  • Date Picker
  • Checkbox
  • Button

dapat dibuat hanya dengan satu baris kode.


3. Cepat Dikembangkan

Dashboard yang biasanya membutuhkan ribuan baris HTML dan JavaScript dapat dibuat menggunakan beberapa ratus baris Python.


4. Terintegrasi dengan Pandas

Karena Streamlit dibuat untuk kebutuhan data science, library ini sangat cocok dipadukan dengan:

  • Pandas
  • NumPy
  • Matplotlib
  • Plotly
  • Scikit-learn
  • TensorFlow

5. Gratis

Streamlit bersifat open source dan dapat digunakan tanpa biaya.

Selain itu tersedia layanan Streamlit Community Cloud untuk melakukan deployment aplikasi secara gratis (dengan batasan tertentu).


Arsitektur Dashboard

Dashboard yang akan kita bangun memiliki alur seperti berikut.

Yahoo Finance
       │
       ▼
    yfinance
       │
       ▼
    Pandas
       │
       ▼
 Analisis Data
       │
       ▼
   Streamlit
       │
       ▼
 Browser

Penjelasan:

  • Yahoo Finance menyediakan data harga saham.
  • yfinance mengambil data tersebut melalui Python.
  • Pandas mengolah data menjadi DataFrame.
  • Streamlit menampilkan data dalam bentuk dashboard interaktif.
  • Pengguna mengakses dashboard melalui browser.

Arsitektur ini sederhana namun cukup kuat untuk berbagai kebutuhan analisis.


Persiapan Lingkungan

Pastikan Python telah terpasang.

Periksa versinya:

python --version

Misalnya:

Python 3.12.2

Membuat Virtual Environment

Disarankan menggunakan virtual environment agar dependensi proyek tetap terisolasi.

Linux/macOS:

python -m venv venv

source venv/bin/activate

Windows:

python -m venv venv

venv\Scripts\activate

Install Library

Install semua library yang diperlukan.

pip install streamlit

Kemudian:

pip install yfinance

Install Pandas:

pip install pandas

Install Plotly:

pip install plotly

Atau sekaligus:

pip install streamlit pandas yfinance plotly

Cek instalasi:

streamlit --version

Jika berhasil akan muncul versi Streamlit yang terpasang.


Struktur Project

Buat struktur folder seperti berikut.

stock-dashboard/

│
├── app.py
├── requirements.txt
├── README.md
└── assets/

Keterangan:

  • app.py → aplikasi utama Streamlit
  • requirements.txt → daftar library
  • README.md → dokumentasi proyek
  • assets/ → logo, gambar, atau ikon

Struktur sederhana ini memudahkan pengelolaan proyek dan deployment.


Membuat File requirements.txt

Isi file requirements.txt sebagai berikut.

streamlit
yfinance
pandas
plotly

File ini berguna ketika proyek akan dijalankan di komputer lain atau di-deploy ke cloud.

Instal semua dependensi dengan satu perintah:

pip install -r requirements.txt

Membuat Dashboard Pertama

Buat file app.py.

import streamlit as st

st.title("Dashboard Portofolio Saham")

st.write("Selamat datang di Dashboard Saham Indonesia")

Jalankan:

streamlit run app.py

Browser akan terbuka otomatis dan menampilkan halaman sederhana dengan judul serta teks sambutan.


Mengambil Data Saham Menggunakan yfinance

Sekarang kita mulai mengambil data saham Indonesia.

import yfinance as yf

ticker = yf.Ticker("BBCA.JK")

data = ticker.history(period="1y")

print(data.head())

Data yang diperoleh berupa DataFrame Pandas.

Kolomnya meliputi:

  • Open
  • High
  • Low
  • Close
  • Volume
  • Dividends
  • Stock Splits

Data inilah yang nantinya akan ditampilkan dalam dashboard.


Menampilkan Data di Streamlit

Tambahkan kode berikut ke app.py.

import streamlit as st
import yfinance as yf

st.title("Dashboard Portofolio Saham")

ticker = yf.Ticker("BBCA.JK")

df = ticker.history(period="1y")

st.dataframe(df)

Simpan file, maka Streamlit akan memperbarui tampilan secara otomatis dan menampilkan tabel data historis BBCA.

Salah satu kelebihan Streamlit adalah fitur hot reload, sehingga setiap perubahan pada kode langsung terlihat di browser tanpa perlu menjalankan ulang aplikasi.


Menampilkan Data Terakhir

Sering kali kita hanya ingin melihat data perdagangan terbaru.

st.subheader("Data Terakhir")

st.dataframe(df.tail())

Dengan demikian pengguna dapat langsung melihat beberapa baris data paling baru tanpa harus menggulir seluruh tabel.


Menampilkan Statistik Dasar

Pandas menyediakan fungsi describe() untuk menghasilkan ringkasan statistik.

st.subheader("Statistik")

st.dataframe(df.describe())

Outputnya mencakup:

  • Count
  • Mean
  • Standard Deviation
  • Minimum
  • Maximum
  • Quartile

Informasi ini berguna sebagai gambaran awal kondisi data.


Menampilkan Harga Penutupan Terakhir

Tambahkan informasi harga penutupan terbaru agar dashboard lebih informatif.

last_price = df["Close"].iloc[-1]

st.metric(
    label="Harga Terakhir",
    value=f"Rp {last_price:,.0f}"
)

Komponen st.metric() akan menampilkan angka utama dengan tampilan yang lebih menarik dibanding teks biasa. Nantinya pada bagian berikutnya kita akan menambahkan perubahan harga harian (daily change) sehingga pengguna dapat melihat apakah harga sedang naik atau turun.

Membuat Sidebar

Daripada menulis kode saham langsung di program, lebih baik biarkan pengguna memilih saham dari sidebar.

import streamlit as st

ticker = st.sidebar.selectbox(
    "Pilih Saham",
    (
        "BBCA.JK",
        "BBRI.JK",
        "BMRI.JK",
        "BBNI.JK",
        "TLKM.JK",
        "ASII.JK",
        "GOTO.JK"
    )
)

Sekarang pengguna cukup memilih saham melalui dropdown.


Memilih Periode Data

Tambahkan pilihan periode agar dashboard lebih fleksibel.

period = st.sidebar.selectbox(
    "Periode",
    (
        "1mo",
        "3mo",
        "6mo",
        "1y",
        "2y",
        "5y"
    )
)

Kemudian ubah kode download menjadi:

import yfinance as yf

df = yf.download(
    ticker,
    period=period,
    progress=False
)

Dashboard sekarang dapat digunakan untuk berbagai kebutuhan analisis.


Menampilkan Nama Dashboard

Gunakan judul dinamis.

st.title("Dashboard Portofolio Saham")

st.subheader(ticker)

Jika pengguna memilih BBRI.JK, judul otomatis berubah.


Membuat KPI Cards

Dashboard profesional biasanya memiliki kartu ringkasan di bagian atas.

Misalnya:

  • Harga terakhir
  • Harga tertinggi
  • Harga terendah
  • Volume

Streamlit menyediakan st.columns().

col1, col2, col3, col4 = st.columns(4)

Hitung nilainya.

last_price = df["Close"].iloc[-1]

high_price = df["High"].max()

low_price = df["Low"].min()

volume = df["Volume"].iloc[-1]

Tampilkan.

col1.metric(
    "Harga Terakhir",
    f"Rp {last_price:,.0f}"
)

col2.metric(
    "High",
    f"Rp {high_price:,.0f}"
)

col3.metric(
    "Low",
    f"Rp {low_price:,.0f}"
)

col4.metric(
    "Volume",
    f"{volume:,.0f}"
)

Hasilnya akan terlihat jauh lebih profesional dibanding hanya menampilkan angka biasa.


Menghitung Return Harian

Tambahkan informasi perubahan harga.

change = (
    df["Close"].iloc[-1]
    -
    df["Close"].iloc[-2]
)

Persentase perubahan:

change_percent = (
    change
    /
    df["Close"].iloc[-2]
) * 100

Tampilkan.

col1.metric(
    "Harga",
    f"Rp {last_price:,.0f}",
    f"{change_percent:.2f}%"
)

Jika harga naik, Streamlit akan otomatis memberi indikator positif. Jika turun, indikator akan berubah sesuai nilai yang diberikan.


Membuat Grafik Harga

Gunakan Plotly.

import plotly.express as px

fig = px.line(
    df,
    y="Close",
    title="Harga Penutupan"
)

st.plotly_chart(
    fig,
    use_container_width=True
)

Grafik dapat diperbesar, diperkecil, dan di-hover untuk melihat nilai setiap titik.


Membuat Grafik Volume

Visualisasi volume membantu melihat aktivitas perdagangan.

fig = px.bar(
    df,
    y="Volume",
    title="Volume Perdagangan"
)

st.plotly_chart(
    fig,
    use_container_width=True
)

Pengguna dapat melihat lonjakan volume yang sering berkaitan dengan pergerakan harga signifikan.


Membuat Candlestick Chart

Candlestick merupakan visualisasi yang paling umum digunakan dalam analisis teknikal.

import plotly.graph_objects as go

Buat grafik.

fig = go.Figure(
    data=[
        go.Candlestick(
            x=df.index,
            open=df["Open"],
            high=df["High"],
            low=df["Low"],
            close=df["Close"]
        )
    ]
)

st.plotly_chart(
    fig,
    use_container_width=True
)

Grafik ini memberikan informasi lengkap mengenai harga pembukaan, tertinggi, terendah, dan penutupan.


Menambahkan Moving Average

Tambahkan dua garis Moving Average.

df["MA20"] = (
    df["Close"]
    .rolling(20)
    .mean()
)

df["MA50"] = (
    df["Close"]
    .rolling(50)
    .mean()
)

Kemudian tambahkan ke grafik.

fig.add_trace(
    go.Scatter(
        x=df.index,
        y=df["MA20"],
        name="MA20"
    )
)

fig.add_trace(
    go.Scatter(
        x=df.index,
        y=df["MA50"],
        name="MA50"
    )
)

Dashboard kini mampu membantu pengguna mengidentifikasi tren harga.


Menampilkan Data Terbaru

Tambahkan tabel ringkas.

st.subheader("Data Terakhir")

st.dataframe(
    df.tail(10)
)

Tabel ini memudahkan pengguna memeriksa data terkini tanpa harus melihat seluruh riwayat.


Membandingkan Dua Saham

Tambahkan pilihan multiselect.

stocks = st.sidebar.multiselect(
    "Bandingkan Saham",
    [
        "BBCA.JK",
        "BBRI.JK",
        "BMRI.JK",
        "TLKM.JK"
    ],
    default=[
        "BBCA.JK",
        "BBRI.JK"
    ]
)

Ambil data.

compare = yf.download(
    stocks,
    period=period,
    progress=False
)["Close"]

Tampilkan grafik.

fig = px.line(
    compare,
    title="Perbandingan Harga Saham"
)

st.plotly_chart(
    fig,
    use_container_width=True
)

Grafik ini memudahkan pengguna membandingkan performa beberapa saham dalam satu tampilan.


Menampilkan Return Seluruh Saham

Hitung return masing-masing saham.

returns = {}

for stock in stocks:

    data = yf.download(
        stock,
        period=period,
        progress=False
    )

    ret = (
        data["Close"].iloc[-1]
        -
        data["Close"].iloc[0]
    ) / data["Close"].iloc[0]

    returns[stock] = ret * 100

Ubah menjadi DataFrame.

import pandas as pd

result = pd.DataFrame(
    returns.items(),
    columns=[
        "Ticker",
        "Return (%)"
    ]
)

st.dataframe(result)

Dengan cara ini pengguna dapat langsung melihat saham mana yang memberikan kinerja terbaik pada periode yang dipilih.


Download CSV

Tambahkan tombol unduh.

csv = df.to_csv().encode("utf-8")

st.download_button(
    "Download CSV",
    csv,
    file_name="data_saham.csv",
    mime="text/csv"
)

Fitur ini sangat berguna bagi pengguna yang ingin melakukan analisis lanjutan di Excel atau perangkat lunak lainnya.


Menggunakan Cache

Setiap kali pengguna mengubah pilihan, aplikasi akan mengunduh data kembali. Untuk mengurangi waktu tunggu, gunakan cache.

@st.cache_data
def load_data(ticker, period):

    return yf.download(
        ticker,
        period=period,
        progress=False
    )

Pemanggilan menjadi:

df = load_data(
    ticker,
    period
)

Cache akan mempercepat proses karena data yang sama tidak perlu diunduh berulang kali.


Layout Dashboard

Dashboard pada tahap ini memiliki struktur seperti berikut.

Dashboard Saham

Sidebar
│
├── Pilih Saham
├── Periode
└── Bandingkan Saham

--------------------------------

Harga
High
Low
Volume

--------------------------------

Grafik Candlestick

--------------------------------

Moving Average

--------------------------------

Volume

--------------------------------

Perbandingan Saham

--------------------------------

Data Historis

--------------------------------

Download CSV

Struktur ini sudah cukup lengkap untuk kebutuhan pemantauan portofolio sehari-hari.

Menghitung Nilai Portofolio

Misalkan kita memiliki portofolio sebagai berikut.

SahamJumlah LotHarga Beli
BBCA208.900
BBRI154.800
BMRI105.600

Dalam Python, data tersebut dapat disimpan dalam dictionary.

portfolio = {
    "BBCA.JK": {
        "lot":20,
        "buy_price":8900
    },
    "BBRI.JK":{
        "lot":15,
        "buy_price":4800
    },
    "BMRI.JK":{
        "lot":10,
        "buy_price":5600
    }
}

Kemudian hitung nilai investasinya.

total_value = 0

for ticker, item in portfolio.items():

    df = yf.download(
        ticker,
        period="5d",
        progress=False
    )

    current_price = df["Close"].iloc[-1]

    shares = item["lot"] * 100

    value = shares * current_price

    total_value += value

st.metric(
    "Total Nilai Portofolio",
    f"Rp {total_value:,.0f}"
)

Dashboard sekarang dapat menampilkan estimasi nilai portofolio berdasarkan harga terbaru.


Menghitung Profit dan Loss (PnL)

Investor tentu ingin mengetahui apakah investasinya sedang untung atau rugi.

total_cost = 0

total_market = 0

for ticker, item in portfolio.items():

    shares = item["lot"] * 100

    buy_value = shares * item["buy_price"]

    data = yf.download(
        ticker,
        period="5d",
        progress=False
    )

    current = data["Close"].iloc[-1]

    market_value = shares * current

    total_cost += buy_value

    total_market += market_value

profit = total_market - total_cost

Tampilkan hasilnya.

st.metric(
    "Profit / Loss",
    f"Rp {profit:,.0f}"
)

Menghitung Persentase Keuntungan

profit_percent = (
    profit
    /
    total_cost
) * 100

st.metric(
    "Return",
    f"{profit_percent:.2f}%"
)

Informasi ini membantu investor mengevaluasi performa investasinya secara keseluruhan.


Membuat Pie Chart Alokasi Portofolio

Visualisasi alokasi aset memudahkan kita melihat komposisi investasi.

import plotly.express as px
import pandas as pd

allocation = []

for ticker, item in portfolio.items():

    df = yf.download(
        ticker,
        period="5d",
        progress=False
    )

    current = df["Close"].iloc[-1]

    value = current * item["lot"] * 100

    allocation.append({
        "Ticker": ticker,
        "Value": value
    })

portfolio_df = pd.DataFrame(allocation)

fig = px.pie(
    portfolio_df,
    names="Ticker",
    values="Value",
    title="Alokasi Portofolio"
)

st.plotly_chart(
    fig,
    use_container_width=True
)

Pie chart membantu mengetahui apakah investasi sudah cukup terdiversifikasi atau masih terlalu terpusat pada satu emiten.


Menampilkan Tabel Portofolio

rows = []

for ticker, item in portfolio.items():

    data = yf.download(
        ticker,
        period="5d",
        progress=False
    )

    current = data["Close"].iloc[-1]

    rows.append({
        "Ticker": ticker,
        "Lot": item["lot"],
        "Harga Beli": item["buy_price"],
        "Harga Sekarang": current
    })

table = pd.DataFrame(rows)

st.dataframe(table)

Tabel ini memudahkan pengguna membandingkan harga beli dengan harga pasar saat ini.


Menambahkan Filter Tanggal

Gunakan date_input.

start = st.sidebar.date_input(
    "Tanggal Awal"
)

end = st.sidebar.date_input(
    "Tanggal Akhir"
)

Kemudian:

df = yf.download(
    ticker,
    start=start,
    end=end,
    progress=False
)

Pengguna kini dapat memilih periode analisis secara lebih fleksibel.


Menambahkan Auto Refresh

Jika ingin dashboard selalu menampilkan data terbaru, gunakan tombol refresh.

if st.button("Refresh"):

    st.cache_data.clear()

    st.rerun()

Cara ini berguna ketika pasar sedang buka dan harga berubah secara berkala.


Mempercantik Tampilan

Tambahkan layout lebar.

st.set_page_config(
    page_title="Dashboard Saham",
    layout="wide"
)

Tambahkan judul.

st.title("📈 Dashboard Portofolio Saham Indonesia")

Tambahkan sidebar.

st.sidebar.title("Menu")

Sentuhan kecil seperti ikon dan layout lebar membuat aplikasi terasa lebih profesional.


Deployment ke Streamlit Community Cloud

Setelah dashboard selesai, Anda dapat membagikannya secara online.

Langkah-langkah umum:

  1. Unggah project ke GitHub.
  2. Pastikan terdapat file requirements.txt.
  3. Masuk ke Streamlit Community Cloud.
  4. Hubungkan akun GitHub.
  5. Pilih repository dan file app.py.
  6. Klik Deploy.

Dalam beberapa menit aplikasi akan memiliki URL publik yang dapat diakses melalui browser.


Deployment Menggunakan Docker

Bagi yang ingin menjalankan dashboard di VPS atau server sendiri, Docker adalah pilihan yang praktis.

Contoh Dockerfile:

FROM python:3.12-slim

WORKDIR /app

COPY . .

RUN pip install -r requirements.txt

EXPOSE 8501

CMD [
    "streamlit",
    "run",
    "app.py",
    "--server.address=0.0.0.0"
]

Build image:

docker build -t stock-dashboard .

Jalankan container:

docker run -p 8501:8501 stock-dashboard

Dashboard kemudian dapat diakses melalui browser pada port 8501.


Ide Pengembangan Lanjutan

Dashboard ini masih dapat dikembangkan lebih jauh, misalnya dengan menambahkan:

  • Login pengguna.
  • Penyimpanan portofolio ke database PostgreSQL atau MySQL.
  • Notifikasi harga melalui Telegram.
  • Prediksi harga menggunakan machine learning.
  • Analisis sentimen berita saham.
  • Integrasi dengan OpenAI atau Ollama untuk membuat ringkasan kondisi pasar.
  • Heatmap sektor saham.
  • Watchlist pribadi.
  • Export laporan ke PDF atau Excel.

Dengan fitur-fitur tersebut, dashboard akan berkembang menjadi aplikasi investasi yang lebih lengkap.


Best Practice

Beberapa praktik yang saya rekomendasikan ketika mengembangkan aplikasi Streamlit:

  • Gunakan st.cache_data untuk mengurangi jumlah request ke Yahoo Finance.
  • Pisahkan logika pengambilan data ke dalam fungsi atau modul tersendiri.
  • Simpan konfigurasi seperti daftar ticker dalam file konfigurasi agar mudah diperbarui.
  • Tangani kemungkinan error, misalnya ketika data tidak tersedia atau koneksi internet bermasalah.
  • Gunakan virtual environment dan requirements.txt agar lingkungan pengembangan konsisten.

Kesimpulan

Dengan memanfaatkan Python, Streamlit, dan yfinance, kita dapat membangun dashboard portofolio saham yang modern tanpa perlu menulis kode HTML, CSS, atau JavaScript.

Dalam artikel ini kita telah mempelajari:

  • Instalasi Streamlit dan library pendukung.
  • Mengambil data saham Indonesia dari Yahoo Finance.
  • Menampilkan tabel dan grafik interaktif.
  • Membuat KPI Cards untuk harga, volume, dan return.
  • Membandingkan beberapa saham sekaligus.
  • Menghitung nilai portofolio dan keuntungan/rugi.
  • Menampilkan pie chart alokasi aset.
  • Menambahkan filter tanggal dan fitur refresh.
  • Mendeploy aplikasi ke Streamlit Community Cloud maupun Docker.

Dashboard ini dapat menjadi fondasi untuk berbagai proyek, mulai dari pemantauan investasi pribadi hingga aplikasi analisis saham yang lebih kompleks.


FAQ

Apakah Streamlit gratis?

Ya. Streamlit bersifat open source dan dapat digunakan secara gratis. Untuk kebutuhan sederhana, Streamlit Community Cloud juga menyediakan layanan hosting gratis.

Apakah dashboard ini cocok untuk investor pemula?

Ya. Dashboard ini membantu memvisualisasikan data saham dengan cara yang mudah dipahami, sehingga cocok sebagai sarana belajar maupun memantau portofolio.

Apakah saya bisa menggunakan data selain Yahoo Finance?

Bisa. Anda dapat mengganti sumber data dengan API lain seperti Alpha Vantage, Finnhub, Polygon.io, atau penyedia data resmi Bursa Efek Indonesia, selama format datanya disesuaikan.

Apakah dashboard ini bisa dijalankan di VPS?

Bisa. Dashboard dapat dijalankan langsung di server Linux menggunakan Python, atau dikemas dalam Docker agar lebih mudah dipindahkan dan dikelola.

Bagaimana jika saya ingin menambahkan autentikasi pengguna?

Streamlit dapat diintegrasikan dengan berbagai mekanisme autentikasi, misalnya melalui OAuth, Keycloak, atau layanan identitas lainnya, sehingga setiap pengguna memiliki portofolio dan pengaturan masing-masing.

Similar Posts

Leave a Reply

Your email address will not be published. Required fields are marked *