Strasmore Research
Edukasi Matt ConnorOleh Matt Connor

Pola Candlestick Bearish: Diuji dengan Data Harian

Pola candlestick bearish diuji dengan data harian: seberapa sering harga ditutup lebih rendah setelah bearish engulfing, shooting star, dan empat pola lain, dengan baris kontrol.

Pola candlestick bearish adalah sekumpulan bentuk bar harian yang diajarkan sebagai tanda harga akan berbalik turun: bearish engulfing, shooting star, dark cloud cover, evening star, hanging man, dan three black crows. Halaman ini mendefinisikan keenamnya lewat hubungan open, high, low, dan close, lalu mengukur apa yang terjadi sesudahnya pada 31683 sesi harian saham AS berkapitalisasi besar. Satu angka yang hampir selalu hilang dari tutorial pola ikut dihitung di sini: tingkat dasar sesi turun biasa, sebagai pembanding.

Enam pola bearish, didefinisikan lewat open, high, low, close

Satu candle memuat empat angka. Badan (body) adalah jarak antara open dan close. Ekor atas adalah jarak dari high ke ujung atas badan, ekor bawah dari ujung bawah badan ke low. Candle turun berarti close di bawah open. Keenam pola berikut hanyalah aturan tentang empat angka itu pada satu sampai tiga bar berurutan. Uji numeriknya ditulis apa adanya, sebab tiap platform memilih ambang sendiri.

  • Bearish engulfing: bar sebelumnya naik, open hari ini di atas close sebelumnya, close hari ini di bawah open sebelumnya. Badan hari ini menelan badan sebelumnya.
  • Dark cloud cover: bar sebelumnya naik, open hari ini di atas close sebelumnya, tetapi close hari ini berhenti di dalam badan sebelumnya, di bawah titik tengahnya dan masih di atas open sebelumnya. Keduanya saling meniadakan: yang satu berhenti di dalam badan, yang lain melewatinya.
  • Shooting star: ekor atas minimal 55% rentang high ke low, badan maksimal 35% rentang, ekor bawah maksimal 15% rentang, dan close di atas rata rata close 10 sesi sebelumnya.
  • Hanging man: bentuk cermin shooting star. Ekor bawah panjang, badan kecil di bagian atas rentang, ekor atas hampir tidak ada, juga saat close berada di atas rata rata 10 sesi.
  • Evening star: tiga bar. Bar pertama naik kuat, bar kedua berbadan kecil yang seluruhnya di atas close bar pertama, bar ketiga turun dan ditutup di bawah titik tengah badan bar pertama.
  • Three black crows: tiga bar turun berurutan, tiap close lebih rendah dari close sebelumnya, dan tiap open berada di dalam badan bar sebelumnya.

Seberapa sering harga turun setelah pola candlestick bearish?

Pengukurannya sederhana. Untuk setiap kejadian, close pada 1, 5, dan 20 sesi berikutnya dibandingkan dengan close pada hari pola terbentuk. Baris "Semua sesi (kontrol)" menjalankan hitungan yang sama atas seluruh sesi dalam sampel, bukan hanya sesi berpola. Tanpa baris itu, persentase pola tidak punya arti.

