Analisis Rekomendasi Saham Harian Kontan

Waktu saya membaca harian Kontan di iPad, saya melihat ada bagian rekomendasi di depan. Saya jadi bertanya-tanya: kalau mengikuti rekomendasi ini apakah bakal cuan? ataukah ini rekomendasi ampas? Rekomendasinya bentuknya seperti ini: ada tulisan singkat, dan ada rekomendasi dari 3 orang di 3 sekuritas. Kadang rekomendasinya akur: “buy”, “hold”, “sell”, atau yang lain, dan kadang bisa berbeda pendapatnya.

Contoh rekomendasi harian Kontan (dari 26 November 2021)

Setelah saya lihat arsip Kontan, kolom rekomendasi ini sudah sejak lama (2010), tapi saya cuma tertarik rekomendasi 5 tahun terakhir ini saja. Untuk menganalisis data, saya perlu:

  • mendapatkan rekomendasinya
  • mendapatkan harga stocknya
  • melakukan analisis

Mendapatkan Data

Saya mencoba mencari data rekomendasi dalam bentuk teks di situs Kontan, tapi ternyata tidak ada bagian terakhirnya. Misalnya untuk tulisan ini:

Yang muncul adalah teks seperti di gambar di bawah ini. Bisa dilihat bahwa nama orang ketiga tidak muncul. Rekomendasi buy/sell/hold juga tidak muncul. Selain itu URL nya juga tidak bisa diprediksi.

Informasi teks kurang lengkap

Jadi sepertinya data harus diekstrak dari versi gambarnya. Sayangnya format e-Paper Kontan bukan PDF, hanya JPEG. Butuh pengolahan citra untuk memprosesnya. Tapi sebelumnya, kita perlu mendownload dulu gambarnya.

Mendownload Gambar

Langkah pertama adalah mendownload gambar (JPEG) halaman depan Kontan setiap hari. Ini bisa dilakukan mudah menggunakan Python dengan package requests dan BeautifulSoup4. Saya tidak akan menceritakan detailnya, dan tidak akan membagikan skripnya, supaya server kontan tidak diserbu banyak orang.

Bagian Rekomendasi di kiri agak bawah

Server media/gambar Kontan tidak menggunakan autentikasi, dan tidak menggunakan presigned URL, jadi yang saya lakukan adalah: mengekstrak URL gambar, menyimpan semua URL di file, lalu menggunakan wget dengan mode background untuk mendownload gambarnya. Saya masukkan gambar di direktori sesuai tanggalnya.

Mengekstrak bagian rekomendasi

Bagian rekomendasi posisinya tidak selalu di koordinat yang sama. Ini bisa dicari menggunakan template gambar. Untungnya font dan ukuran judulnya tidak berubah dari dulu. Saya sudah sering memakai OpenCV ketika mengerjakan proyek AI untuk computer vision, jadi sudah langsung terpikir solusinya. Dengan menggunakan cv.matchTemplate dan gambar yang bertuliskan teks “Rekomendasi”, maka bagian rekomendasi bisa dicari dengan cepat.

Template

Untuk mempercepat: Sabtu dan Minggu tidak perlu diproses, karena rekomendasi saham hanya ada di hari kerja bursa. Jika template kata “Rekomendasi” tidak ditemukan di halaman depan, kemungkinan itu merupakan hari libur bursa.

Ekstraksi Teks dan Aksi

Ekstraksi teks saya lakukan menggunakan tesseract melalui library pytesseract di Python. Teks bisa diekstrak dengan baik, tapi sayangnya aksi “buy”/”hold”/”sell” dsb tidak selalu ketemu, karena penggunakan warna yang kadang berbeda dari teks yang lain.

แผนแรกของโลกิรวมถึง Infinity Gauntlet และการตัดต่อภาพลามกอนาจารของ Loki กับ  Tesseract ใน Avengers: Infinity War - TH Atsit
Bukan tesseract yang ini

Untuk mengakalinya saya menggunakan template gambar lagi untuk aksi “buy”, “hold”, “sell”. Masih ada aksi-aksi lain selain itu (yang saya tidak yakin maksudnya apa: “Underweight”, “overweight”, dsb). Saya tadinya ingin memproses semua, tapi ternyata banyak variasi teks, dan kadang salah eja. Untungnya untuk “buy”, “sell”, dan “hold” cukup konsisten, jadi ini saja yang dipakai.

Berbagai aksi, ada yang salah eja

Untuk nama orang dan sekuritas: tesseract akan berusaha membaca ketiga nama jadi 1 baris. Padahal ini tertulis di kolom berbeda. Cara saya menangani adalah: memotong bagian gambar sesudah aksi dengan menggunakan modul opencv pada Python, lalu mengekstrak gambarnya dengan tesseract

