Metrik untuk Binary Classification untuk Algo Trading

Sudah beberapa hari terakhir ini saya berkutat dengan evaluasi berbagai model untuk keperluan algo trading. Jenis model yang saya pakai adalah binary classification. Untuk membandingkan banyak model yang berbeda, dan/atau model yang sama tapi dengan hyperparameters yang berbeda, diperlukan suatu metrik untuk mengukur mana yang lebih baik. Kelihatannya simpel, karena kita tahu ada akurasi, precision, recall, F1, dan sebagainya. Tapi setelah memakainya, saya mulai merasakan kekurangan-kekurangan dari metrik ini, dan berusaha mencari, bahkan “menemukan”, metrik lain yang lebih cocok.

Tulisan ini saya buat untuk mendokumentasikan pemikiran saya, biar nggak lupa!

Modelnya

Modelnya adalah binary classifier untuk meramalkan apakah kalau kita beli saat ini akan menghasilkan profit di masa mendatang. Ada dua kelas/label, yaitu 1 artinya YA (bisa juga diartikan sebagai sinyal BUY), dan 0 artinya TIDAK (bisa juga diartikan sebagai sinyal HOLD, atau jangan beli). Model ini hanya membuat prediksi untuk entry atau saat beli saja. Untuk saat jualnya saya mengikuti sinyal dari indikator teknikal saja, dalam hal ini PPO.

Untuk modelnya sendiri saya pakai random forest dari sklearn, dan ada beberapa hyperparameters yang bisa kita optimasi seperti n_estimators, max_depth, max_samples, max_features, dll. untuk mendapatkan yang paling optimal. Ada beberapa metrik yang bisa kita pakai untuk mengevaluasi model kita.

Akurasi

Adalah metrik yang paling umum dipakai, mempunyai rumus:

akurasi = (TP + TN) / (TP + TN + FP + FN)

dimana TP, TN, FP, FN adalah true positive, true negative, false positive, dan false negative, seperti terlihat pada diagram ini:

Dari awal saya sudah menghindari penggunaan metrik ini karena pemakaian TN dalam pembilang di persamaan di atas tidak berguna dalam domain permasalahan trading, dan bahkan mungkin bisa menyesatkan. Dalam domain trading, biasanya dataset kita unbalanced, ada jauh lebih banyak kelas negatif dibanding positif (dalam dataset saya, sekitar 70% vs 30%). Padahal tidak ada reward kalau modelnya menghasilkan TN (tidak ada cuan dong kalau kita tidak trading). Bayangkan model yang “pemalas” akan mempunyai skor akurasi yang cukup tinggi hanya dengan menghasilkan prediksi negatif.

Precision dan Recall

Rumusnya:

precision = TP / (TP + FP)

recall = TP / (TP + FN)

Intuisinya adalah:

  • precision: dari prediksi BUY yang dihasilkan (oleh model), berapa prosentase yang benar
  • recall: dari seluruh kondisi BUY yang seharusnya dihasilkan oleh model, berapa prosentase yang benar-benar dihasilkan

Awalnya saya merasa dua metrik ini yang paling cocok untuk dipakai, terutama precision, karena nilai precision yang tinggi membuat kita merasa lebih percaya diri terhadap modelnya (mirip seperti akurasi). Namun setelah memakainya, muncul sebuah permasalahan, yaitu karena ada dua metrik, maka agak sulit untuk membandingkan dua model (secara manual), apalagi kalau mau otomatis.

Sebagai contoh (yang agak ekstrim), misalnya ada model A, dengan precision 90%, tapi recall hanya 10%, dan ada model B dengan recall 90% tapi precision hanya 10%, mana yang lebih baik? Untuk konkritnya lihat contoh di bawah:

Dari segi jumlah TP, keduanya sama, yaitu 9. Dari segi akurasi juga sama, yaitu 70.71% (sekaligus menunjukkan kalau metrik akurasi kurang cocok dipakai di sini, karena akurasi setinggi ini hanya karena modelnya “sukses” memprediksi “do nothing” (=TN) pada data yang unbalanced (distribusi kelas 70% dan 30% untuk label 0 dan 1)).

Secara intuisi, sebenarnya manakah model yang lebih bagus? Kalau menurut saya, model A lebih bagus, karena precisionnya lebih tinggi (dan itu membuat perasaan lebih percaya diri hehe). Tapi tentunya kita tidak boleh memilih secara subjektif apalagi berdasarkan perasaan. Tapi kalau dipikir lagi, model B memang lebih jelek karena banyaknya FP tentu akan membuat kita mengalami banyak loss dalam trading. Walaupun TP-nya sama, tapi 81 FP akan mengakibatkan loss yang besar. Jadi dalam hal ini, intuisi untuk mempercayai precision ternyata benar.