QueryTingkat penurunan setelah enam pola bearish, dibanding kontrol
nama_polakejadian_countturun_1_sesi_pctturun_5_sesi_pctturun_20_sesi_pctselisih_20_sesi_pct
Bearish engulfing111946.343.641.1-0.5
Dark cloud cover52841.941.536.4-5.2
Evening star28446.146.145.84.2
Hanging man107945.844.140-1.6
Semua sesi (kontrol)3168347.544.741.60
Shooting star81646.845.341.80.2
Three black crows28648.34943.41.8
SQL tepat di balik setiap angka
WITH
harian AS (
    SELECT ticker, date,
           argMax(toFloat64(open),  _ingest_time) AS o,
           argMax(toFloat64(high),  _ingest_time) AS h,
           argMax(toFloat64(low),   _ingest_time) AS l,
           argMax(toFloat64(close), _ingest_time) AS c
    FROM global_markets.stocks_daily_aggs
    WHERE ticker IN ('AAPL', 'MSFT', 'JPM', 'JNJ', 'KO', 'PG', 'WMT', 'XOM')
      AND date BETWEEN '2010-01-01' AND '2026-03-31'
    GROUP BY ticker, date
),
pecahan AS (
    SELECT ticker, groupArray(execution_date) AS tanggal
    FROM global_markets.stocks_splits
    WHERE ticker IN ('AAPL', 'MSFT', 'JPM', 'JNJ', 'KO', 'PG', 'WMT', 'XOM')
      AND execution_date BETWEEN '2009-11-01' AND '2026-05-31'
    GROUP BY ticker
),
bars AS (
    SELECT ticker, date, o, h, l, c,
           lagInFrame(o, 1)   OVER w  AS p1o,
           lagInFrame(c, 1)   OVER w  AS p1c,
           lagInFrame(o, 2)   OVER w  AS p2o,
           lagInFrame(c, 2)   OVER w  AS p2c,
           leadInFrame(c, 1)  OVER w  AS f1c,
           leadInFrame(c, 5)  OVER w  AS f5c,
           leadInFrame(c, 20) OVER w  AS f20c,
           avg(c)             OVER w2 AS ma10
    FROM harian
    WINDOW w  AS (PARTITION BY ticker ORDER BY date ROWS BETWEEN 20 PRECEDING AND 20 FOLLOWING),
           w2 AS (PARTITION BY ticker ORDER BY date ROWS BETWEEN 10 PRECEDING AND 1 PRECEDING)
),
sesi AS (
    SELECT b.c AS c, b.f1c AS f1c, b.f5c AS f5c, b.f20c AS f20c,
           arrayConcat(
               ['Semua sesi (kontrol)'],
               if(b.p1c > b.p1o AND b.c < b.o AND b.o > b.p1c AND b.c < b.p1o, ['Bearish engulfing'], []),
               if(b.p1c > b.p1o AND b.c < b.o AND b.o > b.p1c AND b.c < (b.p1o + b.p1c) / 2 AND b.c > b.p1o, ['Dark cloud cover'], []),
               if(b.h > b.l AND (b.h - greatest(b.o, b.c)) >= 0.55 * (b.h - b.l) AND abs(b.c - b.o) <= 0.35 * (b.h - b.l) AND (least(b.o, b.c) - b.l) <= 0.15 * (b.h - b.l) AND b.c > b.ma10, ['Shooting star'], []),
               if(b.h > b.l AND (least(b.o, b.c) - b.l) >= 0.55 * (b.h - b.l) AND abs(b.c - b.o) <= 0.35 * (b.h - b.l) AND (b.h - greatest(b.o, b.c)) <= 0.15 * (b.h - b.l) AND b.c > b.ma10, ['Hanging man'], []),
               if(b.p2c > b.p2o AND abs(b.p1c - b.p1o) <= 0.4 * (b.p2c - b.p2o) AND least(b.p1o, b.p1c) >= b.p2c AND b.c < b.o AND b.c < (b.p2o + b.p2c) / 2, ['Evening star'], []),
               if(b.c < b.o AND b.p1c < b.p1o AND b.p2c < b.p2o AND b.c < b.p1c AND b.p1c < b.p2c AND b.o <= b.p1o AND b.o >= b.p1c AND b.p1o <= b.p2o AND b.p1o >= b.p2c, ['Three black crows'], [])
           ) AS pola
    FROM bars AS b
    LEFT JOIN pecahan AS s ON s.ticker = b.ticker
    WHERE b.date BETWEEN '2010-03-01' AND '2025-12-31'
      AND b.p2o > 0 AND b.p2c > 0 AND b.ma10 > 0
      AND b.f1c > 0 AND b.f5c > 0 AND b.f20c > 0
      AND NOT arrayExists(d -> d > b.date - 30 AND d <= b.date + 45, s.tanggal)
),
terbuka AS (
    SELECT arrayJoin(pola) AS nama_pola, c, f1c, f5c, f20c FROM sesi
),
ringkas AS (
    SELECT nama_pola,
           count()                                     AS kejadian_count,
           round(100 * countIf(f1c  < c) / count(), 1) AS turun_1_sesi_pct,
           round(100 * countIf(f5c  < c) / count(), 1) AS turun_5_sesi_pct,
           round(100 * countIf(f20c < c) / count(), 1) AS turun_20_sesi_pct
    FROM terbuka
    GROUP BY nama_pola
)
SELECT nama_pola, kejadian_count, turun_1_sesi_pct, turun_5_sesi_pct, turun_20_sesi_pct,
       round(turun_20_sesi_pct - (SELECT turun_20_sesi_pct FROM ringkas WHERE nama_pola = 'Semua sesi (kontrol)'), 1) AS selisih_20_sesi_pct
FROM ringkas
ORDER BY nama_pola
Jalankan sendiri

Baris kontrol memberi tingkat dasarnya: dari 31683 sesi, 47.5% ditutup lebih rendah satu sesi kemudian, 44.7% setelah lima sesi, dan 41.6% setelah 20 sesi. Itulah tiga angka yang harus dilampaui sebuah pola sebelum layak disebut sinyal.

Bearish engulfing muncul 1119 kali dalam sampel. Satu sesi setelahnya 46.3% ditutup lebih rendah, dan setelah 20 sesi 41.1%. Dark cloud cover, yang menuntut close berhenti di dalam badan sebelumnya, muncul 528 kali dengan 41.9% pada satu sesi. Kolom terakhir tabel mengurangkan tingkat dasar 20 sesi dari angka tiap pola: untuk bearish engulfing nilainya -0.5 poin persentase, untuk dark cloud cover -5.2.

Pola berbadan kecil berekor panjang bernasib sejenis. Shooting star tercatat 816 kali dengan 46.8% penurunan satu sesi, hanging man 1079 kali dengan 45.8%. Dua pola tiga bar jauh lebih jarang: evening star 284 kejadian dengan 45.8% pada 20 sesi, three black crows 286 kejadian dengan 49% pada lima sesi. Sampel sekecil itu membawa rentang ketidakpastian lebar, jadi satu digit desimal di sana bukan keunggulan.

Apakah volume mengubah angkanya?

Nasihat paling umum tentang pola bearish adalah mencari konfirmasi volume. Itu bisa diuji. Panel berikut memakai satu pola saja, bearish engulfing, lalu memecah seluruh kejadiannya menurut volume hari pola dibagi rata rata volume 20 sesi sebelumnya.

QueryBearish engulfing dipecah menurut volume hari pola
volume_bucketkejadian_countturun_1_sesi_pctturun_5_sesi_pctturun_20_sesi_pct
1. volume di bawah 0,8x rata rata26948.744.239.8
2. volume 0,8x sampai 1,2x59746.244.641.5
3. volume 1,2x sampai 2x22346.242.241.3
4. volume di atas 2x rata rata3026.73043.3
SQL tepat di balik setiap angka
WITH
harian AS (
    SELECT ticker, date,
           argMax(toFloat64(open),   _ingest_time) AS o,
           argMax(toFloat64(close),  _ingest_time) AS c,
           argMax(toFloat64(volume), _ingest_time) AS v
    FROM global_markets.stocks_daily_aggs
    WHERE ticker IN ('AAPL', 'MSFT', 'JPM', 'JNJ', 'KO', 'PG', 'WMT', 'XOM')
      AND date BETWEEN '2010-01-01' AND '2026-03-31'
    GROUP BY ticker, date
),
pecahan AS (
    SELECT ticker, groupArray(execution_date) AS tanggal
    FROM global_markets.stocks_splits
    WHERE ticker IN ('AAPL', 'MSFT', 'JPM', 'JNJ', 'KO', 'PG', 'WMT', 'XOM')
      AND execution_date BETWEEN '2009-11-01' AND '2026-05-31'
    GROUP BY ticker
),
bars AS (
    SELECT ticker, date, o, c, v,
           lagInFrame(o, 1)   OVER w  AS p1o,
           lagInFrame(c, 1)   OVER w  AS p1c,
           leadInFrame(c, 1)  OVER w  AS f1c,
           leadInFrame(c, 5)  OVER w  AS f5c,
           leadInFrame(c, 20) OVER w  AS f20c,
           avg(v)             OVER w2 AS vol_rata_20
    FROM harian
    WINDOW w  AS (PARTITION BY ticker ORDER BY date ROWS BETWEEN 20 PRECEDING AND 20 FOLLOWING),
           w2 AS (PARTITION BY ticker ORDER BY date ROWS BETWEEN 20 PRECEDING AND 1 PRECEDING)
)
SELECT multiIf(b.v / b.vol_rata_20 < 0.8, '1. volume di bawah 0,8x rata rata',
               b.v / b.vol_rata_20 < 1.2, '2. volume 0,8x sampai 1,2x',
               b.v / b.vol_rata_20 < 2.0, '3. volume 1,2x sampai 2x',
                                          '4. volume di atas 2x rata rata') AS volume_bucket,
       count()                                         AS kejadian_count,
       round(100 * countIf(b.f1c  < b.c) / count(), 1) AS turun_1_sesi_pct,
       round(100 * countIf(b.f5c  < b.c) / count(), 1) AS turun_5_sesi_pct,
       round(100 * countIf(b.f20c < b.c) / count(), 1) AS turun_20_sesi_pct
