Menguji strategi trading dengan backtesting – part 2

Ketika saya menulis artikel tentang backtesting yang lalu, saya sama sekali tidak bermaksud membuat lanjutan dari tulisan tersebut karena memang tujuan awalnya hanya ingin mengenalkan konsep dan cara backtesting yang sederhana untuk menguji strategi trading.

Namun, rasa skeptis saya tercolek ketika melihat sebuah unggahan di X/Twitter tentang sebuah strategi trading yang diambil dari sebuah buku. Seperti ini bunyinya:

Jadi kira-kira arti strateginya seperti ini: jika harga sebuah saham di atas rata-rata harga 200 harinya, maka belilah saham tersebut ketika sedang dalam titik terendah di 7 hari terakhirnya. Sebaliknya, jika sudah punya sahamnya, maka juallah saham tersebut ketika sedang dalam titik tertinggi di 7 hari terakhirnya.

Lalu saya coba backtest strategi tersebut untuk saham-saham yang ada di IHSG. Biar adil, saya ambil dua contoh di masing-masing level: bluechip, second liner, & third liner. Dengan asumsi modal awal Rp100 juta dan rentang waktu trading 1 tahun dan biaya transaksi 0.2%, maka inilah hasilnya. Anda bisa lihat code yang saya tulis dalam Python untuk strategi di atas di akhir tulisan ini.

Saham bluechip: BBCA & BBRI.

Hasil backtesting BBCA:

Start                     2023-11-01 00:00...
End                       2024-10-30 00:00...
Duration                    364 days 00:00:00
Exposure Time [%]                   14.705882
Equity Final [$]                  101856692.9
Equity Peak [$]                   101856692.9
Return [%]                           1.856693
Buy & Hold Return [%]               20.348837
Return (Ann.) [%]                    1.966977
Volatility (Ann.) [%]                8.716595
Sharpe Ratio                         0.225659
Sortino Ratio                        0.346744
Calmar Ratio                         0.374936
Max. Drawdown [%]                   -5.246164
Avg. Drawdown [%]                   -3.854218
Max. Drawdown Duration       23 days 00:00:00
Avg. Drawdown Duration       17 days 00:00:00
# Trades                                    5
Win Rate [%]                             80.0
Best Trade [%]                       2.642164
Worst Trade [%]                     -0.680978
Avg. Trade [%]                       1.275087
Max. Trade Duration          49 days 00:00:00
Avg. Trade Duration          33 days 00:00:00
Profit Factor                       10.407123
Expectancy [%]                       1.281209
SQN                                  1.131724

Hasil backtesting BBRI:

Start                     2023-11-01 00:00...
End                       2024-10-30 00:00...
Duration                    364 days 00:00:00
Exposure Time [%]                   15.546218
Equity Final [$]                 113256554.03
Equity Peak [$]                  113256554.03
Return [%]                          13.256554
Buy & Hold Return [%]               -2.484472
Return (Ann.) [%]                   14.088939
Volatility (Ann.) [%]               12.691553
Sharpe Ratio                         1.110104
Sortino Ratio                        2.322562
Calmar Ratio                         2.084209
Max. Drawdown [%]                    -6.75985
Avg. Drawdown [%]                   -2.934143
Max. Drawdown Duration       17 days 00:00:00
Avg. Drawdown Duration        8 days 00:00:00
# Trades                                    4
Win Rate [%]                            100.0
Best Trade [%]                      12.051591
Worst Trade [%]                      6.466158
Avg. Trade [%]                       9.325915
Max. Trade Duration          51 days 00:00:00
Avg. Trade Duration          30 days 00:00:00
Profit Factor                             NaN
Expectancy [%]                       9.350944
SQN                                  1.137439

Saham second-liner: SIDO & LSIP

Hasil backtesting SIDO:

Start                     2023-11-01 00:00...
End                       2024-10-30 00:00...
Duration                    364 days 00:00:00
Exposure Time [%]                   14.705882
Equity Final [$]                  92239800.16
Equity Peak [$]                  103580700.16
Return [%]                            -7.7602
Buy & Hold Return [%]               24.485597
Return (Ann.) [%]                   -8.197454
Volatility (Ann.) [%]               10.213831
Sharpe Ratio                              0.0
Sortino Ratio                             0.0
Calmar Ratio                              0.0
Max. Drawdown [%]                  -11.678778
Avg. Drawdown [%]                   -4.628217
Max. Drawdown Duration       40 days 00:00:00
Avg. Drawdown Duration       17 days 00:00:00
# Trades                                    1
Win Rate [%]                              0.0
Best Trade [%]                      -7.760237
Worst Trade [%]                     -7.760237
Avg. Trade [%]                      -7.760237
Max. Trade Duration          49 days 00:00:00
Avg. Trade Duration          49 days 00:00:00
Profit Factor                             0.0
Expectancy [%]                      -7.760237
SQN                                       NaN

Hasil backtesting LSIP:

Start                     2023-11-01 00:00...
End                       2024-10-30 00:00...
Duration                    364 days 00:00:00
Exposure Time [%]                   15.546218
Equity Final [$]                  78957226.49
Equity Peak [$]                  104220089.84
Return [%]                         -21.042774
Buy & Hold Return [%]               33.333333
Return (Ann.) [%]                  -22.132521
Volatility (Ann.) [%]                14.91507
Sharpe Ratio                              0.0
Sortino Ratio                             0.0
Calmar Ratio                              0.0
Max. Drawdown [%]                  -29.032707
Avg. Drawdown [%]                  -10.958523
Max. Drawdown Duration       42 days 00:00:00
Avg. Drawdown Duration       17 days 00:00:00
# Trades                                    5
Win Rate [%]                             40.0
Best Trade [%]                       3.767932
Worst Trade [%]                    -22.026231
Avg. Trade [%]                     -11.957257
Max. Trade Duration          51 days 00:00:00
Avg. Trade Duration          27 days 00:00:00
Profit Factor                        0.104688
Expectancy [%]                     -11.192682
SQN                                 -1.289667