Gambar dipotong dulu agar bisa dikenali tesseract dengan baik

Untuk simbol kode saham, sebagian besar bisa diekstrak dari judul artikelnya saja. Tapi kadang kode ini tidak tertulis di judul, jadi perlu dicari di teksnya, mana kata 4 huruf UPPERCASE yang muncul paling sering. Saya tidak memakai regex aneh, hanya sekedar manipulasi string Python biasa untuk ekstraksinya.

Proses teks sederhana

Untuk mengecek apakah hasilnya benar. Saya buat image baru dengan informasi yang diekstrak di sampingnya. Dengan ini saya bisa memvalidasi secara visual kalau hasil ekstraksi sudah benar. Ternyata tidak 100% bisa benar, terutama untuk nama orang dan nama institusi, tapi saat ini saya hanya ingin mengekstrak saran “buy” saja, jadi tidak penting. Untuk data yang salah (biasanya karena hasil OCR tesseract tidak tepat), saya edit manual.

Verifikasi data

Data Harga Saham

Tentunya untuk bisa tahu apakah kita akan mendapatkan cuan dari pembelian saham, kita perlu tahu harganya ketika membeli dan harganya di hari-hari kemudian. Saya tahu kalau harga saham bisa didapatkan dari Yahoo, dan cukup yakin sudah ada yang membuat skrip downloadernya, dan ternyata memang benar: sudah ada go-quote.

Saya menggunakan: go-quote untuk mendownload data menjadi format CSV. Data diambil dari Yahoo Finance, dan bisa sampai 10 tahun terakhir. Tinggal tambahkan JK di akhir nama kode saham yang ingin didownload, misalnya: BBCA.JK untuk mendownload saham Bank BCA.

Analisis Data

Masalah prediksi harga saham ini merupakan hal sulit. Tidak ada metode sempurna, dan seringkali berbagai metode yang ada tidak lebih baik dari acak saja. Kalau ada orang yang bisa konsisten memilih saham jelek, ini tetap bisa jadi acuan (misalnya untuk shorting). Seperti penjelasan komik XKCD ini:

Sumber: https://xkcd.com/2270/

Jadi jika ternyata hasil analisis Kontan ini jelek, maka bisa digunakan untuk menghindari saham jelek, atau sebaliknya untuk memilih saham bagus.

Aksi

Setelah data berhasil diekstrak, muncul banyak pertanyaan. Pertama: rekomendasi apa yang harus diikuti? buy/sell/hold? bagaimana jika 2 dari 3 orang menyatakan buy sementara 1 menyatakan sell? Aksi apa yang perlu kita lakukan? Untuk analisis, saya memutuskan sederhana saja: jika 3 orang sepakat buy, maka kita beli sahamnya, selain itu kita tidak melakuan apa-apa. Untuk aksi sell dan hold jika memang tidak punya sahamnya, kita tidak bisa melakukan apa-apa, jadi masuk akal untuk men-skip saja untuk analisisnya.

Budget

Lalu berapa budget untuk membeli saham yang disarankan? apakah jumlahnya tetap? atau kita membeli 1 lot selalu, apapun sahamnya? Kalau pembeliannya selalu 1 lot, dan saham yang murah ternyata hasilnya besar, maka keuntungan jadi sedikit.

Jika ingin mengalokasikan jumlah uang yang tetap: berapa banyak? jika terlalu sedikit maka tidak semua saham bisa terbeli. Tapi jika terlalu banyak, apakah uangnya cukup? Misalnya saham tertentu 1 lotnya sampai 6 juta, dalam setahun sampai ada lebih dari 100 kali di mana ketiga rekomendasi menyatakan “buy“, jadi perlu lebih dari 600 juta jika ingin mencoba ini. Untuk ini, saya membuat ini sebagai variabel yang bisa diset.

Harga

Pertanyaan berikutnya: harga mana yang kita pakai? setiap hari ada harga buka (harga awal ketika pasar saham dibuka), harga penutupan (harga terakhir di hari itu), dan ada fluktuasi di antara keduanya. Ada harga low yang menunjukkan berapa harga terendah hari itu, dan ada high yang menunjukkan harga tertinggi hari itu. Saya memilih untuk berasumsi positif: bahwa saya bisa membeli saham di hari ketika disarankan dengan harga low (walau sebenarnya kurang realistis).

Ini saya imbangi dengan: ketika menjual, harga yang saya pakai adalah harga low juga. Jadi semoga ini cukup berimbang, karena dalam kenyataan ketika membeli kemungkinan kita perlu membeli di harga sedikit lebih tinggi, dan ketika menjual juga kemungkinan bisa menjual dengan harga lebih tinggi.