FROM bars AS b
LEFT JOIN pecahan AS s ON s.ticker = b.ticker
WHERE b.date BETWEEN '2010-03-01' AND '2025-12-31'
  AND b.p1c > b.p1o AND b.c < b.o AND b.o > b.p1c AND b.c < b.p1o
  AND b.vol_rata_20 > 0 AND b.f1c > 0 AND b.f5c > 0 AND b.f20c > 0
  AND NOT arrayExists(d -> d > b.date - 30 AND d <= b.date + 45, s.tanggal)
GROUP BY volume_bucket
ORDER BY volume_bucket
Jalankan sendiri

Kelompok volume paling tipis, di bawah 0,8 kali rata rata, berisi 269 kejadian dan mencatat 44.2% penutupan lebih rendah dalam lima sesi. Kelompok paling ramai, di atas dua kali rata rata, berisi 30 kejadian dengan 30% pada lima sesi dan 43.3% pada 20 sesi. Tingkat dasar lima sesi dari panel pertama, 44.7%, adalah garis yang perlu Anda letakkan di sebelah keempat baris itu sebelum menilai mana yang berarti.

Di mana pola itu berdiri relatif terhadap tren sebelumnya

Buku pola selalu menuntut konteks: pola pembalikan bearish katanya hanya berlaku setelah harga naik. Panel ini memecah bearish engulfing menurut arah sepuluh sesi sebelum pola, diukur dari close sebelas sesi lalu ke close sehari sebelum pola.

QueryBearish engulfing menurut arah 10 sesi sebelumnya
tren_bucketkejadian_countturun_1_sesi_pctturun_5_sesi_pctturun_20_sesi_pct
1. sepuluh sesi sebelumnya turun lebih dari 5%6855.948.544.1
2. sepuluh sesi sebelumnya turun sampai 5%35945.441.237
3. sepuluh sesi sebelumnya naik sampai 5%56246.844.542
4. sepuluh sesi sebelumnya naik lebih dari 5%13041.543.846.9
SQL tepat di balik setiap angka
WITH
harian AS (
    SELECT ticker, date,
           argMax(toFloat64(open),  _ingest_time) AS o,
           argMax(toFloat64(close), _ingest_time) AS c
    FROM global_markets.stocks_daily_aggs
    WHERE ticker IN ('AAPL', 'MSFT', 'JPM', 'JNJ', 'KO', 'PG', 'WMT', 'XOM')
      AND date BETWEEN '2010-01-01' AND '2026-03-31'
    GROUP BY ticker, date
),
pecahan AS (
    SELECT ticker, groupArray(execution_date) AS tanggal
    FROM global_markets.stocks_splits
    WHERE ticker IN ('AAPL', 'MSFT', 'JPM', 'JNJ', 'KO', 'PG', 'WMT', 'XOM')
      AND execution_date BETWEEN '2009-11-01' AND '2026-05-31'
    GROUP BY ticker
),
bars AS (
    SELECT ticker, date, o, c,
           lagInFrame(o, 1)   OVER w AS p1o,
           lagInFrame(c, 1)   OVER w AS p1c,
           lagInFrame(c, 11)  OVER w AS p11c,
           leadInFrame(c, 1)  OVER w AS f1c,
           leadInFrame(c, 5)  OVER w AS f5c,
           leadInFrame(c, 20) OVER w AS f20c
    FROM harian
    WINDOW w AS (PARTITION BY ticker ORDER BY date ROWS BETWEEN 25 PRECEDING AND 20 FOLLOWING)
)
SELECT multiIf(100 * (b.p1c / b.p11c - 1) < -5, '1. sepuluh sesi sebelumnya turun lebih dari 5%',
               100 * (b.p1c / b.p11c - 1) <  0, '2. sepuluh sesi sebelumnya turun sampai 5%',
               100 * (b.p1c / b.p11c - 1) <  5, '3. sepuluh sesi sebelumnya naik sampai 5%',
                                                '4. sepuluh sesi sebelumnya naik lebih dari 5%') AS tren_bucket,
       count()                                         AS kejadian_count,
       round(100 * countIf(b.f1c  < b.c) / count(), 1) AS turun_1_sesi_pct,
       round(100 * countIf(b.f5c  < b.c) / count(), 1) AS turun_5_sesi_pct,
       round(100 * countIf(b.f20c < b.c) / count(), 1) AS turun_20_sesi_pct