Saham third-liner: FIRE & KJEN

Hasil backtesting FIRE:

Start                     2023-11-01 00:00...
End                       2024-10-30 00:00...
Duration                    364 days 00:00:00
Exposure Time [%]                   15.546218
Equity Final [$]                  78957226.49
Equity Peak [$]                  104220089.84
Return [%]                         -21.042774
Buy & Hold Return [%]               33.333333
Return (Ann.) [%]                  -22.132521
Volatility (Ann.) [%]                14.91507
Sharpe Ratio                              0.0
Sortino Ratio                             0.0
Calmar Ratio                              0.0
Max. Drawdown [%]                  -29.032707
Avg. Drawdown [%]                  -10.958523
Max. Drawdown Duration       42 days 00:00:00
Avg. Drawdown Duration       17 days 00:00:00
# Trades                                    5
Win Rate [%]                             40.0
Best Trade [%]                       3.767932
Worst Trade [%]                    -22.026231
Avg. Trade [%]                     -11.957257
Max. Trade Duration          51 days 00:00:00
Avg. Trade Duration          27 days 00:00:00
Profit Factor                        0.104688
Expectancy [%]                     -11.192682
SQN                                 -1.289667

Hasil backtesting KJEN:

Start                     2023-11-01 00:00...
End                       2024-10-30 00:00...
Duration                    364 days 00:00:00
Exposure Time [%]                   10.504202
Equity Final [$]                 80850959.232
Equity Peak [$]                 103590287.232
Return [%]                         -19.149041
Buy & Hold Return [%]              -30.769231
Return (Ann.) [%]                  -20.153682
Volatility (Ann.) [%]               11.365482
Sharpe Ratio                              0.0
Sortino Ratio                             0.0
Calmar Ratio                              0.0
Max. Drawdown [%]                  -21.951216
Avg. Drawdown [%]                   -6.787704
Max. Drawdown Duration       22 days 00:00:00
Avg. Drawdown Duration        9 days 00:00:00
# Trades                                    1
Win Rate [%]                              0.0
Best Trade [%]                     -19.149044
Worst Trade [%]                    -19.149044
Avg. Trade [%]                     -19.149044
Max. Trade Duration          34 days 00:00:00
Avg. Trade Duration          34 days 00:00:00
Profit Factor                             0.0
Expectancy [%]                     -19.149044
SQN                                       NaN

Seperti yang bisa dilihat dari hasil-hasil backtesting di atas, strategi ini sepertinya tidak bagus-bagus amat, malah cenderung merugikan jika Anda pakai strategi ini di saham-saham second liner & third liner. Dari contoh-contoh di atas, hasil yang paling bagus diperoleh pada saham BBRI, itupun dengan return yang hanya 13%. Sebuah angka yang bagi saya kurang nendang. 😆

Di samping itu, jika Anda perhatikan jumlah trade yang diperlukan ketika implementasi strategi ini, maka Anda akan lihat jumlah yang sangat sedikit. Ada yang 5x, bahkan ada yang hanya 1x trade saja dalam rentang waktu 1 tahun yang menjadi periode backtesting di atas. Jadi strategi ini sepertinya kurang cocok untuk Anda yang tangannya gatal untuk klik tombol Buy & Sell setiap hari.

After all, seperti yang saya tulis di artikel sebelumnya,

Semua indikator, baik yang teknikal maupun yang fundamental ada plus dan minusnya. Indikator yang tepat, dengan parameter yang tepat, diimplementasikan dengan strategi yang tepat, dan pada saham yang tepat, jelas dapat memberikan keuntungan yang maksimal.

Jadi, 6 sampel di atas jelas tidak bisa mewakili kesimpulan untuk keseluruhan saham yang ada di IHSG, apalagi saham-saham luar negeri. Jadi siapa tahu Anda bisa menemukan saham yang cocok yang bisa diimplementasikan dengan strategi ini.

Anyway, code Python yang saya tulis untuk strategi ini bisa dilihat di bawah:

from backtesting import Backtest, Strategy
import pandas as pd

class SevenDayHighLowStrategy(Strategy):
    def init(self):
        # Hitung rata-rata harga saham di 200 hari terakhir
        self.ma200 = self.I(lambda x: pd.Series(x).rolling(window=200).mean(), self.data.Close)
        
        # Hitung harga tertinggi dan terendah di 7 hari terakhir
        self.high7 = self.I(lambda x: pd.Series(x).rolling(window=7).max(), self.data.Close)
        self.low7 = self.I(lambda x: pd.Series(x).rolling(window=7).min(), self.data.Close)

    def next(self):
        # Beli jika harga di atas rata-rata harga 200 hari dan terendah dalam 7 hari terakhir
        if self.data.Close[-1] > self.ma200[-1] and self.data.Close[-1] == self.low7[-1]:
            self.buy()
        
        # Jual jika harganya mencapai titik tertinggi di 7 hari terakhir
        elif self.data.Close[-1] == self.high7[-1]:
            self.sell()

# Jalankan backtesting
bt = Backtest(data, SevenDayHighLowStrategy, cash=100_000_000, commission=.002)
stats = bt.run()
print(stats)
bt.plot()

Leave a Reply

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