Finding potential high-growth stocks requires a combination of multiple analytical perspectives. Fundamental strength alone may not fully describe market opportunities because price momentum, technical conditions, and investor activity also influence stock performance.
This project develops an IDX Multibagger Alpha Scanner that combines fundamental scoring, technical analysis, and insider smart money flow to create an integrated stock ranking system.
The system evaluates stocks through three major components:
Fundamental score
Technical score
Insider transaction score
The final output is an Alpha Score that ranks stocks based on combined investment factors.
The project is developed using Python with Pandas for data processing, NumPy for numerical calculation, Requests for IDX API communication, TA library for technical indicators, and Matplotlib for visualization support. The system uses IDX API data to retrieve multibagger candidates, stock charts, and insider transaction information. idx_multibagger_alpha_scanner_v1
Cell 1 — Install Library and API Setup
This cell prepares the analysis environment by installing required libraries and configuring IDX RapidAPI authentication.
The main libraries include:
Pandas for data manipulation
NumPy for numerical processing
Requests for API communication
TA for technical indicators
Matplotlib for visualization
idx_multibagger_alpha_scanner_v1
!pip install pandas numpy requests ta matplotlib -q
import requests
import pandas as pd
import numpy as np
import ta
import matplotlib.pyplot as plt
API_KEY = "fd8db84d91msh0aa9aa413565ca5p1c66c9jsn44cc1bc07eb2"
headers = {
"x-rapidapi-host": "indonesia-stock-exchange-idx.p.rapidapi.com",
"x-rapidapi-key": API_KEY
}Cell 2 — Multibagger Candidate Scanner
This cell retrieves potential multibagger candidates from IDX API.
The scanner uses minimum score filtering and limits the number of results returned. The API response becomes the initial stock universe for further analysis. idx_multibagger_alpha_scanner_v1
import requests
import pandas as pd
import json
url = "https://indonesia-stock-exchange-idx.p.rapidapi.com/api/analysis/retail/multibagger/scan"
params = {
"min_score":50,
"max_results":20
}
response = requests.get(
url,
headers=headers,
params=params
)
print("STATUS:", response.status_code)
print("\nRAW RESPONSE:")
print(response.text[:2000])Cell 3 — Technical Analyzer
This cell performs technical analysis using historical price data.
The system calculates:
Moving Average 20
Moving Average 50
RSI indicator
Volume breakout
Price position near 60-day high
Each indicator contributes to the technical score with a maximum score of 100.
idx_multibagger_alpha_scanner_v1
# ==========================================
# CELL 3
# TECHNICAL ANALYZER FIXED API FORMAT
# ==========================================
import pandas as pd
import numpy as np
import ta
def get_chart(symbol, timeframe="daily"):
url = f"https://indonesia-stock-exchange-idx.p.rapidapi.com/api/chart/{symbol}/{timeframe}/latest"
response = requests.get(
url,
headers=headers
)
result = response.json()
try:
chart = result["data"]["data"]["chartbit"]
return pd.DataFrame(chart)
except Exception as e:
print("Chart parsing error:", e)
print(result)
return pd.DataFrame()
def technical_analysis(symbol):
chart = get_chart(symbol)
if chart.empty:
return {
"symbol":symbol,
"technical_score":0
}
# urutkan tanggal lama -> baru
chart["date"] = pd.to_datetime(
chart["date"]
)
chart = chart.sort_values(
"date"
)
# Moving Average
chart["MA20"] = (
chart["close"]
.rolling(20)
.mean()
)
chart["MA50"] = (
chart["close"]
.rolling(50)
.mean()
)
score = 0
last_price = chart["close"].iloc[-1]
# Trend MA20
if last_price > chart["MA20"].iloc[-1]:
score += 20
# Trend MA50
if last_price > chart["MA50"].iloc[-1]:
score += 20
# RSI
rsi = ta.momentum.RSIIndicator(
close=chart["close"]
).rsi()
last_rsi = rsi.iloc[-1]
if last_rsi > 50:
score +=20
# Volume breakout
avg_volume = (
chart["volume"]
.rolling(20)
.mean()
.iloc[-1]
)
if chart["volume"].iloc[-1] > avg_volume:
score +=20
# Price near high 60 hari
high60 = (
chart["close"]
.rolling(60)
.max()
.iloc[-1]
)
if last_price >= high60*0.95:
score +=20
return {
"symbol":symbol,
"last_price":last_price,
"RSI":round(last_rsi,2),
"technical_score":score
}
# TEST
technical_analysis("BBCA")Cell 4 — Insider Net Smart Money Flow
This cell analyzes insider transactions to identify accumulation or distribution behavior.
The system retrieves insider transaction data within a selected period and assigns:
Positive score for accumulation
Negative score for distribution
This component represents smart money activity. idx_multibagger_alpha_scanner_v1
# ==========================================
# CELL 4
# INSIDER NET ANALYZER
# ==========================================
def get_insider(symbols):
url = (
"https://indonesia-stock-exchange-idx.p.rapidapi.com"
f"/api/analysis/insider-net/{symbols}"
)
params = {
"date_start":"2025-11-01",
"date_end":"2025-12-31"
}
response = requests.get(
url,
headers=headers,
params=params
)
result=response.json()
print("STATUS INSIDER API:", response.status_code)
# cek struktur API
if "data" in result:
return pd.DataFrame(
result["data"]
)
elif "results" in result:
return pd.DataFrame(
result["results"]
)
elif isinstance(result,list):
return pd.DataFrame(result)
else:
print(result)
return pd.DataFrame()
# =====================================
# TEMP SYMBOL LIST
# Ganti sesuai saham yang ingin dianalisa
# =====================================
symbols = "BBCA,BUMI,ADRO"
insider_df = get_insider(symbols)
print(
"Jumlah data:",
len(insider_df)
)
insider_df.head()Cell 5 — Final Alpha Ranking
The final cell combines all analysis components into one ranking system.
The Alpha Score formula:
Fundamental Score = 50%
Technical Score = 30%
Insider Score = 20%
The result produces a ranked list of stocks based on combined investment factors. idx_multibagger_alpha_scanner_v1
result:

# ==========================================
# CELL 5
# FINAL ALPHA RANKING
# ==========================================
# Daftar saham yang dianalisa
symbols = [
"BBCA",
"BUMI",
"ADRO"
]
# ============================
# Technical Analysis
# ============================
technical_results=[]
for symbol in symbols:
result = technical_analysis(symbol)
technical_results.append(result)
technical_df = pd.DataFrame(
technical_results
)
# ============================
# Fundamental Score Manual
# Ambil dari multibagger scan nanti
# ============================
fundamental_df = pd.DataFrame({
"symbol":[
"BBCA",
"BUMI",
"ADRO"
],
"fundamental_score":[
85,
70,
75
]
})
# ============================
# Merge
# ============================
final = fundamental_df.merge(
technical_df,
on="symbol",
how="left"
)
# ============================
# Insider Score
# ============================
final["insider_score"]=0
for idx,row in final.iterrows():
ticker=row["symbol"]
for _,ins in insider_df.iterrows():
info=ins["symbols"]
if isinstance(info,dict):
if info.get("symbol")==ticker:
action=ins["dominantAction"]
if action=="ACCUMULATION":
final.loc[
idx,
"insider_score"
]=20
elif action=="DISTRIBUTION":
final.loc[
idx,
"insider_score"
]=-20
# ============================
# Final Alpha Score
# ============================
final["alpha_score"]=(
final["fundamental_score"]*0.5
+
final["technical_score"]*0.3
+
final["insider_score"]*0.2
)
final=final.sort_values(
"alpha_score",
ascending=False
)
final[
[
"symbol",
"fundamental_score",
"technical_score",
"insider_score",
"alpha_score"
]
]Conclusion
This project successfully develops an IDX Multibagger Alpha Scanner by combining fundamental analysis, technical indicators, and insider smart money flow.
The system integrates multiple investment factors into a single Alpha Score framework. Fundamental strength contributes the largest weight, while technical momentum and insider activity provide additional confirmation.
The technical engine evaluates trend direction, RSI momentum, trading volume, and price position. Meanwhile, insider analysis identifies potential accumulation or distribution behavior from market participants.
However, this scanner should not be considered a standalone investment decision system. Additional validation using company financial statements, valuation analysis, market conditions, and risk management remains necessary.
Overall, the IDX Multibagger Alpha Scanner demonstrates how automated quantitative analysis can combine multiple market signals into a structured stock screening framework.