FROM bars AS b
LEFT JOIN pecahan AS s ON s.ticker = b.ticker
WHERE b.date BETWEEN '2010-03-01' AND '2025-12-31'
  AND b.p1c > b.p1o AND b.c < b.o AND b.o > b.p1c AND b.c < b.p1o
  AND b.p11c > 0 AND b.f1c > 0 AND b.f5c > 0 AND b.f20c > 0
  AND NOT arrayExists(d -> d > b.date - 30 AND d <= b.date + 45, s.tanggal)
GROUP BY tren_bucket
ORDER BY tren_bucket
Jalankan sendiri

Kejadian yang mengikuti kenaikan lebih dari 5% dalam sepuluh sesi, baris keempat, berjumlah 130 dengan 43.8% penutupan lebih rendah pada lima sesi dan 46.9% pada 20 sesi. Kejadian yang justru mengikuti penurunan lebih dari 5%, baris pertama, berjumlah 68 dengan 44.1% pada 20 sesi. Filter tren mengubah komposisi sampel. Dua orang yang menguji pola yang sama dengan filter tren berbeda akan melaporkan angka berbeda tanpa ada yang berbohong. Logika pengukuran yang sama berlaku untuk sinyal perpotongan rata rata: lihat apakah death cross bisa berakhir bullish.

Candle IDX bukan objek yang sama dengan candle AS

Seluruh angka di atas berasal dari bar harian saham AS. Memindahkannya mentah mentah ke BBCA, BBRI, TLKM, atau ASII adalah kekeliruan, sebab "satu hari" di dua bursa itu bukan benda yang sama.

  • Harga dalam Rupiah dengan fraksi harga bertingkat. Saham berharga ratusan Rupiah hanya punya sedikit nilai harga yang sah di antara open dan close, sehingga badan dan ekor candle tersusun di atas kisi yang jauh lebih kasar daripada saham dolar.
  • Sesi terbagi dua dengan istirahat tengah hari, dibuka pukul 09:00 WIB dan berakhir lewat pra penutupan sekitar pukul 15:00 WIB, dengan jadwal Jumat yang berbeda. Satu bar harian IDX menjahit dua sesi perdagangan, dan dua dari empat angkanya, open dan close, keluar dari lelang, bukan dari perdagangan berkelanjutan.
  • Batas auto rejection membatasi seberapa jauh harga boleh bergerak dari acuan dalam satu sesi, dan besarnya mengikuti rentang harga saham. Saat harga menyentuh batas itu, bar harian berhenti di sana. Pola yang bergantung pada jarak besar antar bar, seperti dark cloud cover dan evening star, bekerja dengan bahan baku yang terpotong di bawah aturan ini.
  • Likuiditas lebih tipis di luar papan utama. Pada saham yang jarang bertransaksi, satu order besar bisa menetapkan high atau low sesi, sehingga panjang ekor, yang menjadi inti definisi shooting star dan hanging man, berpindah oleh volume kecil.

