Friday, July 24, 2026
Python Saham

Belajar Algoritma Trading Menggunakan Python untuk Pemula

Pendahuluan

Algorithmic Trading atau Algo Trading adalah metode melakukan analisis dan menghasilkan sinyal transaksi menggunakan aturan yang telah ditentukan sebelumnya.

Berbeda dengan trading manual yang sangat dipengaruhi emosi, algoritma trading bekerja berdasarkan logika yang konsisten.

Contohnya:

  • Beli jika MA20 memotong MA50 dari bawah.
  • Jual jika RSI lebih dari 70.
  • Stop Loss jika harga turun 5%.
  • Ambil keuntungan (Take Profit) pada kenaikan 10%.

Semua aturan tersebut dapat diterjemahkan ke dalam kode Python sehingga proses analisis menjadi lebih cepat, konsisten, dan mudah diuji.


Apa Itu Algorithmic Trading?

Algorithmic Trading adalah proses menggunakan program komputer untuk menghasilkan sinyal beli dan jual berdasarkan aturan tertentu.

Alur sederhananya:

Data Harga
      │
      ▼
Hitung Indikator
      │
      ▼
Evaluasi Aturan
      │
      ▼
Sinyal BUY / SELL
      │
      ▼
Backtesting
      │
      ▼
Eksekusi (Opsional)

Pada artikel ini kita akan fokus pada pembuatan sinyal dan evaluasi strategi, bukan pada pengiriman order otomatis ke broker.


Mengapa Menggunakan Python?

Python menjadi bahasa yang sangat populer di dunia quantitative finance karena:

  • Sintaks mudah dipelajari.
  • Memiliki ekosistem pustaka yang lengkap.
  • Cocok untuk analisis data.
  • Mendukung visualisasi.
  • Mudah diintegrasikan dengan API.

Library yang sering digunakan:

LibraryFungsi
pandasMengolah data
numpyPerhitungan numerik
yfinanceMengambil data saham
matplotlibVisualisasi
taIndikator teknikal
backtesting.pyBacktesting strategi
vectorbtAnalisis kuantitatif skala besar

Persiapan Lingkungan

Install library yang dibutuhkan.

pip install yfinance pandas numpy matplotlib ta

Verifikasi instalasi:

import yfinance as yf
import pandas as pd
import numpy as np

print("Semua library berhasil diimpor.")

Mengambil Data Harga Saham

Sebagai contoh kita menggunakan saham BBCA.

import yfinance as yf

df = yf.download(
    "BBCA.JK",
    period="2y",
    interval="1d",
    progress=False,
    auto_adjust=True
)

Lihat beberapa baris pertama.

print(df.head())

Kolom yang biasanya tersedia:

  • Open
  • High
  • Low
  • Close
  • Volume

Visualisasi Harga

import matplotlib.pyplot as plt

plt.figure(figsize=(15,6))

plt.plot(df["Close"])

plt.title("Harga BBCA")

plt.xlabel("Tanggal")

plt.ylabel("Harga")

plt.grid(True)

plt.show()

Visualisasi awal membantu memahami pola pergerakan harga.


Membuat Moving Average

Hitung dua Moving Average.

df["MA20"] = (
    df["Close"]
    .rolling(20)
    .mean()
)

df["MA50"] = (
    df["Close"]
    .rolling(50)
    .mean()
)

Visualisasikan.

plt.figure(figsize=(15,6))

plt.plot(df["Close"], label="Close")
plt.plot(df["MA20"], label="MA20")
plt.plot(df["MA50"], label="MA50")

plt.legend()

plt.show()

Membuat Aturan Trading

Aturan sederhana:

  • BUY jika MA20 > MA50.
  • SELL jika MA20 < MA50.

Implementasi:

df["Signal"] = 0

df.loc[
    df["MA20"] > df["MA50"],
    "Signal"
] = 1

df.loc[
    df["MA20"] < df["MA50"],
    "Signal"
] = -1

Arti nilai:

NilaiKeterangan
1BUY
-1SELL
0Tidak ada sinyal

Menampilkan Sinyal

print(
    df[
        ["Close","MA20","MA50","Signal"]
    ].tail()
)

Contoh hasil:

CloseMA20MA50Signal
9150902089501
9180904589651
905090009020-1

Menentukan Posisi

Kita hanya ingin mengetahui apakah sedang memegang saham atau tidak.

df["Position"] = (
    df["Signal"]
    .replace(-1,0)
    .ffill()
)

Interpretasi:

PositionArti
1Sedang memiliki saham
0Tidak memiliki posisi

Menghitung Return Harian

df["Return"] = (
    df["Close"]
    .pct_change()
)

Return strategi:

df["Strategy"] = (
    df["Return"]
    *
    df["Position"].shift(1)
)

Dengan cara ini, return hanya dihitung ketika strategi sedang berada pada posisi beli.


Menghitung Performa Strategi

Return kumulatif:

df["Cumulative Market"] = (
    1 + df["Return"]
).cumprod()

df["Cumulative Strategy"] = (
    1 + df["Strategy"]
).cumprod()

Visualisasikan.

plt.figure(figsize=(15,6))

plt.plot(
    df["Cumulative Market"],
    label="Buy & Hold"
)

plt.plot(
    df["Cumulative Strategy"],
    label="Strategy"
)

plt.legend()

plt.show()

Grafik ini memperlihatkan apakah strategi mampu mengungguli pendekatan Buy & Hold.


Mengapa Backtesting Penting?

Sebelum digunakan pada data nyata, setiap strategi perlu diuji menggunakan data historis.

Tujuannya:

  • Mengukur konsistensi strategi.
  • Mengetahui risiko.
  • Menghitung potensi keuntungan.
  • Mengidentifikasi kelemahan strategi.

Backtesting bukan jaminan bahwa strategi akan berhasil di masa depan, tetapi merupakan langkah penting untuk mengevaluasi logika yang digunakan.


Kesalahan Umum Pemula

Beberapa kesalahan yang sering dilakukan saat mulai belajar algorithmic trading:

  • Menggunakan terlalu banyak indikator sekaligus.
  • Tidak memperhitungkan biaya transaksi.
  • Tidak menguji strategi pada berbagai kondisi pasar.
  • Mengoptimalkan parameter secara berlebihan (overfitting).
  • Langsung menggunakan uang sungguhan tanpa backtesting dan simulasi.

Memulai dengan strategi sederhana justru akan membantu memahami konsep dasar dengan lebih baik.

Mengapa Tidak Cukup Menggunakan Moving Average?

Moving Average sangat baik untuk mengidentifikasi tren, tetapi memiliki kelemahan:

  • Sinyal sering terlambat (lagging indicator).
  • Banyak sinyal palsu saat pasar bergerak mendatar (sideways).
  • Tidak menunjukkan apakah harga sudah terlalu mahal atau terlalu murah.

Karena itu, banyak trader menggabungkan Moving Average dengan indikator lain.


Menambahkan RSI (Relative Strength Index)

RSI digunakan untuk mengukur kekuatan momentum harga.

Install pustaka ta jika belum tersedia:

pip install ta

Hitung RSI:

from ta.momentum import RSIIndicator

rsi = RSIIndicator(
    close=df["Close"],
    window=14
)

df["RSI"] = rsi.rsi()

Lihat hasilnya:

print(
    df[
        ["Close","RSI"]
    ].tail()
)

Menggunakan RSI Sebagai Filter

Contoh aturan:

  • BUY jika MA20 > MA50 dan RSI < 70.
  • SELL jika MA20 < MA50 atau RSI > 70.

Implementasi:

df["Signal"] = 0

buy_condition = (
    (df["MA20"] > df["MA50"])
    &
    (df["RSI"] < 70)
)

sell_condition = (
    (df["MA20"] < df["MA50"])
    |
    (df["RSI"] > 70)
)

df.loc[buy_condition, "Signal"] = 1
df.loc[sell_condition, "Signal"] = -1

Filter seperti ini membantu mengurangi sinyal beli ketika harga sudah terlalu tinggi.


Menambahkan MACD

MACD sering digunakan untuk mengonfirmasi arah tren.

from ta.trend import MACD

macd = MACD(
    close=df["Close"]
)

df["MACD"] = macd.macd()

df["MACD_SIGNAL"] = macd.macd_signal()

Konfirmasi bullish:

buy = (
    df["MACD"] >
    df["MACD_SIGNAL"]
)

Konfirmasi bearish:

sell = (
    df["MACD"] <
    df["MACD_SIGNAL"]
)

Menggabungkan beberapa indikator dapat membantu mengurangi sinyal yang kurang berkualitas, meskipun tidak menghilangkan risiko sepenuhnya.


Menambahkan Stop Loss

Setiap strategi sebaiknya memiliki batas kerugian.

Misalnya:

  • Harga beli = Rp9.000
  • Stop Loss = 5%
