OHLC.dev editorialIDX

IDX Multibagger Alpha Scanner Using Fundamental Technical and Smart Money Analysis

This article presents an IDX Multibagger Alpha Scanner system that combines fundamental analysis technical indicators and insider transaction data to generate stock alpha rankings.

September 28, 20265 min readRafatar
IDX Multibagger Alpha Scanner Using Fundamental Technical and Smart Money Analysis

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:

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.