Wednesday, July 15, 2026
Saham

Mengenal Screener Saham: Cara Menemukan Emiten Berkualitas Secara Otomatis

Pendahuluan

Bursa Efek Indonesia (BEI) memiliki lebih dari 900 perusahaan tercatat. Bagi investor, tentu tidak mungkin menganalisis satu per satu emiten setiap hari. Selain membutuhkan waktu yang sangat lama, pendekatan tersebut juga kurang efisien ketika kita ingin menemukan peluang investasi dengan cepat.

Di sinilah stock screener berperan penting. Stock screener adalah alat yang membantu menyaring saham berdasarkan kriteria tertentu, misalnya harga, volume perdagangan, tren, maupun indikator teknikal dan fundamental.

Daripada membuka ratusan grafik secara manual, kita dapat memanfaatkan Python untuk membangun screener otomatis yang akan menampilkan hanya saham-saham yang memenuhi syarat yang kita tentukan.

Pada artikel ini kita akan mempelajari konsep dasar stock screener dan mulai membangun screener sederhana menggunakan Python dan yfinance.


Apa Itu Stock Screener?

Stock screener adalah aplikasi atau sistem yang digunakan untuk menyaring saham berdasarkan aturan tertentu.

Contohnya:

  • Harga di atas Rp5.000
  • Volume perdagangan lebih dari 10 juta lembar
  • Harga berada di atas Moving Average 20 hari
  • Return 1 bulan lebih dari 10%
  • RSI di bawah 30 (indikasi oversold)

Dengan screener, proses pencarian saham menjadi lebih cepat, objektif, dan konsisten.


Mengapa Menggunakan Screener?

Bayangkan Anda ingin mencari saham yang:

  • Sedang mengalami tren naik.
  • Volume transaksi meningkat.
  • Harga masih berada di atas MA50.
  • Return positif dalam tiga bulan terakhir.

Jika dilakukan secara manual terhadap ratusan emiten, prosesnya bisa memakan waktu berjam-jam. Dengan screener otomatis, hasil tersebut dapat diperoleh dalam hitungan detik.

Beberapa manfaat utama stock screener antara lain:

  • Menghemat waktu analisis.
  • Mengurangi bias emosional.
  • Mempermudah pemantauan banyak saham sekaligus.
  • Membantu menemukan peluang yang mungkin terlewat.

Persiapan Lingkungan

Pastikan Anda telah menginstal:

  • Python
  • pandas
  • yfinance

Instalasi:

pip install pandas yfinance

Menyiapkan Daftar Ticker

Sebagai contoh, kita akan menggunakan beberapa saham dari sektor perbankan.

tickers = [
    "BBCA.JK",
    "BBRI.JK",
    "BMRI.JK",
    "BBNI.JK",
    "BRIS.JK"
]

Pada implementasi nyata, daftar ini bisa diperluas menjadi seluruh emiten BEI.


Mengambil Data Historis

import yfinance as yf

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

data = ticker.history(period="6mo")

print(data.tail())

Data historis ini menjadi dasar untuk melakukan penyaringan.


Menghitung Moving Average

Moving Average (MA) merupakan indikator yang sering digunakan untuk melihat arah tren harga.

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

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

Dengan MA20 dan MA50, kita dapat mengetahui apakah harga saat ini berada di atas atau di bawah rata-rata pergerakan dalam periode tertentu.


Screener Pertama: Harga di Atas MA20

Sebagai contoh sederhana, kita akan mencari saham yang harga penutupannya berada di atas MA20.

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

ma20 = data["MA20"].iloc[-1]

if last_close > ma20:
    print("Trend Naik")
else:
    print("Trend Turun")

Aturan sederhana ini sering digunakan sebagai langkah awal untuk mengidentifikasi saham yang sedang berada dalam tren positif.


Melakukan Screening Banyak Saham

Daripada memeriksa satu saham, kita dapat melakukan iterasi ke seluruh daftar ticker.

import yfinance as yf

tickers = [
    "BBCA.JK",
    "BBRI.JK",
    "BMRI.JK",
    "BBNI.JK",
    "BRIS.JK"
]

for ticker in tickers:

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

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

    if df["Close"].iloc[-1] > df["MA20"].iloc[-1]:

        print(f"{ticker} memenuhi syarat")

Program akan menampilkan ticker yang sesuai dengan kriteria yang telah ditentukan.


Menambahkan Filter Volume

Selain tren harga, volume perdagangan sering dijadikan indikator penting.

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

if volume > 10000000:

    print("Volume tinggi")

Dengan menggabungkan syarat harga dan volume, hasil screener menjadi lebih selektif.


Menggabungkan Beberapa Kriteria

Kita dapat mengombinasikan beberapa aturan sekaligus.

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

ma20 = df["MA20"].iloc[-1]

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

if (
    close > ma20
    and volume > 10000000
):

    print("Lolos Screener")

Pendekatan ini merupakan dasar dari banyak screener yang digunakan investor.

Membuat Fungsi Download Data

Agar kode lebih rapi, kita buat fungsi khusus untuk mengambil data saham.

import yfinance as yf

def load_stock(ticker, period="1y"):
    """
    Mengambil data historis saham dari Yahoo Finance.
    """

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

    return df

Penggunaan:

df = load_stock("BBCA.JK")

Dengan pendekatan ini, jika suatu saat ingin mengganti sumber data, Anda hanya perlu mengubah satu fungsi.


Menambahkan Moving Average 20, 50, dan 200

Banyak investor menggunakan tiga garis Moving Average.

def add_ma(df):

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

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

    df["MA200"] = df["Close"].rolling(200).mean()

    return df

Kemudian:

df = add_ma(df)

Sekarang DataFrame memiliki tiga indikator tambahan.


Screener Golden Cross

Golden Cross terjadi ketika Moving Average jangka pendek memotong Moving Average jangka panjang dari bawah ke atas.

Salah satu kombinasi yang paling populer adalah:

  • MA50
  • MA200

Contoh sederhana:

last = df.iloc[-1]

if last["MA50"] > last["MA200"]:

    print("Golden Cross")

Dalam praktik nyata, biasanya kita juga mengecek apakah persilangan baru saja terjadi, bukan hanya posisi MA saat ini.


Screener Harga di Atas MA50

Banyak investor hanya ingin membeli saham yang sedang berada dalam tren naik.

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

ma50 = df["MA50"].iloc[-1]

if close > ma50:

    print("Trend Bullish")

Filter sederhana ini dapat mengurangi jumlah saham yang perlu dianalisis lebih lanjut.


Menghitung Return 3 Bulan

Investor sering menggunakan return sebagai salah satu kriteria seleksi.

first = df["Close"].iloc[0]

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

return_pct = (
    last - first
) / first * 100

Tampilkan hasilnya.

print(f"{return_pct:.2f}%")

Misalnya kita hanya ingin saham dengan return lebih dari 15%.

if return_pct > 15:

    print("Return Bagus")

Screener Volume Meningkat

Volume yang meningkat sering menjadi tanda adanya minat pasar yang lebih besar terhadap suatu saham.

Hitung rata-rata volume 20 hari.

avg_volume = (
    df["Volume"]
    .rolling(20)
    .mean()
)

Bandingkan dengan volume hari terakhir.

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

if last_volume > avg_volume.iloc[-1]:

    print("Volume Naik")

Filter ini sering digunakan untuk mengonfirmasi pergerakan harga.


Menggabungkan Semua Filter

Sekarang kita dapat menggabungkan beberapa syarat.

if (

    close > ma50

    and return_pct > 15

    and last_volume > avg_volume.iloc[-1]

):

    print("Lolos Screening")

Semakin banyak aturan yang ditambahkan, hasil screening akan semakin spesifik.


Menghitung RSI

RSI (Relative Strength Index) merupakan indikator momentum yang cukup populer.

Implementasi sederhana:

delta = df["Close"].diff()

gain = delta.clip(lower=0)

loss = -delta.clip(upper=0)

avg_gain = gain.rolling(14).mean()

avg_loss = loss.rolling(14).mean()

rs = avg_gain / avg_loss

df["RSI"] = 100 - (
    100 / (1 + rs)
)

