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 Streamlitrequirements.txt→ daftar libraryREADME.md→ dokumentasi proyekassets/→ 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.
| Saham | Jumlah Lot | Harga Beli |
|---|---|---|
| BBCA | 20 | 8.900 |
| BBRI | 15 | 4.800 |
| BMRI | 10 | 5.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:
- Unggah project ke GitHub.
- Pastikan terdapat file
requirements.txt. - Masuk ke Streamlit Community Cloud.
- Hubungkan akun GitHub.
- Pilih repository dan file
app.py. - 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_datauntuk 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.txtagar 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.
