Pendahuluan
Pergerakan harga saham tidak hanya dipengaruhi oleh laporan keuangan atau analisis teknikal. Berita mengenai aksi korporasi, perubahan regulasi, kondisi ekonomi, hingga sentimen pasar juga dapat memengaruhi keputusan investor.
Sebagai contoh:
- Bank Indonesia mengumumkan perubahan suku bunga.
- Sebuah emiten merilis laporan keuangan yang melampaui ekspektasi.
- Perusahaan mengumumkan pembagian dividen.
- Terjadi akuisisi atau merger.
- Muncul isu hukum yang melibatkan perusahaan.
Dalam kondisi seperti itu, investor sering kali harus membaca banyak berita sebelum mengambil keputusan. Proses ini memerlukan waktu dan tidak selalu mudah dilakukan secara konsisten.
Di sinilah Artificial Intelligence (AI) dapat membantu. Dengan memanfaatkan model bahasa modern (Large Language Model/LLM), kita dapat mengotomatisasi proses membaca, merangkum, dan mengklasifikasikan sentimen berita menjadi positif, negatif, atau netral.
Pada artikel ini kita akan membangun sistem sederhana menggunakan Python untuk mengambil berita, membersihkan teks, dan melakukan analisis sentimen sebagai dasar pengambilan keputusan yang lebih terstruktur.
Apa Itu Sentiment Analysis?
Sentiment Analysis adalah proses mengidentifikasi opini atau emosi dari sebuah teks menggunakan teknik Natural Language Processing (NLP).
Dalam konteks pasar modal, hasil analisis biasanya dibagi menjadi tiga kategori:
| Sentimen | Arti |
|---|---|
| Positif | Berita berpotensi memberikan dampak baik terhadap persepsi pasar. |
| Netral | Informasi bersifat informatif tanpa indikasi positif atau negatif yang kuat. |
| Negatif | Berita berpotensi menimbulkan tekanan terhadap harga saham. |
Contoh:
Berita
BBCA membukukan laba bersih yang meningkat 18% dibandingkan tahun sebelumnya.
Hasil analisis:
Sentimen : Positif
Confidence : 0.96
Contoh lain:
Emiten XYZ mengalami penurunan laba bersih sebesar 35%.
Hasil:
Sentimen : Negatif
Confidence : 0.91
Mengapa Analisis Sentimen Penting?
Analisis teknikal hanya melihat pergerakan harga, sedangkan analisis fundamental berfokus pada kondisi perusahaan.
Namun dalam praktiknya, berita sering menjadi pemicu utama pergerakan harga dalam jangka pendek.
Sebagai contoh:
- Pengumuman dividen dapat meningkatkan minat investor.
- Akuisisi perusahaan dapat mengubah valuasi.
- Penurunan peringkat utang dapat memicu aksi jual.
- Kebijakan pemerintah dapat memengaruhi sektor tertentu.
Dengan AI, kita dapat menganalisis puluhan bahkan ratusan berita dalam waktu singkat.
Arsitektur Sistem
Alur kerja sistem yang akan kita bangun:
Portal Berita
│
▼
Mengambil Artikel
│
▼
Membersihkan Teks
│
▼
Model AI (LLM/NLP)
│
▼
Klasifikasi Sentimen
│
▼
Ringkasan & Dashboard
Setiap tahap memiliki peran penting agar hasil analisis lebih akurat.
Teknologi yang Digunakan
Pada artikel ini kita menggunakan:
- Python
- Pandas
- Requests
- BeautifulSoup
- Transformers
- PyTorch
- OpenAI API (opsional)
- Ollama (opsional untuk model lokal)
Model OpenAI dapat diakses melalui library Python resmi yang menggunakan Responses API sebagai antarmuka utama.
Untuk pengguna yang mengutamakan privasi atau ingin menjalankan model di komputer sendiri, Ollama menyediakan API lokal dan juga kompatibilitas dengan sebagian antarmuka OpenAI.
Instalasi Library
Install seluruh dependensi.
pip install pandas requests beautifulsoup4
Kemudian:
pip install transformers torch
Jika ingin menggunakan OpenAI:
pip install openai
Atau jika ingin menjalankan model secara lokal menggunakan Ollama:
pip install ollama
Library Python resmi untuk OpenAI maupun Ollama menyediakan cara yang mudah untuk mengintegrasikan model AI ke dalam aplikasi Python.
Struktur Project
Gunakan struktur proyek seperti berikut.
ai-stock-news/
│
├── app.py
├── news.py
├── sentiment.py
├── summarize.py
├── requirements.txt
└── data/
Keterangan:
news.py→ mengambil beritasentiment.py→ analisis sentimensummarize.py→ membuat ringkasan AIapp.py→ aplikasi utama
Struktur modular seperti ini memudahkan pengembangan di masa depan.
Mengambil Berita
Misalnya menggunakan RSS Feed atau API berita.
Contoh sederhana menggunakan requests.
import requests
url = "https://example.com/api/news"
response = requests.get(url)
print(response.status_code)
Jika menggunakan RSS Feed, data biasanya berupa XML dan dapat diproses menggunakan parser XML atau BeautifulSoup.
Menyimpan Data ke DataFrame
Misalnya hasil yang diperoleh:
news = [
{
"title":"BBCA Meningkatkan Laba",
"content":"Laba meningkat..."
},
{
"title":"TLKM Membagikan Dividen",
"content":"Dividen sebesar..."
}
]
Kemudian:
import pandas as pd
df = pd.DataFrame(news)
print(df)
DataFrame memudahkan proses pembersihan, analisis, dan visualisasi.
Membersihkan Teks
Berita sering mengandung karakter yang tidak diperlukan.
Contoh sederhana:
import re
def clean(text):
text = text.lower()
text = re.sub(
r"[^a-zA-Z0-9 ]",
"",
text
)
return text
Gunakan:
df["clean"] = df["content"].apply(clean)
Tahap ini membantu mengurangi noise pada data sebelum diproses oleh model.
Contoh Dataset
| Judul | Isi |
|---|---|
| BBCA Catat Laba Bersih Naik 18% | Kinerja keuangan meningkat… |
| TLKM Bagikan Dividen | Dividen tunai diumumkan… |
| Emiten XYZ Rugi Besar | Penurunan laba… |
Setelah dibersihkan:
| Clean Text |
|---|
| bbca catat laba bersih naik |
| tlkm bagikan dividen |
| emiten xyz rugi besar |
Dataset seperti ini siap digunakan untuk proses analisis sentimen.
Analisis Sentimen Menggunakan Hugging Face
Kita dapat menggunakan model siap pakai melalui pipeline dari pustaka transformers.
from transformers import pipeline
classifier = pipeline(
"sentiment-analysis"
)
Kemudian:
result = classifier(
"Bank mencatat kenaikan laba yang signifikan."
)
print(result)
Hasil umumnya berupa label sentimen beserta skor kepercayaan (confidence score).
Perlu diingat bahwa banyak model umum dilatih menggunakan data berbahasa Inggris. Untuk berita berbahasa Indonesia, hasilnya bisa bervariasi sehingga sebaiknya dilakukan evaluasi atau menggunakan model yang memang mendukung bahasa Indonesia jika tersedia. Penelitian juga menunjukkan bahwa model LLM dapat memberikan hasil yang baik, tetapi tetap memiliki keterbatasan pada teks yang ambigu atau bernuansa tertentu.
Menambahkan Hasil ke DataFrame
df["sentiment"] = df["clean"].apply(
lambda x: classifier(x)[0]["label"]
)
Sekarang setiap berita memiliki label sentimen yang dapat dianalisis lebih lanjut.
Mengapa Menggunakan LLM?
Model klasifikasi sentimen tradisional biasanya hanya menghasilkan output seperti:
Positive
atau
Negative
Sedangkan LLM dapat memberikan hasil seperti:
Sentimen : Positif
Alasan :
Perusahaan berhasil meningkatkan laba bersih sebesar
18%.
Dividen meningkat.
Prospek bisnis dinilai baik.
Risiko masih relatif rendah.
Informasi seperti ini jauh lebih bermanfaat bagi investor dibandingkan hanya sebuah label.
Menggunakan OpenAI API
Install library:
pip install openai
Import library:
from openai import OpenAI
client = OpenAI()
Secara default, library akan menggunakan API key yang disimpan pada environment variable OPENAI_API_KEY.
Membuat Prompt Analisis
Prompt yang baik akan menghasilkan jawaban yang lebih konsisten.
Contoh:
prompt = f"""
Anda adalah analis saham Indonesia.
Analisis berita berikut.
Berita:
{news}
Jawab dalam format:
Sentimen:
Alasan:
Risiko:
Peluang:
Kesimpulan:
"""
Dengan format seperti ini, setiap hasil analisis memiliki struktur yang seragam sehingga mudah diproses lebih lanjut.
Mengirim Permintaan ke Model
Contoh menggunakan Responses API:
response = client.responses.create(
model="gpt-4.1-mini",
input=prompt
)
print(response.output_text)
Gunakan model yang sesuai dengan kebutuhan biaya, kecepatan, dan kualitas hasil.
Contoh Hasil AI
Misalnya berita:
BBCA melaporkan kenaikan laba bersih sebesar 18% dibandingkan tahun sebelumnya.
AI dapat menghasilkan ringkasan seperti:
Sentimen : Positif
Alasan :
Laba meningkat.
Profitabilitas membaik.
Risiko :
Tekanan ekonomi global masih perlu dipantau.
Peluang :
Kinerja yang kuat dapat meningkatkan kepercayaan investor.
Kesimpulan :
Berita ini cenderung memberikan sentimen positif terhadap saham BBCA.
Hasil seperti ini lebih mudah dipahami dibandingkan membaca seluruh artikel berita.
Analisis Banyak Berita
Misalkan terdapat beberapa berita.
articles = [
"...",
"...",
"..."
]
Loop:
results = []
for article in articles:
response = client.responses.create(
model="gpt-4.1-mini",
input=article
)
results.append(response.output_text)
Setelah selesai, setiap berita telah memiliki hasil analisis AI.
Menyimpan Hasil ke DataFrame
import pandas as pd
df = pd.DataFrame({
"News": articles,
"Analysis": results
})
Kemudian simpan:
df.to_csv(
"analysis.csv",
index=False
)
Menggunakan Ollama
Bagi yang tidak ingin menggunakan layanan cloud, model dapat dijalankan secara lokal menggunakan Ollama.
Pastikan Ollama sudah terinstal dan model telah diunduh, misalnya:
ollama pull llama3.1
Contoh penggunaan:
import ollama
response = ollama.chat(
model="llama3.1",
messages=[
{
"role":"user",
"content":prompt
}
]
)
print(
response["message"]["content"]
)
Kelebihan Ollama:
- Tidak memerlukan koneksi internet setelah model tersedia.
- Data tetap berada di komputer sendiri.
- Tidak dikenakan biaya per permintaan.
Kekurangannya adalah kebutuhan RAM dan CPU/GPU yang lebih besar dibanding menggunakan layanan cloud.
Membandingkan OpenAI dan Ollama
| Fitur | OpenAI | Ollama |
|---|---|---|
| Koneksi Internet | Ya | Tidak (setelah model tersedia) |
| Biaya | Sesuai penggunaan | Gratis |
| Kecepatan | Tinggi | Bergantung pada spesifikasi komputer |
| Privasi | Data dikirim ke layanan API | Data tetap lokal |
| Kemudahan | Sangat mudah | Perlu instalasi model |
Pemilihan solusi bergantung pada kebutuhan proyek, anggaran, dan kebijakan privasi.
Memberikan Skor Sentimen
Selain teks, kita dapat meminta AI memberikan skor numerik.
Contoh prompt:
Berikan nilai sentimen.
-100 = Sangat Negatif
0 = Netral
100 = Sangat Positif
Contoh hasil:
| Berita | Score |
|---|---|
| BBCA laba naik | 92 |
| TLKM bagikan dividen | 80 |
| Emiten rugi | -75 |
Skor ini dapat digunakan untuk membuat peringkat sentimen beberapa berita.
Ringkasan Banyak Berita
Misalnya terdapat lima berita tentang satu emiten.
Alih-alih membaca satu per satu, gabungkan seluruh berita menjadi satu teks, kemudian minta AI membuat ringkasan.
Prompt:
Ringkas seluruh berita berikut.
Fokus pada:
- kondisi perusahaan
- peluang
- risiko
- dampak terhadap investor
AI akan menghasilkan ringkasan yang jauh lebih singkat namun tetap mempertahankan informasi penting.
Mengidentifikasi Risiko
LLM juga dapat diminta mengekstrak faktor risiko.
Contoh prompt:
Identifikasi seluruh risiko investasi pada berita berikut.
Contoh hasil:
- Penurunan laba.
- Ketidakpastian ekonomi.
- Risiko nilai tukar.
- Penurunan permintaan.
- Persaingan meningkat.
Daftar seperti ini membantu investor memahami faktor yang perlu dipantau.
Mengidentifikasi Peluang
Prompt:
Apa peluang pertumbuhan perusahaan ini?
Contoh hasil:
- Pertumbuhan laba.
- Ekspansi bisnis.
- Dividen meningkat.
- Efisiensi operasional.
- Akuisisi perusahaan.
Membuat Ringkasan Satu Kalimat
Prompt:
Ringkas berita ini menjadi satu kalimat untuk investor.
Contoh:
BBCA membukukan pertumbuhan laba yang solid sehingga sentimen pasar cenderung positif, meskipun kondisi ekonomi global masih perlu diperhatikan.
Ringkasan singkat seperti ini cocok ditampilkan pada dashboard atau notifikasi.
Membuat Tabel Hasil Analisis
Gabungkan seluruh informasi dalam DataFrame.
| Judul | Sentimen | Score | Risiko | Peluang |
|---|---|---|---|---|
| BBCA laba naik | Positif | 92 | Inflasi | Pertumbuhan laba |
| TLKM dividen | Positif | 80 | Kompetisi | Dividen |
| XYZ rugi | Negatif | -75 | Penjualan turun | Restrukturisasi |
Struktur seperti ini memudahkan analisis lanjutan menggunakan Python.
Visualisasi Distribusi Sentimen
Misalnya:
summary = df["Sentiment"].value_counts()
summary.plot.bar()
Hasil visualisasi dapat menunjukkan apakah mayoritas berita pada periode tertentu bersifat positif, netral, atau negatif.
Arsitektur AI Stock Assistant
Diagram sederhana sistem yang akan dibangun:
Portal Berita
│
▼
Mengambil Berita Terbaru
│
▼
AI Sentiment Analysis
(OpenAI / Ollama / LLM Lokal)
│
┌────────────────┼────────────────┐
▼ ▼ ▼
Ringkasan AI Skor Sentimen Risiko & Peluang
│ │ │
└────────────────┼────────────────┘
▼
SQLite / PostgreSQL
│
┌────────────────┼────────────────┐
▼ ▼ ▼
Streamlit Telegram Bot Dashboard Web
Dengan arsitektur ini, seluruh proses dapat berjalan otomatis tanpa perlu membaca berita satu per satu.
Menyimpan Hasil ke SQLite
Simpan hasil analisis agar dapat dibandingkan dari waktu ke waktu.
import sqlite3
conn = sqlite3.connect("sentiment.db")
df.to_sql(
"news_sentiment",
conn,
if_exists="append",
index=False
)
conn.close()
Contoh struktur tabel:
| Tanggal | Emiten | Judul | Sentimen | Score |
|---|---|---|---|---|
| 2026-07-17 | BBCA | Laba Naik | Positif | 92 |
| 2026-07-17 | TLKM | Dividen | Positif | 85 |
| 2026-07-17 | GOTO | Akuisisi | Netral | 55 |
Dengan histori ini, kita dapat menganalisis perubahan sentimen dari waktu ke waktu.
Membuat Dashboard Streamlit
Install:
pip install streamlit
Contoh dashboard sederhana:
import streamlit as st
st.title("AI Sentiment Dashboard")
st.dataframe(df)
Tambahkan metrik:
st.metric(
"Berita Positif",
len(
df[df["Sentiment"]=="Positive"]
)
)
Dashboard juga dapat dilengkapi dengan filter berdasarkan emiten, tanggal, atau sektor.
Visualisasi Sentimen
Distribusi sentimen:
chart = (
df["Sentiment"]
.value_counts()
)
st.bar_chart(chart)
Visualisasi seperti ini memudahkan pengguna melihat kondisi pasar secara sekilas.
Ringkasan Harian dengan AI
Gabungkan seluruh berita dalam satu hari, lalu minta AI membuat ringkasan.
Prompt:
Berikut kumpulan berita saham Indonesia hari ini.
Buatkan ringkasan maksimal 300 kata.
Sebutkan:
- kondisi pasar
- saham yang paling positif
- saham yang paling negatif
- risiko terbesar
- peluang terbesar
Contoh hasil:
Hari ini sektor perbankan menunjukkan sentimen positif didorong oleh pertumbuhan laba beberapa emiten besar. Sementara itu, sektor teknologi cenderung netral karena investor masih menunggu laporan keuangan berikutnya. Risiko utama berasal dari ketidakpastian ekonomi global, sedangkan peluang terbesar terlihat pada emiten yang mengumumkan ekspansi bisnis dan pembagian dividen.
Ringkasan ini dapat menjadi bahan awal sebelum melakukan analisis lebih mendalam.
Mengirim Ringkasan ke Telegram
Install library:
pip install python-telegram-bot
Contoh fungsi:
import requests
url = (
f"https://api.telegram.org/bot{TOKEN}/sendMessage"
)
requests.post(
url,
data={
"chat_id": CHAT_ID,
"text": summary
}
)
Contoh pesan:
📈 AI Market Summary
Mayoritas berita hari ini positif.
Saham dengan sentimen terbaik:
• BBCA
• BMRI
• TLKM
Risiko terbesar:
• Pelemahan nilai tukar
• Ketidakpastian suku bunga
Peluang:
• Pertumbuhan laba
• Dividen
Dengan begitu, ringkasan dapat diterima langsung melalui Telegram setiap pagi.
Menjalankan Otomatis
Gunakan cron pada Linux.
Edit crontab:
crontab -e
Jalankan setiap hari kerja pukul 07.00:
0 7 * * 1-5 python3 app.py
Urutan proses:
- Mengambil berita terbaru.
- Menganalisis sentimen menggunakan AI.
- Menyimpan hasil ke database.
- Memperbarui dashboard.
- Mengirim ringkasan ke Telegram.
Menggabungkan dengan Stock Screener
Artikel sebelumnya telah membahas pembuatan screener saham.
Sekarang tambahkan kolom sentimen.
| Ticker | Score Teknikal | Sentimen AI | Total |
|---|---|---|---|
| BBCA | 90 | 92 | 91 |
| BMRI | 88 | 90 | 89 |
| TLKM | 84 | 80 | 82 |
Contoh perhitungan:
df["Final Score"] = (
df["Technical Score"] * 0.6
) + (
df["Sentiment Score"] * 0.4
)
Bobot tersebut hanyalah contoh. Anda dapat menyesuaikannya sesuai strategi yang digunakan.
Menggabungkan dengan Backtesting
Sebelum menggunakan sentimen sebagai dasar keputusan investasi, Anda juga dapat mengujinya melalui backtesting.
Contoh aturan:
- Buy jika:
- MA20 > MA50.
- Sentimen > 70.
- Sell jika:
- MA20 < MA50.
- Sentimen < 30.
Dengan pendekatan ini, analisis teknikal dan analisis sentimen saling melengkapi.
Best Practice
Agar hasil analisis lebih bermanfaat:
- Gunakan lebih dari satu sumber berita untuk mengurangi bias.
- Simpan hasil analisis agar dapat dibandingkan antarperiode.
- Evaluasi kualitas model secara berkala.
- Gunakan prompt yang konsisten.
- Hindari mengambil keputusan hanya berdasarkan satu berita.
AI sebaiknya menjadi alat bantu analisis, bukan pengganti penilaian investor.
Keterbatasan AI
Walaupun LLM sangat membantu, ada beberapa hal yang perlu diperhatikan:
- Model dapat salah memahami konteks berita.
- Berita yang bersifat satir atau ambigu bisa menghasilkan klasifikasi yang kurang tepat.
- Analisis tidak selalu mempertimbangkan kondisi fundamental perusahaan secara menyeluruh.
- Model tidak memiliki akses ke informasi yang tidak tersedia dalam teks yang dianalisis.
Karena itu, hasil AI sebaiknya dipadukan dengan analisis fundamental dan teknikal.
Struktur Proyek
ai-stock-assistant/
├── app.py
├── news.py
├── sentiment.py
├── summarize.py
├── dashboard.py
├── telegram.py
├── database.py
├── scheduler.py
├── requirements.txt
└── data/
Struktur modular memudahkan pemeliharaan dan pengembangan proyek.
FAQ
Apakah AI dapat memprediksi harga saham?
Tidak. AI dapat membantu menganalisis informasi dan menemukan pola, tetapi tidak dapat menjamin arah pergerakan harga di masa depan.
Apakah Ollama lebih baik daripada OpenAI?
Keduanya memiliki kelebihan. OpenAI umumnya memberikan kualitas analisis yang sangat baik dan mudah digunakan, sedangkan Ollama unggul dari sisi privasi karena model berjalan di komputer sendiri.
Apakah sistem ini hanya untuk saham Indonesia?
Tidak. Dengan mengganti sumber berita dan data harga, sistem yang sama dapat digunakan untuk saham luar negeri, ETF, maupun aset lain seperti mata uang kripto.
Kesimpulan
Dalam tiga bagian artikel ini kita telah membangun fondasi AI Stock Assistant menggunakan Python. Mulai dari mengambil berita, melakukan analisis sentimen, menghasilkan ringkasan otomatis, hingga mengintegrasikan hasilnya ke dashboard dan notifikasi Telegram.
Rangkaian artikel ini juga melengkapi seri sebelumnya:
- Mengambil data harga saham menggunakan
yfinance. - Membuat dashboard portofolio dengan Streamlit.
- Membangun stock screener otomatis.
- Melakukan backtesting strategi Moving Average.
- Menambahkan analisis sentimen berbasis AI.
Dengan menggabungkan analisis harga, indikator teknikal, dan sentimen berita, Anda dapat membangun sistem pemantauan saham yang lebih komprehensif. Meskipun demikian, hasil analisis AI tetap perlu dipadukan dengan riset dan pertimbangan investasi lainnya sebelum mengambil keputusan.