Melihat nilai RSI terakhir.

print(df["RSI"].iloc[-1])

Interpretasi umum:

Nilai RSIKondisi
>70Overbought
<30Oversold
30–70Netral

RSI sebaiknya digunakan bersama indikator lain, bukan sebagai satu-satunya dasar pengambilan keputusan.


Screening Berdasarkan RSI

Misalnya kita ingin mencari saham yang mulai memasuki area oversold.

if df["RSI"].iloc[-1] < 30:

    print("Oversold")

Atau mencari saham dengan momentum positif.

if df["RSI"].iloc[-1] > 60:

    print("Momentum Positif")

Menghitung EMA

Exponential Moving Average memberikan bobot lebih besar pada harga terbaru.

df["EMA20"] = (
    df["Close"]
    .ewm(span=20)
    .mean()
)

df["EMA50"] = (
    df["Close"]
    .ewm(span=50)
    .mean()
)

EMA sering digunakan sebagai dasar berbagai strategi trading karena lebih responsif dibandingkan Simple Moving Average.


Menambahkan MACD

MACD merupakan salah satu indikator tren yang populer.

ema12 = (
    df["Close"]
    .ewm(span=12)
    .mean()
)

ema26 = (
    df["Close"]
    .ewm(span=26)
    .mean()
)

df["MACD"] = ema12 - ema26

df["Signal"] = (
    df["MACD"]
    .ewm(span=9)
    .mean()
)

Melihat kondisi MACD.

if df["MACD"].iloc[-1] > df["Signal"].iloc[-1]:

    print("Bullish")

Sebaliknya:

if df["MACD"].iloc[-1] < df["Signal"].iloc[-1]:

    print("Bearish")

MACD sering digunakan bersama Moving Average untuk mengurangi sinyal palsu.


Memberikan Skor pada Saham

Daripada hanya menampilkan “lolos” atau “tidak lolos”, kita bisa memberikan skor.

score = 0

if close > ma50:
    score += 25

if return_pct > 15:
    score += 25

if last_volume > avg_volume.iloc[-1]:
    score += 25

if df["RSI"].iloc[-1] > 50:
    score += 25

print(score)

Interpretasi:

SkorKeterangan
0–25Kurang Menarik
26–50Cukup Menarik
51–75Menarik
76–100Sangat Menarik

Model skor seperti ini dapat menjadi dasar untuk membangun sistem pemeringkatan saham.


Menampilkan Hasil Screening

Simpan hasil dalam list.

results = []

results.append({
    "Ticker": ticker,
    "Close": close,
    "Return": round(return_pct,2),
    "Score": score
})

Ubah menjadi DataFrame.

import pandas as pd

screening = pd.DataFrame(results)

print(screening)

Output akan lebih mudah dibaca dan dapat diproses lebih lanjut.


Menyimpan ke CSV

screening.to_csv(
    "screening_result.csv",
    index=False
)

Hasil screening kini dapat dibuka menggunakan Microsoft Excel atau LibreOffice Calc.

Screening Ratusan Saham BEI

Dalam praktik nyata, kita biasanya ingin menyaring banyak saham sekaligus. Misalnya seluruh emiten di Bursa Efek Indonesia.

Contoh sederhana menggunakan daftar ticker:

Pada implementasi sebenarnya, daftar ini dapat diambil dari file CSV berisi seluruh kode saham BEI.

Membuat Fungsi Screening

Supaya kode mudah dipelihara, kita bungkus logika screening ke dalam fungsi.

Menjalankan Screening

Menampilkan Hasil Terbaik

Contoh output:

TickerScore
BBCA.JK100
BMRI.JK100
BBRI.JK75
TLKM.JK50

Optimasi Performa

Jika Anda melakukan screening ratusan saham, proses download bisa cukup lama.

Tips yang saya sarankan:

  • Gunakan period=”6mo” jika tidak membutuhkan data terlalu panjang.
  • Simpan hasil ke CSV atau database.
  • Jalankan screening di luar jam sibuk.
  • Tambahkan jeda kecil antar request jika diperlukan.

Contoh:

Menyimpan ke CSV

File ini dapat dibuka menggunakan Excel untuk analisis lanjutan.

Menyimpan ke SQLite

Untuk penggunaan rutin, database lebih praktis dibanding file CSV.

Keuntungan:

  • Data historis dapat disimpan.
  • Mudah dibuat dashboard.
  • Mudah diintegrasikan dengan Streamlit.

Menampilkan di Streamlit

Hasil screener bisa langsung ditampilkan di dashboard.

Tambahkan filter skor minimum:

Mengirim Hasil ke Telegram

Setelah screening selesai, kita bisa mengirim hasil terbaik ke Telegram.

Dengan cara ini, hasil screener dapat diterima langsung di ponsel setiap pagi.

Menjalankan Otomatis dengan Cron

Di Linux, gunakan crontab.

Contoh menjalankan setiap hari pukul 08:00:

Screener akan berjalan otomatis pada hari kerja.

Integrasi dengan AI (Ollama / OpenAI)

Ini bagian yang menurut saya paling menarik untuk blog Anda karena menggabungkan saham + AI + Python.

Contoh ringkasan sederhana:

Prompt tersebut dapat dikirim ke:

  • OpenAI API
  • Ollama (LLM lokal)
  • DeepSeek
  • Llama 3

Hasilnya bisa berupa narasi otomatis yang menjelaskan kondisi pasar hari itu.

Struktur Proyek yang Disarankan

Dengan struktur seperti ini, proyek akan lebih mudah dikembangkan.

Ide Pengembangan Lanjutan

  • Backtesting hasil screener.
  • Machine Learning untuk prediksi ranking saham.
  • Heatmap sektor.
  • Notifikasi breakout.
  • Integrasi dengan TradingView webhook.
  • Dashboard multi-user.
  • API REST menggunakan FastAPI.

Kesimpulan

Dengan Python dan yfinance, kita dapat membangun stock screener otomatis yang mampu menyaring saham berdasarkan berbagai kriteria seperti tren, volume, return, RSI, dan MACD.

Dalam tiga bagian artikel ini, kita telah mempelajari:

  • Konsep dasar stock screener.
  • Mengambil data saham dari Yahoo Finance.
  • Menghitung Moving Average, RSI, dan MACD.
  • Membuat sistem scoring.
  • Melakukan screening banyak saham sekaligus.
  • Menyimpan hasil ke CSV dan database.
  • Menampilkan hasil di Streamlit.
  • Mengirim notifikasi ke Telegram.
  • Menjalankan screener otomatis dengan cron.
  • Mengintegrasikan hasil dengan AI.

Setelah memahami materi ini, Anda sudah memiliki fondasi yang kuat untuk membangun aplikasi screening saham yang berjalan otomatis setiap hari.

FAQ

Apakah stock screener bisa menemukan saham yang pasti naik?

Tidak. Screener hanya membantu menyaring saham yang memenuhi kriteria tertentu. Keputusan investasi tetap memerlukan analisis lebih lanjut.

Berapa banyak saham yang bisa discrening?

Secara teknis bisa ratusan hingga ribuan, tergantung sumber data dan performa komputer atau server yang digunakan.

Apakah yfinance cukup akurat?

Untuk pembelajaran, riset, dan pengembangan prototipe, yfinance sudah sangat memadai. Untuk aplikasi produksi skala besar, pertimbangkan sumber data resmi atau berbayar.

Apakah screener ini bisa digunakan untuk saham Indonesia?

Bisa. Gunakan kode ticker dengan akhiran .JK, misalnya BBCA.JK atau BMRI.JK.

Artikel Terkait

  • Cara Mengambil Data Harga Saham Indonesia Menggunakan Python dan yfinance
  • Membuat Dashboard Portofolio Saham dengan Streamlit dan Python
  • Belajar Backtesting Strategi Moving Average Menggunakan Python
  • Cara Menggunakan AI untuk Menganalisis Sentimen Berita Saham Indonesia
  • Membuat Bot Telegram Notifikasi Harga Saham Real-Time dengan Python
  • Belajar Stock Ranking: Cara Memberi Skor pada Saham Menggunakan Python

Similar Posts

Leave a Reply

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