Mencari Liquidity Grab

Ketika sedang scrolling TikTok, saya menemukan sebuah konten yang memperlihatkan David Paul, seorang trader, yang sedang berbicara di depan audiens, kata-katanya kira-kira seperti ini:

Para pemain besar dapat dengan mudah memanipulasi harga, tapi mereka tidak bisa dengan mudah memanipulasi volume.

Para pemain besar di sini maksudnya para big money atau yang biasa kita sebut dengan bandar, sementara harga maksudnya harga instrumen investasi, bisa saham, komoditas, crypto, dan lain-lain. Volume yang dimaksud di sini adalah volume perdagangan.

Bagi saya yang pernah meneliti soal deteksi manipulasi pasar sebagai tesis dulu, saya merasa kata-katanya sangat masuk akal. Kenapa kata-katanya masuk akal? Ya karena untuk pasar yang kurang likuid, sangat mudah bagi yang memiliki modal besar untuk menaik-turunkan harga sebuah aset secara signifikan. Dengan kata lain, harganya bisa dimanipulasi. Manipulasi harga aset di pasar yang kurang likuid tersebut bisa dilakukan tanpa perlu membanjiri order dengan volume yang relatif lebih besar dari biasanya. Makanya, manipulasi harga lebih mudah ketimbang manipulasi volume.

Lalu si pembuat konten mencoba memberikan sebuah visualisasi kalimat tersebut ke dalam sebuah grafik di TradingView, seperti ini:

Perhatikan rupa harga dalam candlestick dan besar volume di bagian bawah. Si pembuat konten bahkan menambahkan indikator moving average dengan panjang periode 20 (entah menit, hari atau minggu) berupa garis putih untuk memperlihatkan tren volume yang ada.

Bisa dilihat kontradiksinya kan? Harganya bergerak dengan volatilitas tinggi, sementara volume perdagangan pada periode tersebut cenderung stagnan. Padahal, jika harga bergerak secara alami (misal pada saat pasar bearish), maka volume perdagangan juga pasti mengalami tren peningkatan karena jumlah orang yang ingin menjual aset membeludak.

Fenomena ini dinamakan sebagai liquidity grab, yaitu di mana pemain besar menurunkan harga aset dengan cepat dan drastis untuk mencari likuiditas di pasar yang biasanya diperoleh dari investor ritel, untuk kemudian harga aset tersebut diangkat lagi untuk menghasilkan profit.

Video tersebut menampilkan bagaimana si kreator konten menjadikan fenomena itu sebagai strategi trading yang dia lakukan. Namun karena harus memantau grafik harga aset satu persatu, saya terpikir untuk membuat sebuah Python script untuk screening saham yang mengalami fenomena liquidity grab tersebut.

Pertama, install dulu library yang dibutukan, dan tentukan parameter-parameter pentingnya.

# install library yang dibutuhkan
import yfinance as yf
import pandas as pd
import numpy as np

# ─── parameter yang diperlukan ───────────────────────────────────────────
HISTORY_DAYS      = 180            # sejauh mana data historis yang digunakan
ATR_LEN           = 20             # panjang horizon untuk ATR & MAs
LOOKBACK_X        = 40             # evaluasi kedataran volume di sepanjang periode ini
VOL_FLAT_BAND     = 0.03           # ±3 % toleransi lebar kedataran volume SMA20
ATR_RATIO_THRESH  = 0.03           # 3 % batas ATR

Lalu bagian utamanya. Yang paling penting dari fenomena ini adalah bagaimana kita mendeteksi harga saham yang volatil (kita bisa temukan ini dengan menghitung average true range/ATR) dan juga kita bandingkan dengan tren volumenya di sepanjang periode terakhir (kita bisa hitung ini dengan simple moving average).

def atr(h, l, c, n=14):
    hl = h - l
    hc = (h - c.shift()).abs()
    lc = (l - c.shift()).abs()
    return pd.concat([hl, hc, lc], axis=1).max(axis=1).rolling(n).mean()
df["ATR"]       = atr(df["High"], df["Low"], df["Close"], ATR_LEN)
df["ATR_ratio"] = df["ATR"] / df["Close"]

vol_sma         = df["Volume"].rolling(ATR_LEN).mean()
df["Vol_dev"]   = (df["Volume"] / vol_sma).sub(1).abs()

dan kemudian mengecek apakah kedua kondisi di atas sudah terpenuhi:

latest          = df.iloc[-1]
    vol_window_ok   = df["Vol_dev"].iloc[-LOOKBACK_X:].max() < VOL_FLAT_BAND
    volatile_enough = latest["ATR_ratio"] > ATR_RATIO_THRESH

    if vol_window_ok and volatile_enough:
        rows.append({
            "Date"      : latest.name.date(),
            "Ticker"    : tkr,
            "Close"     : latest["Close"],
            "ATR_ratio" : round(latest["ATR_ratio"], 4),
            "Vol_CV"    : round(df["Volume"].iloc[-LOOKBACK_X:].std()
                                / df["Volume"].iloc[-LOOKBACK_X:].mean(), 4)
        })

Kemudian hasilnya tinggal kita tampilkan:

if rows:
    out = pd.DataFrame(rows).set_index("Date")
    print("\n=== SAHAM YANG COCOK DENGAN POLA ===")
    print(out.sort_values("ATR_ratio", ascending=False).to_string())
else:
    print("Tidak ada simbol saham yang sesuai kriteria — coba relaksasi parameternya.")

Ada beberapa kemungkinan hasil yang bisa didapat. Jika terlalu banyak saham yang masuk ke dalam screening tersebut, coba naikkan parameter ATR_RATIO_THRESH atau perkecil parameter VOL_FLAT_BAND. Jika sedikit atau tidak ada sama sekali yang cocok, turunkan threshold-nya atau perpanjang LOOKBACK_X menjadi 30-40 hari.

Bagaimana, tertarik mencoba? 😏

Kode lengkapnya ada di sini.

Leave a Reply

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