stop_loss = 0.05

Harga stop:

stop_price = (
    buy_price *
    (1 - stop_loss)
)

Jika harga turun di bawah nilai tersebut, posisi ditutup.


Menambahkan Take Profit

Contoh target keuntungan:

take_profit = 0.10

Harga target:

target_price = (
    buy_price *
    (1 + take_profit)
)

Ketika harga mencapai target, posisi dapat ditutup untuk mengunci keuntungan.


Position Sizing

Selain menentukan kapan membeli, penting juga menentukan berapa besar modal yang digunakan.

Misalnya:

  • Modal = Rp100.000.000
  • Risiko maksimum per transaksi = 2%
capital = 100_000_000

risk = 0.02

Dana yang siap dipertaruhkan:

risk_amount = (
    capital * risk
)

Pendekatan ini membantu mengendalikan risiko sehingga satu transaksi tidak terlalu memengaruhi keseluruhan portofolio.


Mencatat Setiap Transaksi

Simpan histori transaksi.

trades = []

Contoh pencatatan:

trades.append({

    "Buy": buy_price,

    "Sell": sell_price,

    "Profit": profit

})

Kemudian ubah menjadi DataFrame.

trade_df = pd.DataFrame(trades)

print(trade_df)

Contoh hasil:

BuySellProfit
900094505.0%
88008600-2.3%

Riwayat ini sangat berguna untuk evaluasi strategi.


Menghitung Win Rate

Win Rate menunjukkan persentase transaksi yang menghasilkan keuntungan.

wins = len(

    trade_df[
        trade_df["Profit"] > 0
    ]

)

total = len(trade_df)

Perhitungan:

win_rate = (
    wins / total
) * 100

Contoh:

Win Rate : 68%

Win Rate tinggi belum tentu berarti strategi terbaik, tetapi dapat menjadi salah satu indikator yang berguna.


Menghitung Profit Factor

Profit Factor membandingkan total keuntungan dengan total kerugian.

gross_profit = (

    trade_df[
        trade_df["Profit"] > 0
    ]["Profit"]

).sum()
gross_loss = abs(

    trade_df[
        trade_df["Profit"] < 0
    ]["Profit"]

).sum()

Perhitungan:

profit_factor = (
    gross_profit /
    gross_loss
)

Interpretasi sederhana:

Profit FactorArti
< 1Strategi merugi
1–1.5Perlu evaluasi
> 1.5Cukup baik
> 2Sangat baik (tetap perlu diuji pada berbagai kondisi pasar)

Menghitung Maximum Drawdown

Drawdown menunjukkan penurunan terbesar dari puncak nilai portofolio.

cum = (
    1 + df["Strategy"]
).cumprod()

Nilai tertinggi sebelumnya:

peak = cum.cummax()

Drawdown:

drawdown = (
    (cum - peak)
    /
    peak
)

Nilai maksimum:

max_dd = (
    drawdown.min()
)

Contoh hasil:

Maximum Drawdown

-8.6%

Semakin kecil drawdown, umumnya semakin stabil performa strategi.


Menampilkan Titik BUY dan SELL

Grafik lebih mudah dipahami jika dilengkapi penanda transaksi.

buy = df[
    df["Signal"] == 1
]

sell = df[
    df["Signal"] == -1
]

Visualisasi:

plt.figure(figsize=(16,7))

plt.plot(
    df["Close"]
)

plt.scatter(

    buy.index,

    buy["Close"],

    marker="^",

    s=100

)

plt.scatter(

    sell.index,

    sell["Close"],

    marker="v",

    s=100

)

plt.show()

Grafik ini membantu memverifikasi apakah sinyal yang dihasilkan sudah sesuai dengan logika strategi.


Menguji Banyak Saham

Daripada hanya menggunakan BBCA, lakukan pengujian pada beberapa emiten.

tickers = [

    "BBCA.JK",

    "BBRI.JK",

    "BMRI.JK",

    "TLKM.JK"

]

Loop:

results = []

for ticker in tickers:

    print(ticker)

Kemudian simpan hasil evaluasi masing-masing saham.

Contoh:

TickerReturnWin RateDrawdown
BBCA28%70%-8%
BBRI23%66%-11%
BMRI31%72%-9%
TLKM18%61%-10%

Dengan cara ini kita dapat mengetahui apakah strategi bekerja secara konsisten pada berbagai saham.


Best Practice

