š„ļø AI-Powered Financial Insights
Pada kesempatan kali ini, kita akan mencoba menscrap data saham dengan menggunakan API dan diperbantukan oleh AI (LLM) untuk mendapatkan pemahaman mendalam mengenai saham tersebut sehingga dapat dilakukan analisa finansial lanjutan.
Dengan menggunakan AI, kita bisa:
Mengambil ringkasan laporan keuangan secara otomatis
Menjelaskan tren yang terlihat pada grafik keuangan
Mendeteksi potensi resiko keuangan hanya dari data mentah
Mengapa menggunakan Large Language Models (LLMs) pada Keuangan (Finance)?¶
LLM adalah model AI yang dilatih dengan jutaan data teks, sehingga mampu memahami dan menghasilkan teks seperti manusia. Kita mungkin mengenal ChatGPT, Groq atau Claude sebagai contoh LLM.
Dalam konteks keuangan, LLM sangat bermanfaat karena:
Dapat membaca dan memahami lampiran keuangan berbahasa natural.
Menjawab pertanyaan tentang kondisi keuangan suatu perusahaan.
Mengintepretasikan grafik seperti tren revenue atau cashflow.
Menghasilkan insight keuangan secara otomatis tanpa perlu coding kompleks.
Dengan kata lain, LLM membuat analisis keuangan menjadi lebih mudah dimengerti, cepat dan efisien bahkan untuk kita yang tidak memiliki latar belakang keuangan maupun teknis.
Alur kerja (workflow) yang akan dilakukan:¶
Ambil Data Keuangan Mengambil data dari Sectors API menggunakan Python.
Eksplorasi dan Persiapan Data Data yang kita ambil akan dibersihkan dan disiapkan agar bisa dibaca oleh AI.
Analisis dengan LLM Menggunakan LangChain dan Groq untuk menghasilkan insight secara otomatis.
Visualisasi Data Membuat grafik yang memperlihatkan tren keuangan menggunakan AI.
Bangun Dashboard Membangun dashboard interaktif menggunakan Streamlit dan menampilkan hasil analisis AI secara langsung.
Tools yang digunakan:¶
- Python: Bahasa pemrograman utama yang digunakan. Mudah dipahami, fleksibel, dan banyak digunakan dalam analisis data serta AI
- Jupyter Notebook: Tempat menulis dan menjalankan kode Python. Sangat cocok untuk eksperimen data dan dokumentasi proses analisis.
- Streamlit: Framework Python untuk membuat aplikasi web secara cepat. Kita akan menggunakannya untuk membangun dashboard dari data dan insight yang kita miliki.
- LangChain: Framework yang memudahkan untuk menghubungkan LLM dengan data.
- Groq: Salah satu penyedia LLM yang sangat cepat dan efisien. Keduanya akan digunakan untuk menghasilkan insight otomatis dari data keuangan.
- Sectors API: Sumber data keuangan yang akan digunakan. Dengan API ini bisa mengambil data tentang perusahaan, laporan keuangan, dan informasi sektor industri secara real time.
š LangChain¶
LangChain adalah framework Python yang memudahkan kita dalam:
- Menyusun prompt
- Menghubungkan LLM dengan data kita
- Menyusun pipeline otomatis dari input hingga output
LangChain sangat cocok untuk membangun alur kerja berbasis LLM, seperti tanya-jawab keuangan, chatbot, atau ringkasan otomatis.
┠Groq¶
Groq adalah layanan yang menyediakan akses ke model-model LLM super cepat seperti LLaMA 3 dan lainnya. Kita akan menggunakan Groq sebagai penyedia model AI-nya.
š What is an API and How It Works¶
API (Application Programming Interface) adalah jembatan yang memungkinkan dua aplikasi berkomunikasi. Bayangkan seperti kita memesan makanan lewat aplikasi, dan restoran mengantarkan pesanan ke rumah ā konsep yang sama berlaku saat kita minta data ke server melalui API.
š Cara kerjanya:
- Kita kirim request (permintaan data)
- Server API membalas dengan response (data, biasanya dalam format JSON)
š Introduction to the Sectors API¶
Sectors API adalah layanan yang menyediakan berbagai informasi terkait sektor industri dan keuangan perusahaan.
Anggap saja ini sebagai perpustakaan atau sumber data utama kita.Kita bisa melihat semua "menu" data yang tersedia di dokumentasi resmi mereka: https://sectors.app/api
- Melihat daftar subsektor industri
- Mengambil daftar perusahaan berdasarkan subsektor
- Mengakses data keuangan mereka
- dll
1. Setting Up Python Environment¶
Setelah mendapatkan API dari Sectors.app, kita akan menyimpan API key di dalam file .env agar aman dan tidak terlihat langsung pada kode. Untuk membaca file ini, kita gunakan library dotenv
from dotenv import load_dotenv
import os
# Gunakan `load_dotenv()` untuk memuat semua variabel dari file .env
load_dotenv()
# Ambil key tersebut dari environment dan simpan dalam variabel.
# Gunakan `os.getenv("NAMA_VARIABEL")` untuk "ambil nilai dari variabel X"
SECTORS_API_KEY = os.getenv("SECTORS_API_KEY")
# Alamat utama API dan header otorisasi akan disimpan dalam variabel sehingga tidak perlu mengetiknya berulang kali.
BASE_URL = "https://api.sectors.app/v1"
HEADERS = {"Authorization": SECTORS_API_KEY}
š”
BASE_URLmenyimpan alamat utama API, danHEADERSmenyimpan API Key yang akan dikirim saat kita melakukan permintaan ke API.
2. Setting Up LangChain and LLMs¶
Untuk memulai, kita perlu mengimpor dua komponen penting:
langchain_groq: digunakan untuk menghubungkan LangChain dengan model LLM dari Groq.PromptTemplate: digunakan untuk membuat format pertanyaan atau instruksi yang ingin kita berikan ke AI.
from langchain_groq import ChatGroq
from langchain.prompts import PromptTemplate
𧪠Inisialisasi Model LLM¶
Sebelum bisa menggunakan LLM, kita perlu menginisiasi model-nya terlebih dahulu. Ini seperti menyalakan mesin sebelum digunakan.
Kita butuh 3 parameter utama:
groq_api_key: API Key dari Groq yang kita simpan di file.env. Digunakan untuk otorisasi.model_name: nama model yang ingin kita gunakan. Di sini kita pakai"llama-3.3-70b-versatile", yaitu model besar dan canggih dari Meta yang disediakan Groq. Dokumentasi lengkap model Groq bisa dilihat di: https://console.groq.com/docstemperature: mengatur tingkat kreativitas jawaban.- Semakin rendah (misalnya 0.0) ā jawaban lebih konsisten dan deterministik.
- Semakin tinggi (misalnya 1.0) ā jawaban lebih kreatif dan bervariasi.
š Kita menggunakan 0.7 agar hasilnya tetap kreatif namun tidak terlalu liar.
GROQ_API_KEY = os.getenv("GROQ_API_KEY")
llm = ChatGroq(
groq_api_key = GROQ_API_KEY,
temperature=0.7,
model_name="llama-3.3-70b-versatile"
)
llm
ChatGroq(client=<groq.resources.chat.completions.Completions object at 0x10efe35f0>, async_client=<groq.resources.chat.completions.AsyncCompletions object at 0x10efe2000>, model_name='llama-3.3-70b-versatile', model_kwargs={}, groq_api_key=SecretStr('**********'))
3. Building a Prompt-Driven Analysis Pipeline¶
Prompt adalah masukan, instruksi, atau pertanyaan yang diberikan kepada sistem (terutama pada kecerdasan buatan) untuk menghasilkan suatu respons atau output yang diinginkan. Dalam konteks AI generatif, prompt berfungsi sebagai panduan yang mengarahkan model bahasa besar (LLM) untuk melakukan tugas tertentu, mulai dari perintah sederhana hingga pertanyaan kompleks, dan dapat berupa teks, gambar, atau audio.
#Contoh penerapan sederhana prompt
pertanyaan1 = llm.invoke("Jelaskan apa itu API dalam satu kalimat saja")
pertanyaan1.content
'API (Application Programming Interface) adalah sebuah antarmuka pemrograman yang memungkinkan berbagai aplikasi atau sistem untuk berkomunikasi dan berbagi data satu sama lain.'
š
invoke()adalah cara cepat untuk meminta jawaban dari LLM berdasarkan prompt (teks perintah) yang kita kirim.
Kalau kita ingin AI melakukan tugas spesifik berdasarkan pola tertentu, kita bisa membuat template prompt.
Sebagai contoh, kita akan membuat template yang meminta AI untuk menjelaskan sebuah konsep kepada anak berusia 10 tahun.
# `PromptTemplate` untuk membuat format prompt dengan variabel dinamis.
# Perhatikan `{topic}`, ini adalah variabel yang bisa kita isi nanti.
template = PromptTemplate(
input_variables=["topic"],
template="Jelaskan apa itu {topic} dalam satu kalimat saja"
)
# Mengisi Variabel
# Isi variabel dinamis yang sudah kita definisikan sebelumnya menggunakan `.format`
prompt = template.format(topic="python")
# Jalankan LLM
llm.invoke(prompt).content
'Python adalah bahasa pemrograman tingkat tinggi yang mudah dipelajari dan digunakan untuk mengembangkan berbagai aplikasi, termasuk pengolahan data, machine learning, dan pengembangan web.'
š Exploring Financial Insights¶
Pada tahap ini, kita akan menggabungkan data keuangan dari API dengan kemampuan AI (LLM) untuk membaca dan menginterpretasikan data tersebut. Kita akan membuat analisis otomatis, visualisasi tren, dan bahkan deteksi risiko keuangan ā semua berbasis AI š”š¤
š Creating an Automated Financial Summary¶
Sekarang kita akan mengambil data keuangan dan meminta AI untuk menyusunnya secara otomatis.
1. Mengambil Data Kuartalan¶
# `/financials/quarterly/` merupakan endpoint yang didapat dari Sectors.app, silahkan mengunjungin websitenya untuk mendapatkan penjelasan dari endpoint tersebut.
# Import library `requests` yang berfungsi sebagai "kurir" untuk mengirim permintaan kita
import requests
# Gunakan `requests.get()` -> perintah untuk "Tolong ambilkan data dari URL ini".
# Import library `pandas` untuk mengubah data hasil tarikan menjadi sebuah dataframe
import pandas as pd
symbol = "CPIN.JK"
url_fin = f"{BASE_URL}/financials/quarterly/{symbol}/"
params = {"n_quarters" : "4",
"report_date": "2024-09-30"}
# Sertakan `HEADERS` agar server tahu siapa kita.
response = requests.get(url_fin, headers=HEADERS, params=params)
#Ubah data tarikan (response) menjadi sebuah dataframe
financials = pd.DataFrame(response.json())
financials
| symbol | financials_sector_metrics | date | premium_income | premium_expense | net_premium_income | non_interest_income | revenue | operating_expense | provision | ... | cash_and_short_term_investments | non_loan_assets | total_current_asset | total_non_current_liabilities | financing_cash_flow | operating_cash_flow | investing_cash_flow | net_cash_flow | capital_expenditure | free_cash_flow | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | CPIN.JK | None | 2025-06-30 | None | None | None | 33952000000 | 15356986000000 | 1134481000000 | None | ... | 3381678000000 | None | 21712537000000 | 3992382000000 | -1777007000000 | -464647000000 | -512128000000 | -2753782000000 | 515220000000 | -979867000000 |
| 1 | CPIN.JK | None | 2025-03-31 | None | None | None | 34199000000 | 17704697000000 | 1086894000000 | None | ... | 5773705000000 | None | 22408711000000 | 4063046000000 | -1020427000000 | 2598615000000 | -270501000000 | 1307687000000 | 308390000000 | 2290225000000 |
| 2 | CPIN.JK | None | 2024-12-31 | None | None | None | 19598000000 | 17759266000000 | 1349338000000 | None | ... | 4446488000000 | None | 21339691000000 | 3912506000000 | -1330340000000 | 2237675000000 | 195336000000 | 1102671000000 | 347212000000 | 1890463000000 |
| 3 | CPIN.JK | None | 2024-09-30 | None | None | None | 10517000000 | 16756753000000 | 1088565000000 | None | ... | 3300803000000 | None | 20815703000000 | 3872144000000 | -8407000000 | 1411568000000 | -176782000000 | 1226379000000 | 215159000000 | 1196409000000 |
4 rows Ć 40 columns
2. Prompt Template untuk Ringkasan Keuangan¶
Dilakukan untuk memandu AI memberikan ringkasan yang berkualitas dan lebih spesifik terhadap pertanyaan.
⨠Pro Tips: Daripada hanya meminta ringkasan, kita beri AI sebuah peran (sebagai analis) dan instruksi yang jelas (fokus pada pendapatan, laba, dan arus kas).
prompt_summary_template = PromptTemplate.from_template(
"""
Anda adalah seorang analis keuangan yang handal.
Berdasarkan data keuangan kuartalan berikut (dalam miliar Rupiah):
{data}
Tuliskan ringkasan eksekutif dalam 3 poin singkat untuk seorang investor.
Fokus pada:
1. Tren pertumbuhan pendapatan (revenue)
2. Tingkat profitabilitas
3. Posisi arus kas operasi
"""
)
# Eksekusi dan hasilkan ringkasan dari LLM:
prompt_summary = prompt_summary_template.format(data = financials)
print(llm.invoke(prompt_summary).content)
Berikut adalah ringkasan eksekutif dalam 3 poin singkat untuk seorang investor: 1. **Tren Pertumbuhan Pendapatan (Revenue)**: Pendapatan perusahaan menunjukkan fluktuasi, dengan nilai tertinggi sebesar 17.759 triliun Rupiah pada kuartal Maret 2025 dan nilai terendah sebesar 16.757 triliun Rupiah pada kuartal September 2024. Ini menunjukkan bahwa perusahaan mengalami peningkatan pendapatan, tetapi dengan tingkat pertumbuhan yang tidak konsisten. 2. **Tingkat Profitabilitas**: Sayangnya, data keuangan yang disediakan tidak mencakup informasi tentang laba bersih atau margin keuntungan. Namun, kita dapat melihat bahwa pendapatan bunga non-opsional sebesar 33,952 miliar Rupiah hingga 34,199 miliar Rupiah menunjukkan potensi pendapatan yang stabil. Untuk menganalisis profitabilitas lebih lanjut, diperlukan data yang lebih spesifik tentang laba bersih dan biaya operasional. 3. **Posisi Arus Kas Operasi**: Arus kas operasi perusahaan menunjukkan tren yang positif, dengan nilai tertinggi sebesar 2,598 triliun Rupiah pada kuartal Maret 2025. Ini menunjukkan bahwa perusahaan memiliki kemampuan untuk menghasilkan arus kas yang cukup dari operasionalnya. Namun, perlu diwaspadai bahwa arus kas operasi pada kuartal Juni 2025 menunjukkan penurunan signifikan menjadi -464 miliar Rupiah, yang mungkin memerlukan perhatian lebih lanjut untuk memahami penyebabnya.
3. š Visualizing Revenue Trends¶
LLM juga bisa diminta untuk menulis kode visualisasi berdasarkan data.
Kita mulai dengan mengambil bagian yang relevan:
sample_data_viz = financials[['date','revenue']]
sample_data_viz.head()
| date | revenue | |
|---|---|---|
| 0 | 2025-06-30 | 15356986000000 |
| 1 | 2025-03-31 | 17704697000000 |
| 2 | 2024-12-31 | 17759266000000 |
| 3 | 2024-09-30 | 16756753000000 |
template_viz = PromptTemplate.from_template(
"""
Anda adalah seorang programmer Python yang ahli dalam visualisasi data.
Berikut adalah data perdapatan perusahaan:
{data}
Buat sebuah skrip Python menggunakan matplotlib untuk menghasilkan line plot.
Instruksi:
- Sumbu X adalah 'date'
- Sumbu Y adalah 'revenue'
Tulis HANYA kode Python yang bisa langsung dieksekusi. Jangan sertakan penjelasan apapun.
"""
)
#Minta LLM menghasilkan kodenya:
llm_viz = llm.invoke(template_viz.format(data=sample_data_viz)).content
print(llm_viz)
```python
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
# Membuat dataframe
data = {
'date': ['2025-06-30', '2025-03-31', '2024-12-31', '2024-09-30'],
'revenue': [15356986000000, 17704697000000, 17759266000000, 16756753000000]
}
df = pd.DataFrame(data)
# Mengkonversi kolom 'date' ke datetime
df['date'] = pd.to_datetime(df['date'])
# Membuat line plot
plt.figure(figsize=(10, 6))
plt.plot(df['date'], df['revenue'], marker='o')
# Mengatur format sumbu X
plt.gca().xaxis.set_major_formatter(mdates.DateFormatter('%Y-%m-%d'))
plt.gcf().autofmt_xdate()
# Mengatur judul dan label sumbu
plt.title('Perdapatan Perusahaan')
plt.xlabel('Tanggal')
plt.ylabel('Pendapatan')
# Menampilkan plot
plt.show()
```
# Melakukan pembersihan output LLM karena kode masih terbungkus dalam ```python ... ```
clean_code = llm_viz.strip().strip("```python").strip()
clean_code
"import pandas as pd\nimport matplotlib.pyplot as plt\nimport matplotlib.dates as mdates\n\n# Membuat dataframe\ndata = {\n 'date': ['2025-06-30', '2025-03-31', '2024-12-31', '2024-09-30'],\n 'revenue': [15356986000000, 17704697000000, 17759266000000, 16756753000000]\n}\ndf = pd.DataFrame(data)\n\n# Mengkonversi kolom 'date' ke datetime\ndf['date'] = pd.to_datetime(df['date'])\n\n# Membuat line plot\nplt.figure(figsize=(10, 6))\nplt.plot(df['date'], df['revenue'], marker='o')\n\n# Mengatur format sumbu X\nplt.gca().xaxis.set_major_formatter(mdates.DateFormatter('%Y-%m-%d'))\nplt.gcf().autofmt_xdate()\n\n# Mengatur judul dan label sumbu\nplt.title('Perdapatan Perusahaan')\nplt.xlabel('Tanggal')\nplt.ylabel('Pendapatan')\n\n# Menampilkan plot\nplt.show()"
#Gunakan `exec()` untuk menjalankan kode yang berbentuk string
exec(clean_code)
4. š Interpreting Key Financial Trends¶
Meminta LLM untuk menganalisis tren dari data revenue, laba bersih dan arus kas operasional.
template_trend = PromptTemplate.from_template(
"""
Bertindaklah sebagai seorang analis keuangan.
Berdasarkan data kuartalan berikut:
{data}
Analisis tren utama yang muncul dari data tersebut. Fokus pada pergerakan revenue, net_income, dan operating.
Sajikan analisis dalam 3 poin. Tuliskan dalam bahasa yang singkat, padat, jelas
"""
)
interpretasi_tren = llm.invoke(template_trend.format(data=financials))
print(interpretasi_tren.content)
Berikut adalah analisis tren utama dari data keuangan: * **Pendapatan**: Pendapatan (revenue) mengalami fluktuasi, dengan nilai tertinggi pada kuartal 2025-03-31 sebesar 17,704 triliun dan terendah pada kuartal 2024-09-30 sebesar 16,757 triliun. * **Beban Operasional**: Beban operasional (operating_expense) juga mengalami fluktuasi, dengan nilai tertinggi pada kuartal 2024-12-31 sebesar 13,493 triliun dan terendah pada kuartal 2025-03-31 sebesar 10,869 triliun. * **Arus Kas Operasional**: Arus kas operasional (operating_cash_flow) menunjukkan tren positif, dengan nilai tertinggi pada kuartal 2025-03-31 sebesar 2,598 triliun dan terendah pada kuartal 2025-06-30 sebesar -464 miliar.
5. ā ļø Detecting Potential Financial Risks¶
Meminta LLM untuk mencari potensi risiko yang mungkin tersembunyi dalam laporan keuangan.
Seorang analis yang baik tidak hanya melihat sisi positif, tetapi juga potensi risiko. Mari kita suruh AI untuk menjadi "skeptis" dan mencari potensi masalah.
āØPro Tips: Kita minta AI untuk berperan sebagai analis risiko dan mencari red flags spesifik. Ini akan menghasilkan jawaban yang lebih tajam dan tidak generik.
template_risk = PromptTemplate.from_template(
"""
Anda adalah seorang analis risiko keuangan yang skeptis.
Periksa data keuangan berikut dengan teliti:
{data}
Indentifikasi 2-3 potensi risiko atau "red flags" yang perlu diwaspadai dari data tersebut.
Jelaskan dalam satu kalimat singkat
"""
)
llm_risiko = llm.invoke(template_risk.format(data=financials))
print(llm_risiko.content)
Beberapa potensi risiko atau "red flags" yang perlu diwaspadai dari data tersebut adalah adanya nilai-nilai kosong (None) pada beberapa kolom yang penting, seperti premium_income dan provision, serta fluktuasi besar pada beberapa jenis arus kas, seperti financing_cash_flow dan operating_cash_flow.
Kesimpulan¶
Secara keseluruhan, integrasi Python, LLM, LangChain dan Groq menciptakan alur kerja (workflow) analisis finansial yang kuat dan terotomatisasi. Alih-alih melakukan analisis manual yang memakan waktu, sistem ini dapat dengan cepat memproses data, mengidentifikasi tren dan bahkan memberikan wawasan yang dapat ditindaklanjuti. Ini memungkinkan para analis keuangan untuk fokus pada strategi dan pengambilan keputusan, bukan pada pekerjaan data yang repetitif.
Sumber:
- Dwi Gustin Nurdialit - Algoritma Data Science School, 2025
- Python
- Sectors.app
- LangChain
- Groq