Rentang Waktu

Pertanyaan berikutnya: kapan harus saya jual sahamnya? Karena rekomendasinya tidak menyarankan target harga ataupun waktu, saya memilih rentang waktu saja, yang saya pilih: 30 hari, 60 hari, 90 hari, 180 hari, 365 hari. Saya juga membuat kolom khusus: jika kita super beruntung dan selalu bisa menjual di harga maksimum, maka berapa keuntungan yang bisa didapat, dan sebaliknya: kalau kita selalu sial dan menjual di harga minimum, berapa kerugian yang akan dialami.

Hasil

Ternyata hasilnya mengikuti saran Kontan biasa saja, bahkan kadang bisa rugi juga, dan tidak selalu bisa mengalahkan IHSG atau LQ45. Hasil ini juga tergantung berapa dana yang kita siapkan untuk mengikuti sarannya, dan kebijakan kita kapan menjual kembali sahamnya.

Untuk masalah dana: dulu saham GGRM (Gudang Garam) mencapai lebih dari Rp 60 ribu per lembar, jadi perlu mempersiapkan lebih dari 6 juta rupiah untuk membeli satu lot. Jika dana kita kurang, maka saham yang terbeli di hari itu adalah nol.

Dalam spreadsheet berikut ini: min adalah jika kita tidak beruntung dan selalu menjual di harga terendah setelah beli, dan max adalah jika kita sangat beruntung dan selalu menjual di harga tertinggi. Data lengkap bisa diunduh di spreadsheet yang saya sertakan di akhir tulisan ini.

Daily Budget 7 juta/hari

Jika dana kita sedikit, ternyata hasilnya (secara persen) lebih baik. Hasil yang bagus di 2020 karena Kontan menyarankan saham-saham yang naik lebih dari 100 % ERAA, ANTM (dua kali), MDKA, CTRA, ISAT . Ini merupakan outlier karena sejak 2016 Kontan jarang menyarankan saham multi bagger (saham untung ratusan persen) lain.

Daily budget: 100 rb/hari

Banyak hal lain yang luput dari analisis ini:

  • Dividen
  • Stock split (misalnya BCA, Unilever dsb melakukan stock split), hal ini membuat perhitungan budget tidak selalu benar

Penutup

Sebenarnya saya ingin juga menerbitkan analisis per sekuritas (yang mana yang paling akurat prediksinya), atau per orang (siapa yang jagoan menganalisis saham), tapi saya agak khawatir juga jika ada yang mempermasalahkan. Masalah ini terutama jika ada yang tersinggung jika hasilnya jelek. Jadi untuk ini silakan dianalisis sendiri. Dalam spreadsheet yang saya berikan, saya tidak menuliskan nama orang dan institusinya, jadi silakan ditambahkan sendiri.

Keisengan ini saya lakukan selama beberapa hari sebelum tidur, tiap hari hanya 1 langkah kecil (misalnya: hanya mendownload data saja), dan hasilnya saya rangkum hari ini. Saya tidak menjamin data sudah 100% benar, karena semua cuma saya cek sekilas saja. Semoga saja datanya tidak terlalu banyak salahnya, sehingga analisis ini tidak terlalu meleset.

Saya tekankan bahwa artikel hanya untuk menjawab rasa ingin tahu saya. Ini bukan mencari teknik umum trading. Ini hanya memanfaatkan ilmu saya di bidang informatika untuk mengekstrak dan mengolah data. Ada banyak teknik trading, misalnya analisis saham dengan Fundamental Analysis (FA), melihat grafik dengan Technical Analysis (TA), analisis bandar, dsb. Dan ada berbagai teknik lain mendapatkan cuan, misalnya teknik scalping yang hanya melihat volatilitas dan volume transaksi saat ini. Tulisan ini mungkin sama isengnya dengan percobaan apakah kucing bisa memilih saham lebih baik dari profesional (atau monyet). Sebagai catatan: ada penjelasan kenapa binatang yang memilih acak bisa menghasilkan return yang lebih baik.

Sumber: Forbes

Untuk yang belum berinvestasi saham: sekarang ini sudah sangat mudah. Bisa daftar di Ajaib menggunakan link saya ini, atau kalau ingin beli saham luar negeri bisa memakai GoTrade (perhatian: ini belum ada pengawasan OJK, walau sudah terdaftar di Malaysia).

Tinggalkan Balasan

Situs ini menggunakan Akismet untuk mengurangi spam. Pelajari bagaimana data komentar Anda diproses.