Yang bisa dipindahkan bukan angkanya, melainkan resepnya: tandai setiap kejadian pola, hitung persentase yang ditutup lebih rendah pada 1, 5, dan 20 sesi berikutnya, lalu hitung angka yang sama atas seluruh sesi pada saham dan periode yang sama sebagai kontrol. Bila sampel IDX dan sampel AS tidak sepakat, yang Anda temukan adalah batas berlakunya pola, bukan kesalahan datanya. Celah pembukaan yang menjadi bahan baku dark cloud cover punya ceritanya sendiri di pembahasan apakah gap harga akhirnya tertutup.

Mengapa chart yang sama diberi label berbeda di tiap platform

Dua pembaca grafik bisa menatap bar yang identik dan tidak sepakat apakah itu shooting star. Empat sumber perbedaannya:

  • Ambang. Tidak ada otoritas yang menetapkan seberapa panjang "ekor panjang". Panel di halaman ini memakai 55% rentang harian, indikator lain memakai dua kali panjang badan, yang lain lagi memakai angka sendiri.
  • Penyesuaian harga. Bar yang disesuaikan dividen dan aksi korporasi memiliki open dan close berbeda dari bar mentah, sehingga pola yang menuntut close di bawah open bisa ada di satu versi dan hilang di versi lain.
  • Cara bar disusun: transaksi mana yang dihitung, apakah perdagangan di luar jam reguler ikut masuk, dan di zona waktu apa batas harinya ditarik. Rinciannya ada di cara bar OHLCV dibentuk.
  • Pembulatan dan sumber data. Dua penyedia bisa berbeda satu sen pada close, dan satu sen cukup untuk membalik uji "close di bawah titik tengah badan". Hal serupa membuat RSI berbeda antar platform.

FAQ

Apakah bearish engulfing berarti harga pasti turun?

Tidak. Pada sampel di halaman ini, bearish engulfing diikuti penutupan lebih rendah satu sesi kemudian pada 46.3% kejadian, sementara seluruh sesi dalam sampel yang sama mencatat 47.5%. Pola itu menggambarkan bentuk bar yang sudah terjadi, bukan ramalan.

Seberapa sering pola pola bearish ini muncul?

Dalam sampel ini bearish engulfing tercatat 1119 kejadian dan dark cloud cover 528, sementara pola tiga bar seperti evening star hanya 284. Frekuensi bergantung penuh pada ambang yang dipakai untuk mendefinisikan tiap pola.

Apakah volume besar membuat pola bearish lebih bisa diandalkan?

Kejadian bearish engulfing dengan volume di atas dua kali rata rata 20 sesi mencatat 30% penutupan lebih rendah dalam lima sesi, dibanding 44.2% untuk kejadian bervolume paling tipis. Letakkan keduanya di sebelah tingkat dasar sampel, 44.7%, sebelum menyimpulkan.

Apakah pola candlestick bearish bekerja sama di saham IDX?

Belum tentu. Angka di halaman ini dihitung dari bar harian saham AS, bukan IDX. Fraksi harga Rupiah, sesi yang terbelah oleh istirahat tengah hari, dan batas auto rejection membuat bar harian IDX menjadi objek berbeda, jadi pengujiannya perlu diulang pada data IDX dengan baris kontrol yang sama.

Catatan data
  • Bar harian dibaca satu baris per ticker per tanggal memakai argMax(..., _ingest_time), sehingga baris ganda dari pemuatan ulang tidak terhitung dua kali.
  • Harga yang dipakai adalah harga mentah, bukan harga yang disesuaikan. Agar stock split tidak terbaca sebagai celah harga raksasa, setiap sesi dalam 30 hari kalender sebelum sampai 45 hari kalender sesudah tanggal pelaksanaan split dikeluarkan, termasuk kejadian yang jendela 20 sesinya melewati tanggal itu.
  • Perbandingan selalu close ke close: close 1, 5, dan 20 sesi berikutnya terhadap close hari pola.
  • Sampel: delapan saham AS berkapitalisasi besar, bar harian, Maret 2010 sampai Desember 2025, dengan close lanjutan dibaca hingga awal 2026.

Setiap panel di sini membawa SQL-nya sendiri, buka saja untuk melihat bagaimana angkanya dihitung. Pertanyaan seperti ini bisa Anda ajukan dalam bahasa sehari hari di terminal Strasmore.

#candlestick#pola bearish#analisis teknikal#price action#backtest