Beberapa hal yang perlu diperhatikan:

  • Gunakan lebih dari satu periode pengujian (bull market, bear market, dan sideways).
  • Sertakan biaya transaksi dan slippage jika memungkinkan.
  • Pisahkan logika indikator, sinyal, dan evaluasi ke dalam fungsi yang berbeda.
  • Simpan hasil pengujian agar mudah dibandingkan.
  • Jangan memilih parameter hanya karena memberikan hasil terbaik pada satu dataset (overfitting).

Arsitektur Sistem

Sebelum mulai menulis kode, buatlah arsitektur sederhana.

                  Yahoo Finance
                        │
                        ▼
                Download Data Harga
                        │
                        ▼
              Perhitungan Indikator
                        │
                        ▼
              Trading Strategy Engine
                        │
        ┌───────────────┼───────────────┐
        ▼               ▼               ▼
  Backtesting      AI Sentiment     Risk Management
        │               │               │
        └───────────────┼───────────────┘
                        ▼
                 Trading Dashboard
                        │
                        ▼
                 Telegram Notification

Dengan desain seperti ini, setiap komponen memiliki tanggung jawab yang jelas.


Membuat Struktur Project

Daripada semua kode berada di satu file, pisahkan menjadi beberapa modul.

algo-trading/

├── app.py
├── config.py
├── data.py
├── indicators.py
├── strategy.py
├── backtest.py
├── portfolio.py
├── sentiment.py
├── telegram.py
├── dashboard.py
├── database.py
├── utils.py
├── requirements.txt
├── .env
└── data/

Penjelasan:

  • data.py → mengambil data harga.
  • indicators.py → menghitung indikator teknikal.
  • strategy.py → aturan BUY dan SELL.
  • backtest.py → evaluasi strategi.
  • portfolio.py → simulasi modal.
  • telegram.py → notifikasi.
  • dashboard.py → tampilan Streamlit.

Struktur modular memudahkan pengujian dan pengembangan fitur baru.


Menyimpan Hasil Backtesting

Daripada hanya menampilkan hasil di terminal, simpan ke database.

Menggunakan SQLite:

import sqlite3

conn = sqlite3.connect("backtest.db")

result.to_sql(
    "strategy_result",
    conn,
    if_exists="append",
    index=False
)

conn.close()

Contoh tabel:

TanggalTickerReturnWin RateDrawdown
2026-07-24BBCA28.4%70%-8.3%
2026-07-24BMRI31.1%72%-9.1%

Menyimpan histori memudahkan perbandingan antarversi strategi.


Membuat Dashboard dengan Streamlit

Install:

pip install streamlit

Contoh dashboard:

import streamlit as st

st.title("Algorithmic Trading Dashboard")

st.dataframe(result)

Tambahkan metrik utama:

st.metric(
    "Total Return",
    "28.4%"
)

st.metric(
    "Win Rate",
    "70%"
)

Dashboard akan lebih informatif dibandingkan output terminal.


Menampilkan Kurva Ekuitas

Kurva ekuitas (equity curve) menunjukkan perkembangan nilai portofolio dari waktu ke waktu.

st.line_chart(
    df["Cumulative Strategy"]
)

Jika dibandingkan dengan Buy & Hold:

chart = df[
    [
        "Cumulative Strategy",
        "Cumulative Market"
    ]
]

st.line_chart(chart)

Grafik ini membantu mengevaluasi apakah strategi benar-benar memberikan nilai tambah.


Menggabungkan AI Sentiment

Pada artikel sebelumnya kita telah membuat sistem analisis sentimen.

Sekarang gunakan hasil tersebut sebagai filter.

Contoh aturan:

  • BUY jika:
    • MA20 > MA50
    • RSI < 70
    • Sentimen AI = Positif
  • SELL jika:
    • MA20 < MA50
    • Sentimen AI = Negatif

Contoh DataFrame:

TickerTeknikalSentimenKeputusan
BBCABullishPositifBUY
BMRIBullishNetralHOLD
TLKMBearishNegatifSELL

Dengan pendekatan ini, sinyal teknikal dapat diperkaya menggunakan informasi dari berita.


Mengirim Sinyal ke Telegram

Setelah strategi menghasilkan sinyal, kirim notifikasi.

Contoh isi pesan:

📈 Trading Signal

Ticker : BBCA

Signal : BUY

Harga : Rp9.150

Moving Average : Bullish

RSI : 58

AI Sentiment : Positif

Risk Level : Rendah

Investor dapat menerima informasi penting tanpa harus membuka dashboard.


Menjalankan dengan Docker