Tapi bagaimana dengan model C di bawah ini.

Model C mempunyai precision yang lebih rendah dari model A, tapi recall lebih tinggi. Jumlah net positive (kita singkat NP, ini istilah saya sendiri, i.e. TP minus FP) lebih tinggi dari model A. Model C: 15-3=12, sedangkan model A: 9-1=8. Apakah model C lebih bagus dari model A? Secara intuisi, menurut saya iya, karena NP yang lebih banyak berpotensi menghasilkan profit yang lebih besar.

Mari kita tinjau metrik-metrik yang lain apakah ada yang membantu memecahkan masalah ini.

F1-score

F1-score adalah harmonic mean dari precision dan recall, dengan rumus:

F1 score = 2 * precision * recall / (precision + recall)

Awalnya nilai F1 ini agak susah untuk dibayangkan secara intuisi, tapi saya menemukan artikel yang bagus di sini: An Intuitive Guide To The F1 Score. Mari coba kita kalkulasi skor F1 untuk model-model kita di atas:

  • model A: 0.18
  • model B: 0.18
  • model C: 0.27

Dari sini terlihat “masalah”, yaitu model A dan B mempunyai skor yang sama (karena precision dan recallnya sama, hanya dibalik-balik), padahal seharusnya, atau inginnya, model A lebih bagus dari model B.

Net Positive

Saya tidak menemukan istilah yang tepat untuk metrik ini, tapi rumusnya sederhana sekali:

NP = TP – FP

Secara intuitif, menurut saya, metrik ini sangat pas untuk mengukur keberhasilan suatu model (trading), karena pada akhirnya, metrik yang paling berarti adalah berapa net profit kita (profit dikurangi loss), dan itu tercermin dari NP ini.

Namun masih ada “masalah”. Bagaimana jika ada dua model dengan nilai NP sama, tapi precisionnya berbeda? Hal ini cukup sering terjadi, karena NP ini angka diskrit. Secara intuitif, sepertinya kita lebih memilih model dengan precision lebih tinggi bukan? Lantas apakah NP perlu dikalikan precision agar lebih “pas”? Kayaknya udah mulai ngasal ini hehe, tidak ada dasar teorinya (paling tidak yang saya tahu [1]).

Net Positive by Precision

Ngasal atau tidak, kebutuhan untuk mempunyai satu metrik tetap ada, dan karena ketiadaan atau ketidaktahuan akan metrik yang tepat, yang paling sederhana ya mengalikan NP dengan precision:

NPBP = NP * precision

Sebagai contoh, berikut adalah chart yang saya pakai untuk suatu evaluasi. Ada dua task disini; pertama, mencari mana model yang paling bagus (ada tiga jenis model yang masing-masing saya beri nama “base”, “more”, dan “less”), dan kedua, untuk masing-masing model, berapa max_depth yang paling optimal.

Seperti Anda lihat, cukup sulit untuk memutuskan mana yang lebih baik dengan melihat chart net_positive dan precision, karena seringkali keduanya berlawanan! Dengan memakai NPBP (chart paling kanan), mungkin dapat menunjukkan setelan yang optimal.

Kesimpulan

Saya masih belum yakin metrik mana yang paling tepat untuk dipakai, tapi NPBP cukup menarik juga untuk dipakai.

Tambahan catatan, mungkin teman-teman ada yg berpikir kenapa tidak menggunakan aktual net profit dari backtest saja untuk menilai model? Menurut saya ini mempunyai beberapa kelemahan. Pertama karena angkanya rentan dicemari oleh outlier (satu trade yang profit atau lossnya sangat tinggi). Kedua karena backtest akan melibatkan komponen lain seperti money management (misalnya stop loss, trailing stop, dll), portfolio management, dll. yang kalau dipakai tentunya akan mengaburkan nilai model kita. Jadi untuk saat ini, kita ingin menilai model kita secara lebih “murni”, dengan harapan itu akan menghasilkan sistem yang paling profitable setelah kita backtest nanti.

Referensi

  1. https://en.wikipedia.org/wiki/Sensitivity_and_specificity
  2. An Intuitive Guide To The F1 Score

Tinggalkan Balasan

Isikan data di bawah atau klik salah satu ikon untuk log in:

Logo WordPress.com

You are commenting using your WordPress.com account. Logout /  Ubah )

Gambar Twitter

You are commenting using your Twitter account. Logout /  Ubah )

Foto Facebook

You are commenting using your Facebook account. Logout /  Ubah )

Connecting to %s

Blog di WordPress.com.

Atas ↑

%d blogger menyukai ini: