Pendahuluan
Dalam dunia investasi modern, data merupakan aset yang sangat berharga. Hampir semua proses analisis saham, mulai dari analisis teknikal, backtesting strategi, hingga machine learning membutuhkan data historis harga saham.
Untungnya, kita tidak perlu membuat aplikasi crawling sendiri untuk memperoleh data tersebut. Salah satu library Python yang paling populer adalah yfinance. Library ini memungkinkan kita mengambil data harga saham langsung dari Yahoo Finance hanya dengan beberapa baris kode.
Keuntungan menggunakan yfinance antara lain:
- Gratis digunakan
- Mudah dipelajari
- Mendukung ribuan saham di seluruh dunia
- Mendukung saham Indonesia (BEI)
- Dapat mengambil data historis bertahun-tahun
- Mendukung data dividen dan stock split
- Cocok untuk analisis data maupun backtesting
Pada artikel ini kita akan belajar mulai dari instalasi hingga mengambil data historis saham Indonesia menggunakan Python.
Apa itu yfinance?
yfinance adalah library Python yang digunakan untuk mengakses data Yahoo Finance.
Library ini dikembangkan agar programmer dapat memperoleh informasi seperti:
- Harga Open
- Harga High
- Harga Low
- Harga Close
- Adjusted Close
- Volume
- Dividen
- Stock Split
- Informasi perusahaan
- Data fundamental sederhana
Karena mudah digunakan, library ini menjadi salah satu pilihan utama bagi data scientist, quant analyst, maupun investor yang ingin melakukan analisis otomatis.
Persiapan
Pastikan Python sudah terpasang.
Cek versi Python:
python --version
atau
python3 --version
Misalnya hasilnya:
Python 3.12.1
Membuat Virtual Environment
Disarankan menggunakan virtual environment agar project tetap rapi.
python -m venv venv
Aktifkan virtual environment.
Linux/Mac
source venv/bin/activate
Windows
venv\Scripts\activate
Install Library
Install library yang diperlukan.
pip install yfinance
Selain itu kita juga akan menggunakan pandas.
pip install pandas
Jika ingin membuat visualisasi nanti:
pip install matplotlib
Install sekaligus:
pip install yfinance pandas matplotlib
Mengenal Ticker Saham Indonesia
Yahoo Finance menggunakan kode khusus.
Formatnya adalah:
KODE.EMITEN + .JK
Contoh:
| Perusahaan | Kode Yahoo |
|---|---|
| Bank Central Asia | BBCA.JK |
| Bank Rakyat Indonesia | BBRI.JK |
| Bank Mandiri | BMRI.JK |
| Telkom Indonesia | TLKM.JK |
| Astra International | ASII.JK |
| GoTo | GOTO.JK |
| Amman Mineral | AMMN.JK |
| BNI | BBNI.JK |
| Indofood | INDF.JK |
| Unilever Indonesia | UNVR.JK |
Suffix .JK menunjukkan bahwa saham tersebut berasal dari Bursa Efek Indonesia (Jakarta Stock Exchange).
Mengambil Data Saham Pertama
Mari kita ambil data saham BBCA.
import yfinance as yf
ticker = yf.Ticker("BBCA.JK")
data = ticker.history(period="1mo")
print(data)
Outputnya kira-kira:
Open High Low Close Volume
Date
2026-05-01 9100 9200 9050 9180 23500000
2026-05-02 9180 9240 9100 9200 18200000
...
Data yang diperoleh berupa DataFrame dari Pandas sehingga mudah diproses lebih lanjut.
Penjelasan Kolom
Secara default kita akan memperoleh beberapa kolom berikut.
Open
Harga pembukaan perdagangan.
Contoh:
9100
Artinya saham dibuka pada harga Rp9.100.
High
Harga tertinggi hari itu.
9250
Low
Harga terendah.
9050
Close
Harga penutupan perdagangan.
9200
Volume
Jumlah saham yang diperdagangkan.
25000000
Semakin besar volume biasanya menunjukkan transaksi yang semakin aktif.
Mengambil Data Selama 5 Tahun
Menggunakan parameter period.
import yfinance as yf
ticker = yf.Ticker("BBCA.JK")
data = ticker.history(period="5y")
print(data)
Pilihan period cukup banyak.
| Period | Keterangan |
|---|---|
| 1d | 1 Hari |
| 5d | 5 Hari |
| 1mo | 1 Bulan |
| 3mo | 3 Bulan |
| 6mo | 6 Bulan |
| 1y | 1 Tahun |
| 2y | 2 Tahun |
| 5y | 5 Tahun |
| 10y | 10 Tahun |
| max | Semua data |
Jika ingin melakukan backtesting, biasanya data 5–10 tahun sudah cukup representatif.
Mengambil Data Berdasarkan Tanggal
Kita juga bisa menentukan tanggal mulai dan selesai.
import yfinance as yf
ticker = yf.Ticker("BBCA.JK")
data = ticker.history(
start="2024-01-01",
end="2024-12-31"
)
print(data)
Cara ini lebih fleksibel dibanding menggunakan parameter period.
Contohnya ketika ingin menganalisis performa saham selama tahun 2024 saja atau membandingkan kondisi pasar pada periode tertentu.
Menampilkan 5 Data Pertama
Karena data historis bisa sangat banyak, gunakan fungsi head().
print(data.head())
Sebaliknya, untuk melihat data terakhir gunakan:
print(data.tail())
Fungsi ini sangat membantu saat proses eksplorasi data (Exploratory Data Analysis/EDA).
Mengambil Banyak Saham Sekaligus
Salah satu kelebihan yfinance adalah kemampuannya mengambil data beberapa saham dalam satu kali request. Fitur ini sangat berguna ketika Anda ingin membandingkan performa beberapa emiten sekaligus atau membangun screener saham.
Misalnya kita ingin mengambil data saham perbankan Indonesia.
import yfinance as yf
tickers = [
"BBCA.JK",
"BBRI.JK",
"BMRI.JK",
"BBNI.JK"
]
data = yf.download(
tickers=tickers,
period="1mo",
group_by="ticker"
)
print(data)
Outputnya akan berbentuk MultiIndex DataFrame, di mana setiap ticker memiliki kolom:
- Open
- High
- Low
- Close
- Volume
Contoh mengakses harga penutupan BBCA:
print(data["BBCA.JK"]["Close"])
Sedangkan untuk melihat harga penutupan seluruh saham:
close = data.xs("Close", axis=1, level=1)
print(close)
Mengambil Data Menggunakan Interval
Selain data harian, yfinance juga mendukung interval waktu yang lebih kecil (tergantung ketersediaan data dari Yahoo Finance).
Contoh:
import yfinance as yf
data = yf.download(
"BBCA.JK",
period="5d",
interval="1h"
)
print(data)
Pilihan interval yang tersedia antara lain:
| Interval | Keterangan |
|---|---|
| 1m | 1 Menit |
| 2m | 2 Menit |
| 5m | 5 Menit |
| 15m | 15 Menit |
| 30m | 30 Menit |
| 60m | 1 Jam |
| 90m | 90 Menit |
| 1d | Harian |
| 1wk | Mingguan |
| 1mo | Bulanan |
Catatan: Data intraday biasanya hanya tersedia untuk rentang waktu tertentu. Untuk analisis historis jangka panjang, gunakan interval harian (
1d).
Menyimpan Data ke CSV
Setelah memperoleh data, langkah berikutnya biasanya adalah menyimpannya agar dapat digunakan kembali tanpa perlu mengunduh ulang.
import yfinance as yf
data = yf.download("BBCA.JK", period="5y")
data.to_csv("bbca.csv")
Hasilnya akan menghasilkan file:
bbca.csv
yang dapat dibuka menggunakan:
- Microsoft Excel
- LibreOffice Calc
- Google Sheets
- Pandas
Membaca Kembali File CSV
import pandas as pd
df = pd.read_csv("bbca.csv")
print(df.head())
Teknik ini sangat membantu ketika membangun pipeline analisis data.
Menyimpan ke Excel
Jika ingin membagikan data kepada pengguna non-programmer, format Excel sering kali lebih praktis.
data.to_excel("bbca.xlsx")
Pastikan library berikut telah terpasang:
pip install openpyxl
Menampilkan Grafik Harga Saham
Visualisasi merupakan bagian penting dalam analisis data.
Contoh grafik sederhana menggunakan Matplotlib:
import yfinance as yf
import matplotlib.pyplot as plt
data = yf.download("BBCA.JK", period="1y")
plt.figure(figsize=(12,6))
plt.plot(data["Close"])
plt.title("Harga Saham BBCA")
plt.xlabel("Tanggal")
plt.ylabel("Harga")
plt.grid(True)
plt.show()
Grafik tersebut akan memperlihatkan tren harga saham BBCA selama satu tahun terakhir.
Menghitung Moving Average (MA20)
Moving Average merupakan indikator teknikal yang paling sering digunakan.
Menghitung MA20 sangat mudah menggunakan Pandas.
data["MA20"] = data["Close"].rolling(20).mean()
Selanjutnya tampilkan grafik.
plt.figure(figsize=(12,6))
plt.plot(data["Close"], label="Close")
plt.plot(data["MA20"], label="MA20")
plt.legend()
plt.show()
Grafik ini membantu melihat kecenderungan tren harga dengan menghaluskan fluktuasi harian.
Menghitung Dua Moving Average Sekaligus
Strategi populer adalah menggunakan MA20 dan MA50.
data["MA20"] = data["Close"].rolling(20).mean()
data["MA50"] = data["Close"].rolling(50).mean()
Visualisasi:
plt.figure(figsize=(14,6))
plt.plot(data["Close"], label="Close")
plt.plot(data["MA20"], label="MA20")
plt.plot(data["MA50"], label="MA50")
plt.legend()
plt.show()
Strategi ini sering digunakan sebagai dasar untuk mengidentifikasi Golden Cross dan Death Cross.
Mengambil Informasi Perusahaan
Selain data harga, yfinance juga menyediakan informasi dasar perusahaan.
import yfinance as yf
ticker = yf.Ticker("BBCA.JK")
info = ticker.info
print(info)
Beberapa informasi yang dapat diperoleh antara lain:
- Nama perusahaan
- Sektor
- Industri
- Market Cap
- Currency
- Website
- Jumlah karyawan
- Ringkasan bisnis
Sebagai contoh:
print(info["longName"])
print(info["sector"])
print(info["industry"])
Data ini berguna untuk memperkaya dashboard analisis atau membuat filter berdasarkan sektor.
Mengambil Data Dividen
Untuk investor jangka panjang, informasi dividen sangat penting.
ticker = yf.Ticker("BBCA.JK")
print(ticker.dividends)
Output akan menampilkan tanggal pembayaran dividen beserta nilai dividen per saham.
Mengambil Data Stock Split
Jika perusahaan pernah melakukan stock split, datanya juga tersedia.
print(ticker.splits)
Informasi ini berguna saat melakukan analisis historis agar perubahan harga dapat dipahami dengan benar.
Mengambil Data Actions
Untuk melihat dividen dan stock split sekaligus:
print(ticker.actions)
Contoh output:
Dividends
Stock Splits
Mengambil Metadata Saham
ticker = yf.Ticker("BBCA.JK")
print(ticker.fast_info)
Biasanya berisi informasi ringkas seperti:
- Last Price
- Currency
- Exchange
- Time Zone
- Shares Outstanding
Metode ini lebih cepat dibanding ticker.info untuk kebutuhan tertentu.
Mengambil Daftar Banyak Saham Secara Otomatis
Jika Anda ingin menganalisis banyak saham sekaligus, buat daftar ticker dalam sebuah list.
import yfinance as yf
tickers = [
"BBCA.JK",
"BBRI.JK",
"BMRI.JK",
"BBNI.JK",
"TLKM.JK",
"ASII.JK",
"INDF.JK",
"ICBP.JK",
"GOTO.JK",
"AMMN.JK"
]
data = yf.download(
tickers=tickers,
period="1y",
group_by="ticker"
)
print(data)
Pendekatan ini cocok untuk membangun aplikasi:
- Stock Screener
- Dashboard Portofolio
- Backtesting
- Trading Bot
- Machine Learning
Mengambil Data Seluruh Saham BEI
Secara teori, yfinance dapat mengambil seluruh saham yang tersedia di Yahoo Finance. Namun, library ini tidak menyediakan daftar ticker BEI secara otomatis.
Cara yang umum dilakukan adalah:
- Mengunduh daftar emiten dari situs BEI.
- Menyimpannya ke file CSV.
- Membaca daftar tersebut menggunakan Pandas.
- Menambahkan akhiran
.JKpada setiap kode saham.
Contoh:
import pandas as pd
df = pd.read_csv("emiten.csv")
tickers = df["Kode"].apply(lambda x: f"{x}.JK").tolist()
print(tickers[:10])
Dengan cara ini Anda dapat memperbarui daftar emiten kapan saja tanpa mengubah kode program.
Membuat Screener Sederhana
Misalnya kita ingin mencari saham yang mengalami kenaikan harga pada hari terakhir.
import yfinance as yf
tickers = [
"BBCA.JK",
"BBRI.JK",
"BMRI.JK",
"BBNI.JK"
]
for ticker in tickers:
df = yf.download(
ticker,
period="5d",
progress=False
)
if len(df) >= 2:
last_close = df["Close"].iloc[-1]
previous_close = df["Close"].iloc[-2]
if last_close > previous_close:
print(f"{ticker} naik")
Contoh ini dapat dikembangkan menjadi screener yang lebih kompleks dengan indikator teknikal atau fundamental.
Menghitung Persentase Return
Menghitung return merupakan langkah dasar dalam analisis performa saham.
import yfinance as yf
data = yf.download(
"BBCA.JK",
period="1y"
)
return_pct = (
data["Close"].iloc[-1] -
data["Close"].iloc[0]
) / data["Close"].iloc[0] * 100
print(f"Return = {return_pct:.2f}%")
Hasilnya memberikan gambaran seberapa besar perubahan harga selama periode tersebut.
Menghitung Return Harian
data["Daily Return"] = data["Close"].pct_change()
Kolom baru ini sering digunakan sebagai dasar untuk:
- Volatilitas
- Risk Analysis
- Machine Learning
- Backtesting
Menghitung Moving Average 20, 50, dan 200 Hari
Strategi yang umum digunakan investor adalah mengamati tiga garis Moving Average.
data["MA20"] = data["Close"].rolling(20).mean()
data["MA50"] = data["Close"].rolling(50).mean()
data["MA200"] = data["Close"].rolling(200).mean()
Interpretasi sederhananya:
- MA20 menggambarkan tren jangka pendek.
- MA50 menggambarkan tren menengah.
- MA200 menggambarkan tren jangka panjang.
Banyak investor menggunakan kombinasi ini untuk membantu mengidentifikasi arah tren.
Menyimpan Semua Saham ke Folder
Jika ingin menyimpan setiap saham dalam file terpisah:
import os
import yfinance as yf
os.makedirs("data", exist_ok=True)
tickers = [
"BBCA.JK",
"BBRI.JK",
"BMRI.JK"
]
for ticker in tickers:
df = yf.download(
ticker,
period="5y",
progress=False
)
filename = f"data/{ticker}.csv"
df.to_csv(filename)
print(f"Saved {filename}")
Struktur folder akan menjadi:
project/
├── data/
│ ├── BBCA.JK.csv
│ ├── BBRI.JK.csv
│ ├── BMRI.JK.csv
│ └── ...
Pendekatan ini memudahkan pengelolaan data historis untuk banyak saham.
Error yang Sering Terjadi
1. Ticker Tidak Ditemukan
Contoh:
No data found
Penyebab:
- Salah penulisan ticker.
- Lupa menambahkan
.JK. - Saham sudah tidak tercatat di Yahoo Finance.
Solusi:
Gunakan ticker yang benar.
Contoh:
BBCA.JK
bukan
BBCA
2. Koneksi Internet Bermasalah
Jika koneksi terputus saat proses download, data tidak akan berhasil diambil.
Solusi:
- Periksa koneksi internet.
- Gunakan mekanisme retry pada aplikasi produksi.
3. Data Kosong
Kadang hasil yang diperoleh berupa DataFrame kosong.
Periksa terlebih dahulu:
if data.empty:
print("Data tidak tersedia")
Langkah ini membantu mencegah error pada proses analisis berikutnya.
4. Yahoo Finance Membatasi Request
Jika mengunduh ratusan ticker dalam waktu singkat, Yahoo Finance dapat membatasi permintaan sementara.
Tips:
- Beri jeda antar request (
time.sleep()). - Unduh data secara bertahap.
- Simpan hasil ke database atau file agar tidak perlu mengunduh ulang.
Tips Optimasi
Beberapa praktik yang saya gunakan saat membangun aplikasi analisis saham:
- Simpan data ke CSV atau database agar tidak mengunduh berulang kali.
- Perbarui data secara berkala menggunakan scheduler seperti
cronatau Windows Task Scheduler. - Gunakan cache untuk mempercepat proses analisis.
- Pisahkan proses pengambilan data dan proses analisis.
- Validasi data sebelum diproses lebih lanjut.
Dengan pendekatan ini, aplikasi akan lebih efisien dan mudah dipelihara.
Keterbatasan yfinance
Walaupun sangat praktis, ada beberapa keterbatasan yang perlu diperhatikan:
- Data berasal dari Yahoo Finance, bukan langsung dari Bursa Efek Indonesia.
- Tidak ada jaminan ketersediaan data secara permanen.
- Data intraday memiliki batasan periode.
- Tidak dirancang untuk aplikasi trading frekuensi tinggi (high-frequency trading).
- Perubahan pada layanan Yahoo Finance dapat memengaruhi fungsi library.
Untuk aplikasi produksi yang membutuhkan keandalan tinggi, pertimbangkan menggunakan penyedia data resmi atau API berbayar.
Kesimpulan
Library yfinance merupakan salah satu pilihan terbaik bagi siapa saja yang ingin belajar analisis saham menggunakan Python. Dengan beberapa baris kode, kita dapat mengambil data historis saham Indonesia, menyimpannya ke berbagai format, membuat visualisasi, hingga menghitung indikator teknikal sederhana.
Dalam artikel ini kita telah mempelajari:
- Instalasi
yfinancedan library pendukung. - Format ticker saham Indonesia dengan akhiran
.JK. - Mengambil data historis berdasarkan periode atau rentang tanggal.
- Mengunduh banyak saham sekaligus.
- Menyimpan data ke CSV dan Excel.
- Membuat grafik harga saham.
- Menghitung Moving Average dan return.
- Mengakses informasi perusahaan, dividen, serta stock split.
- Menangani error yang umum ditemui.
- Praktik terbaik untuk mengelola data saham dalam proyek Python.
Setelah menguasai dasar-dasar ini, Anda dapat melangkah ke tahap berikutnya seperti membangun stock screener, melakukan backtesting, membuat dashboard interaktif dengan Streamlit, atau menerapkan machine learning untuk analisis pasar.