Contoh Dockerfile:

FROM python:3.12-slim

WORKDIR /app

COPY . .

RUN pip install -r requirements.txt

CMD ["python","app.py"]

Build:

docker build -t algo-trading .

Run:

docker run -d algo-trading

Docker memastikan lingkungan pengembangan dan produksi tetap konsisten.


Deploy ke AWS EC2 atau VPS

Langkah umum:

  1. Siapkan server Linux.
  2. Install Docker.
  3. Salin proyek ke server.
  4. Jalankan menggunakan Docker Compose atau systemd.
  5. Simpan konfigurasi di file .env.
  6. Gunakan cron atau scheduler untuk menjalankan proses sesuai kebutuhan.

Bagi pengguna AWS, Anda juga dapat menjalankan aplikasi di EC2 dan mengakses dashboard melalui reverse proxy seperti Nginx.


Logging

Tambahkan logging agar aktivitas aplikasi tercatat.

import logging

logging.basicConfig(
    filename="algo.log",
    level=logging.INFO
)

logging.info("Strategy started")

Jika terjadi kesalahan:

try:

    run_strategy()

except Exception as e:

    logging.exception(e)

Log sangat membantu ketika aplikasi berjalan terus-menerus di server.


Optimasi Strategi

Setelah sistem berjalan, lakukan evaluasi secara berkala.

Beberapa parameter yang dapat diuji:

ParameterContoh
MA Cepat10, 20, 30
MA Lambat50, 100, 200
RSI14, 21
Stop Loss3%, 5%, 8%
Take Profit8%, 10%, 15%

Lakukan pengujian pada beberapa periode dan berbagai saham untuk melihat apakah strategi tetap konsisten.


Keterbatasan Algorithmic Trading

Walaupun algorithmic trading sangat membantu, ada beberapa keterbatasan:

  • Strategi yang baik pada data historis belum tentu berhasil di masa depan.
  • Data yang kurang lengkap dapat menghasilkan kesimpulan yang keliru.
  • Kondisi pasar dapat berubah sehingga parameter perlu dievaluasi secara berkala.
  • Biaya transaksi, pajak, dan slippage dapat memengaruhi hasil nyata.
  • Algoritma tidak memahami peristiwa luar biasa seperti perubahan regulasi atau kejadian geopolitik kecuali informasi tersebut dimasukkan ke dalam sistem.

Best Practice

Agar proyek mudah dikembangkan:

  • Gunakan virtual environment.
  • Pisahkan setiap komponen ke modul yang berbeda.
  • Simpan konfigurasi sensitif di .env.
  • Dokumentasikan perubahan strategi.
  • Uji strategi pada berbagai kondisi pasar.
  • Tambahkan unit test untuk fungsi-fungsi penting.
  • Simpan hasil backtesting untuk setiap versi strategi.

FAQ

Apakah algorithmic trading selalu menghasilkan keuntungan?

Tidak. Algorithmic trading membantu menerapkan aturan secara konsisten, tetapi keuntungan tetap bergantung pada kualitas strategi, kondisi pasar, dan pengelolaan risiko.

Apakah saya harus langsung membuat trading bot otomatis?

Tidak. Sebaiknya mulai dari analisis data dan backtesting. Setelah strategi benar-benar dipahami dan diuji, barulah mempertimbangkan otomatisasi sesuai aturan broker dan regulasi yang berlaku.

Apakah Python cukup cepat?

Untuk riset, analisis, dan backtesting, Python sangat memadai. Pada kebutuhan dengan frekuensi sangat tinggi (high-frequency trading), sering digunakan teknologi dan bahasa pemrograman yang lebih khusus.


Kesimpulan

Dalam tiga bagian artikel ini kita telah mempelajari dasar-dasar algorithmic trading menggunakan Python, mulai dari pengambilan data harga, perhitungan indikator teknikal, pembuatan sinyal BUY dan SELL, hingga evaluasi performa strategi.

Selanjutnya, sistem tersebut dikembangkan menjadi aplikasi yang lebih terstruktur dengan dashboard, database, notifikasi Telegram, serta integrasi analisis sentimen berbasis AI. Pendekatan ini memberikan fondasi yang baik untuk membangun platform analisis saham yang lebih lengkap.

Yang terpenting, gunakan algorithmic trading sebagai alat bantu pengambilan keputusan yang didukung oleh pengujian dan manajemen risiko yang baik, bukan sebagai jaminan keuntungan.

Similar Posts

Leave a Reply

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